in rest-api/src/jetbrains/buildServer/server/rest/model/change/ChangeStatus.java [201:284]
private void initCounters() {
// This is heavily inspired by ChangeDetailsCalculator, but with some simplifications, so not reusing it here.
SecurityContext context = myBeanContext.getSingletonService(SecurityContext.class);
SUser self = (SUser) context.getAuthorityHolder().getAssociatedUser();
myCriticalCollector = new BuildsCollector(myFields.getNestedField("criticalBuilds"));
myCompilationErrorCollector = new BuildsCollector(myFields.getNestedField("compilationErrorBuilds"));
myNewTestsFailedCollector = new BuildsCollector(myFields.getNestedField("newTestsFailedBuilds"));
myNotCriticalCollector = new BuildsCollector(myFields.getNestedField("notCriticalBuilds"));
final boolean includePersonalBuilds = self != null && StringUtil.isTrue(self.getPropertyValue(StandardProperties.SHOW_ALL_PERSONAL_BUILDS));
for (BuildTypeChangeStatus status : myChangeStatus.getBuildTypesStatus().values()) {
final SBuild firstBuild = status.getFirstBuild();
if (firstBuild == null) {
SQueuedBuild queued = status.getQueuedBuild();
if(queued != null && (includePersonalBuilds || !queued.isPersonal())) {
myQueuedBuildsCount++;
}
if (status.getQueuedBuild() == null) {
myPendingCount++;
}
continue;
}
if(firstBuild.isPersonal() && !includePersonalBuilds) {
continue;
}
if(firstBuild.getCanceledInfo() != null) {
myCancelledCount++;
continue;
}
if (firstBuild.isFinished()) {
myFinishedBuildsCount++;
if (status.isSuccessful()) {
mySuccessfulBuildsCount++;
continue; // no need to count problems, as our build is green
}
} else {
myRunningBuildsCount++;
Status runningBuildStatus = firstBuild.getBuildStatus();
if(runningBuildStatus.isSuccessful()) {
myRunningSuccessfullyCount++;
continue; // no need to count problems, as our build is green
}
}
myFailedBuildsCount++;
String statusText = BuildStatusText.getBuildStatus(firstBuild, self);
final BuildPromotionEx buildPromo = (BuildPromotionEx) firstBuild.getBuildPromotion();
switch (statusText) {
case BuildStatusText.NEW_TESTS_FAILED:
myNewTestsFailedCollector.put(buildPromo);
break;
case BuildStatusText.CRITICAL_PROBLEM:
myCriticalCollector.put(buildPromo);
break;
default:
myNotCriticalCollector.put(buildPromo);
}
boolean compilationErrorCounted = false;
for (BuildProblem problem : buildPromo.getBuildProblems()) {
if (problem.isMutedInBuild()) continue;
final String problemType = problem.getBuildProblemData().getType();
if (BuildProblemData.TC_FAILED_TESTS_TYPE.equals(problemType) || ErrorData.isSnapshotDependencyError(problemType)) continue;
if(BuildProblemData.TC_COMPILATION_ERROR_TYPE.equals(problemType) && !compilationErrorCounted) {
myCompilationErrorCollector.put(buildPromo);
compilationErrorCounted = true;
}
myTotalProblemCount++;
}
}
}