blob: 07054ae836ae0a0b6642fe0b8990388863df599d [file] [log] [blame]
'use strict';
class BuildRequest extends DataModelObject {
constructor(id, object)
{
super(id, object);
this._triggerable = object.triggerable;
console.assert(!object.repositoryGroup || object.repositoryGroup instanceof TriggerableRepositoryGroup);
this._analysisTaskId = object.task;
this._testGroupId = object.testGroupId;
console.assert(!object.testGroup || object.testGroup instanceof TestGroup);
this._testGroup = object.testGroup;
if (this._testGroup)
this._testGroup.addBuildRequest(this);
this._repositoryGroup = object.repositoryGroup;
console.assert(object.platform instanceof Platform);
this._platform = object.platform;
console.assert(!object.test || object.test instanceof Test);
this._test = object.test;
this._order = object.order;
console.assert(object.commitSet instanceof CommitSet);
this._commitSet = object.commitSet;
this._status = object.status;
this._statusUrl = object.url;
this._buildId = object.build;
this._createdAt = new Date(object.createdAt);
this._result = null;
}
updateSingleton(object)
{
console.assert(this._order == object.order);
console.assert(this._commitSet == object.commitSet);
const testGroup = object.testGroup;
console.assert(!this._testGroup || this._testGroup == testGroup);
if (!this._testGroup && testGroup)
testGroup.addBuildRequest(this);
this._testGroup = testGroup;
this._status = object.status;
this._statusUrl = object.url;
this._buildId = object.build;
}
triggerable() { return this._triggerable; }
analysisTaskId() { return this._analysisTaskId; }
testGroupId() { return this._testGroupId; }
testGroup() { return this._testGroup; }
repositoryGroup() { return this._repositoryGroup; }
platform() { return this._platform; }
test() { return this._test; }
isBuild() { return this._order < 0; }
isTest() { return this._order >= 0; }
order() { return +this._order; }
commitSet() { return this._commitSet; }
status() { return this._status; }
hasFinished() { return this._status == 'failed' || this._status == 'completed' || this._status == 'canceled'; }
hasFailed() { return this._status == 'failed'; }
hasCompleted() { return this._status == 'completed'; }
hasStarted() { return this._status != 'pending'; }
isScheduled() { return this._status == 'scheduled'; }
isPending() { return this._status == 'pending'; }
statusLabel()
{
switch (this._status) {
case 'pending':
return 'Waiting';
case 'scheduled':
return 'Scheduled';
case 'running':
return 'Running';
case 'failed':
return 'Failed';
case 'completed':
return 'Completed';
case 'canceled':
return 'Canceled';
}
}
statusUrl() { return this._statusUrl; }
buildId() { return this._buildId; }
createdAt() { return this._createdAt; }
static formatTimeInterval(intervalInMillionSeconds) {
let intervalInSeconds = intervalInMillionSeconds / 1000;
const units = [
{unit: 'week', length: 7 * 24 * 3600},
{unit: 'day', length: 24 * 3600},
{unit: 'hour', length: 3600},
{unit: 'minute', length: 60},
];
let indexOfFirstSmallEnoughUnit = units.length - 1;
for (let i = 0; i < units.length; i++) {
if (intervalInSeconds > 1.5 * units[i].length) {
indexOfFirstSmallEnoughUnit = i;
break;
}
}
let label = '';
let lastUnit = false;
for (let i = indexOfFirstSmallEnoughUnit; !lastUnit; i++) {
lastUnit = i == indexOfFirstSmallEnoughUnit + 1 || i == units.length - 1;
const length = units[i].length;
const valueForUnit = lastUnit ? Math.round(intervalInSeconds / length) : Math.floor(intervalInSeconds / length);
const unit = units[i].unit + (valueForUnit == 1 ? '' : 's');
if (label)
label += ' ';
label += `${valueForUnit} ${unit}`;
intervalInSeconds = intervalInSeconds - valueForUnit * length;
}
return label;
}
waitingTime(referenceTime)
{
return BuildRequest.formatTimeInterval(referenceTime - this.createdAt());
}
static fetchForTriggerable(triggerable)
{
return RemoteAPI.getJSONWithStatus('/api/build-requests/' + triggerable).then(function (data) {
return BuildRequest.constructBuildRequestsFromData(data);
});
}
static constructBuildRequestsFromData(data)
{
for (let rawData of data['commits']) {
rawData.repository = Repository.findById(rawData.repository);
CommitLog.ensureSingleton(rawData.id, rawData);
}
for (let uploadedFile of data['uploadedFiles'])
UploadedFile.ensureSingleton(uploadedFile.id, uploadedFile);
const commitSets = data['commitSets'].map((rawData) => {
for (const item of rawData.revisionItems) {
item.commit = CommitLog.findById(item.commit);
item.patch = item.patch ? UploadedFile.findById(item.patch) : null;
item.rootFile = item.rootFile ? UploadedFile.findById(item.rootFile) : null;
item.commitOwner = item.commitOwner ? CommitLog.findById(item.commitOwner) : null;
}
rawData.customRoots = rawData.customRoots.map((fileId) => UploadedFile.findById(fileId));
return CommitSet.ensureSingleton(rawData.id, rawData);
});
return data['buildRequests'].map(function (rawData) {
rawData.triggerable = Triggerable.findById(rawData.triggerable);
rawData.repositoryGroup = TriggerableRepositoryGroup.findById(rawData.repositoryGroup);
rawData.platform = Platform.findById(rawData.platform);
rawData.test = Test.findById(rawData.test);
rawData.testGroupId = rawData.testGroup;
rawData.testGroup = TestGroup.findById(rawData.testGroup);
rawData.commitSet = CommitSet.findById(rawData.commitSet);
return BuildRequest.ensureSingleton(rawData.id, rawData);
});
}
}
if (typeof module != 'undefined')
module.exports.BuildRequest = BuildRequest;