
These tags are preserved by the Closure compiler and vulcanize in order to serve the license notices embedded in the outputs. In a standalone Gerrit server, these license are also covered in the LICENSES.txt served with the documentation. When serving PG assets from a CDN, it's less obvious what the corresponding LICENSES.txt file is, since the CDN is not directly linked to a running Gerrit server. Safer to embed the licenses in the assets themselves. Change-Id: Id1add1451fad1baa7916882a6bda02c326ccc988
323 lines
8.4 KiB
JavaScript
323 lines
8.4 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright (C) 2017 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
(function() {
|
|
'use strict';
|
|
|
|
const STATES = {
|
|
active: {value: 'ACTIVE', label: 'Active'},
|
|
readOnly: {value: 'READ_ONLY', label: 'Read Only'},
|
|
hidden: {value: 'HIDDEN', label: 'Hidden'},
|
|
};
|
|
|
|
const SUBMIT_TYPES = {
|
|
// Exclude INHERIT, which is handled specially.
|
|
mergeIfNecessary: {
|
|
value: 'MERGE_IF_NECESSARY',
|
|
label: 'Merge if necessary',
|
|
},
|
|
fastForwardOnly: {
|
|
value: 'FAST_FORWARD_ONLY',
|
|
label: 'Fast forward only',
|
|
},
|
|
rebaseAlways: {
|
|
value: 'REBASE_ALWAYS',
|
|
label: 'Rebase Always',
|
|
},
|
|
rebaseIfNecessary: {
|
|
value: 'REBASE_IF_NECESSARY',
|
|
label: 'Rebase if necessary',
|
|
},
|
|
mergeAlways: {
|
|
value: 'MERGE_ALWAYS',
|
|
label: 'Merge always',
|
|
},
|
|
cherryPick: {
|
|
value: 'CHERRY_PICK',
|
|
label: 'Cherry pick',
|
|
},
|
|
};
|
|
|
|
Polymer({
|
|
is: 'gr-repo',
|
|
|
|
properties: {
|
|
params: Object,
|
|
repo: String,
|
|
|
|
_configChanged: {
|
|
type: Boolean,
|
|
value: false,
|
|
},
|
|
_loading: {
|
|
type: Boolean,
|
|
value: true,
|
|
},
|
|
_loggedIn: {
|
|
type: Boolean,
|
|
value: false,
|
|
observer: '_loggedInChanged',
|
|
},
|
|
/** @type {?} */
|
|
_repoConfig: Object,
|
|
_readOnly: {
|
|
type: Boolean,
|
|
value: true,
|
|
},
|
|
_states: {
|
|
type: Array,
|
|
value() {
|
|
return Object.values(STATES);
|
|
},
|
|
},
|
|
_submitTypes: {
|
|
type: Array,
|
|
value() {
|
|
return Object.values(SUBMIT_TYPES);
|
|
},
|
|
},
|
|
_schemes: {
|
|
type: Array,
|
|
value() { return []; },
|
|
computed: '_computeSchemes(_schemesObj)',
|
|
observer: '_schemesChanged',
|
|
},
|
|
_selectedCommand: {
|
|
type: String,
|
|
value: 'Clone',
|
|
},
|
|
_selectedScheme: String,
|
|
_schemesObj: Object,
|
|
_noteDbEnabled: {
|
|
type: Boolean,
|
|
value: false,
|
|
},
|
|
},
|
|
|
|
observers: [
|
|
'_handleConfigChanged(_repoConfig.*)',
|
|
],
|
|
|
|
attached() {
|
|
this._loadRepo();
|
|
|
|
this.fire('title-change', {title: this.repo});
|
|
},
|
|
|
|
_loadRepo() {
|
|
if (!this.repo) { return Promise.resolve(); }
|
|
|
|
const promises = [];
|
|
|
|
const errFn = response => {
|
|
this.fire('page-error', {response});
|
|
};
|
|
|
|
promises.push(this._getLoggedIn().then(loggedIn => {
|
|
this._loggedIn = loggedIn;
|
|
if (loggedIn) {
|
|
this.$.restAPI.getRepoAccess(this.repo).then(access => {
|
|
if (!access) { return Promise.resolve(); }
|
|
|
|
// If the user is not an owner, is_owner is not a property.
|
|
this._readOnly = !access[this.repo].is_owner;
|
|
});
|
|
}
|
|
}));
|
|
|
|
promises.push(this.$.restAPI.getProjectConfig(this.repo, errFn)
|
|
.then(config => {
|
|
if (!config) { return Promise.resolve(); }
|
|
|
|
if (config.default_submit_type) {
|
|
// The gr-select is bound to submit_type, which needs to be the
|
|
// *configured* submit type. When default_submit_type is
|
|
// present, the server reports the *effective* submit type in
|
|
// submit_type, so we need to overwrite it before storing the
|
|
// config in this.
|
|
config.submit_type =
|
|
config.default_submit_type.configured_value;
|
|
}
|
|
if (!config.state) {
|
|
config.state = STATES.active.value;
|
|
}
|
|
this._repoConfig = config;
|
|
this._loading = false;
|
|
}));
|
|
|
|
promises.push(this.$.restAPI.getConfig().then(config => {
|
|
if (!config) { return Promise.resolve(); }
|
|
|
|
this._schemesObj = config.download.schemes;
|
|
this._noteDbEnabled = !!config.note_db_enabled;
|
|
}));
|
|
|
|
return Promise.all(promises);
|
|
},
|
|
|
|
_computeLoadingClass(loading) {
|
|
return loading ? 'loading' : '';
|
|
},
|
|
|
|
_computeDownloadClass(schemes) {
|
|
return !schemes || !schemes.length ? 'hideDownload' : '';
|
|
},
|
|
|
|
_loggedInChanged(_loggedIn) {
|
|
if (!_loggedIn) { return; }
|
|
this.$.restAPI.getPreferences().then(prefs => {
|
|
if (prefs.download_scheme) {
|
|
// Note (issue 5180): normalize the download scheme with lower-case.
|
|
this._selectedScheme = prefs.download_scheme.toLowerCase();
|
|
}
|
|
});
|
|
},
|
|
|
|
_formatBooleanSelect(item) {
|
|
if (!item) { return; }
|
|
let inheritLabel = 'Inherit';
|
|
if (!(item.inherited_value === undefined)) {
|
|
inheritLabel = `Inherit (${item.inherited_value})`;
|
|
}
|
|
return [
|
|
{
|
|
label: inheritLabel,
|
|
value: 'INHERIT',
|
|
},
|
|
{
|
|
label: 'True',
|
|
value: 'TRUE',
|
|
}, {
|
|
label: 'False',
|
|
value: 'FALSE',
|
|
},
|
|
];
|
|
},
|
|
|
|
_formatSubmitTypeSelect(projectConfig) {
|
|
if (!projectConfig) { return; }
|
|
const allValues = Object.values(SUBMIT_TYPES);
|
|
const type = projectConfig.default_submit_type;
|
|
if (!type) {
|
|
// Server is too old to report default_submit_type, so assume INHERIT
|
|
// is not a valid value.
|
|
return allValues;
|
|
}
|
|
|
|
let inheritLabel = 'Inherit';
|
|
if (type.inherited_value) {
|
|
let inherited = type.inherited_value;
|
|
for (const val of allValues) {
|
|
if (val.value === type.inherited_value) {
|
|
inherited = val.label;
|
|
break;
|
|
}
|
|
}
|
|
inheritLabel = `Inherit (${inherited})`;
|
|
}
|
|
return [
|
|
{
|
|
label: inheritLabel,
|
|
value: 'INHERIT',
|
|
},
|
|
...allValues,
|
|
];
|
|
},
|
|
|
|
_isLoading() {
|
|
return this._loading || this._loading === undefined;
|
|
},
|
|
|
|
_getLoggedIn() {
|
|
return this.$.restAPI.getLoggedIn();
|
|
},
|
|
|
|
_formatRepoConfigForSave(p) {
|
|
const configInputObj = {};
|
|
for (const key in p) {
|
|
if (p.hasOwnProperty(key)) {
|
|
if (key === 'default_submit_type') {
|
|
// default_submit_type is not in the input type, and the
|
|
// configured value was already copied to submit_type by
|
|
// _loadProject. Omit this property when saving.
|
|
continue;
|
|
}
|
|
if (typeof p[key] === 'object') {
|
|
configInputObj[key] = p[key].configured_value;
|
|
} else {
|
|
configInputObj[key] = p[key];
|
|
}
|
|
}
|
|
}
|
|
return configInputObj;
|
|
},
|
|
|
|
_handleSaveRepoConfig() {
|
|
return this.$.restAPI.saveRepoConfig(this.repo,
|
|
this._formatRepoConfigForSave(this._repoConfig)).then(() => {
|
|
this._configChanged = false;
|
|
});
|
|
},
|
|
|
|
_handleConfigChanged() {
|
|
if (this._isLoading()) { return; }
|
|
this._configChanged = true;
|
|
},
|
|
|
|
_computeButtonDisabled(readOnly, configChanged) {
|
|
return readOnly || !configChanged;
|
|
},
|
|
|
|
_computeHeaderClass(configChanged) {
|
|
return configChanged ? 'edited' : '';
|
|
},
|
|
|
|
_computeSchemes(schemesObj) {
|
|
return Object.keys(schemesObj);
|
|
},
|
|
|
|
_schemesChanged(schemes) {
|
|
if (schemes.length === 0) { return; }
|
|
if (!schemes.includes(this._selectedScheme)) {
|
|
this._selectedScheme = schemes.sort()[0];
|
|
}
|
|
},
|
|
|
|
_computeCommands(repo, schemesObj, _selectedScheme) {
|
|
const commands = [];
|
|
let commandObj;
|
|
if (schemesObj.hasOwnProperty(_selectedScheme)) {
|
|
commandObj = schemesObj[_selectedScheme].clone_commands;
|
|
}
|
|
for (const title in commandObj) {
|
|
if (!commandObj.hasOwnProperty(title)) { continue; }
|
|
commands.push({
|
|
title,
|
|
command: commandObj[title]
|
|
.replace('${project}', repo)
|
|
.replace('${project-base-name}',
|
|
repo.substring(repo.lastIndexOf('/') + 1)),
|
|
});
|
|
}
|
|
return commands;
|
|
},
|
|
|
|
_computeRepositoriesClass(config) {
|
|
return config ? 'showConfig': '';
|
|
},
|
|
});
|
|
})();
|