blob: 2fff5bfdb1caf1193fabf8ccae9f35554d42d50c [file] [log] [blame]
(function() {
'use strict';
const Statuses = window.Gerrit.BuildResults.Statuses;
const StatusPriorityOrder = [
Statuses.INTERNAL_ERROR, Statuses.TIMEOUT, Statuses.FAILURE,
Statuses.STATUS_UNKNOWN, Statuses.CANCELLED, Statuses.QUEUED,
Statuses.QUEUING, Statuses.WORKING, Statuses.SUCCESS
];
const HumanizedStatuses = {
// non-terminal statuses
STATUS_UNKNOWN: 'unevaluated',
QUEUING: 'in progress',
QUEUED: 'in progress',
WORKING: 'in progress',
// terminal statuses
SUCCESS: 'successful',
FAILURE: 'failed',
INTERNAL_ERROR: 'failed',
TIMEOUT: 'failed',
CANCELLED: 'unevaluated',
};
const Defs = {};
/**
* @typedef {{
* revisions: !Object<string, !Object>,
* }}
*/
Defs.Change;
/**
* @param {!Defs.Change} change The current CL.
* @param {!Object} revision The current patchset.
* @return {string|undefined}
*/
function currentRevisionSha(change, revision) {
return Object.keys(change.revisions)
.find(sha => change.revisions[sha] === revision);
}
function computeBuildResultStatuses(buildResults) {
return buildResults.reduce((accum, buildResult) => {
accum[buildResult.status] || (accum[buildResult.status] = 0);
accum[buildResult.status]++;
return accum;
}, {total: buildResults.length});
}
Polymer({
is: 'builds-chip-view',
properties: {
revision: Object,
change: Object,
// TODO(brohlfs): Implement getBuildResults based on new Rest APIs.
/** @type {function(string, (string|undefined)): !Promise<!Object>} */
getBuildResults: Function,
_buildResultStatuses: Object,
_hasBuilds: Boolean,
_status: {type: String, computed: '_computeStatus(_buildResultStatuses)'},
_statusString: {
type: String,
computed: '_computeStatusString(_status, _buildResultStatuses)'
},
_chipClasses: {type: String, computed: '_computeChipClass(_status)'},
},
observers: [
'_fetchBuildResults(change, revision, getBuildResults)',
],
/**
* @param {!Defs.Change} change The current CL.
* @param {!Object} revision The current patchset.
* @param {function(string, (string|undefined)): !Promise<!Object>}
* getBuildResults function to get build results.
*/
_fetchBuildResults(change, revision, getBuildResults) {
const repository = change['project'];
const gitSha = currentRevisionSha(change, revision);
getBuildResults(repository, gitSha).then(buildResults => {
this.set('_hasBuilds', buildResults.length > 0);
if (buildResults.length > 0) {
this.set(
'_buildResultStatuses', computeBuildResultStatuses(buildResults));
}
});
},
/**
* @param {!Object} buildResultStatuses The number of builds in each status.
* @return {string}
*/
_computeStatus(buildResultStatuses) {
return StatusPriorityOrder.find(
status => buildResultStatuses[status] > 0) ||
Statuses.STATUS_UNKNOWN;
},
/**
* @param {string} status The overall status of the build results.
* @param {!Object} buildResultStatuses The number of builds in each status.
* @return {string}
*/
_computeStatusString(status, buildResultStatuses) {
if (buildResultStatuses.total === 0) return 'No builds';
return `${buildResultStatuses[status]} of ${
buildResultStatuses.total} builds ${HumanizedStatuses[status]}`;
},
/**
* @param {string} status The overall status of the build results.
* @return {string}
*/
_computeChipClass(status) {
return `chip ${window.Gerrit.BuildResults.statusClass(status)}`;
},
});
})();