package com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.features.headline;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.readability.Lister;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.readability.Pluraliser;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.BuildViewModel;
import com.smartcodeltd.jenkinsci.plugins.buildmonitor.viewmodel.JobView;
import java.util.List;
import java.util.Set;
import static com.google.common.collect.Iterables.contains;
import static com.google.common.collect.Iterables.getLast;
import static com.google.common.collect.Lists.newArrayList;
import static com.google.common.collect.Lists.newLinkedList;
import static hudson.model.Result.FAILURE;
import static hudson.model.Result.SUCCESS;
import static hudson.model.Result.UNSTABLE;
public class HeadlineOfFailing implements CandidateHeadline {
private final JobView job;
private final HeadlineConfig config;
public HeadlineOfFailing(JobView job, HeadlineConfig config) {
this.job = job;
this.config = config;
}
@Override
public boolean isApplicableTo(JobView job) {
return contains(newArrayList(FAILURE, UNSTABLE), job.lastCompletedBuild().result());
}
@Override
public Headline asJson() {
return new Headline(text(job.lastCompletedBuild()));
}
private String text(BuildViewModel lastBuild) {
List<BuildViewModel> failedBuildsNewestToOldest = failedBuildsSince(lastBuild);
String buildsFailedSoFar = Pluraliser.pluralise(
"%s build has failed",
"%s builds have failed",
failedBuildsNewestToOldest.size()
);
BuildViewModel firstFailedBuild = failedBuildsNewestToOldest.isEmpty()
? lastBuild
: getLast(failedBuildsNewestToOldest);
return Lister.describe(
buildsFailedSoFar,
buildsFailedSoFar + " since %s committed their changes",
newLinkedList(responsibleFor(firstFailedBuild))
);
}
private List<BuildViewModel> failedBuildsSince(BuildViewModel build) {
BuildViewModel currentBuild = build;
List<BuildViewModel> failedBuilds = Lists.newArrayList();
while (! SUCCESS.equals(currentBuild.result())) {
if (! currentBuild.isRunning()) {
failedBuilds.add(currentBuild);
}
if (! currentBuild.hasPreviousBuild()) {
break;
}
currentBuild = currentBuild.previousBuild();
}
return failedBuilds;
}
private Set<String> responsibleFor(BuildViewModel build) {
return config.displayCommitters
? build.culprits()
: Sets.<String>newHashSet();
}
}