package hudson.plugins.svnmerge;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.Action;
import hudson.model.Job;
import hudson.model.PermalinkProjectAction;
import hudson.model.Run;
import java.util.Collections;
import java.util.List;
/**
* Project-level {@link Action} that shows the integration status on a feature branch job.
*
* <p>
* This also adds a permalink to {@link AbstractProject}.
*
* @author Kohsuke Kawaguchi
*/
public class IntegrationStatusAction implements PermalinkProjectAction {
public final AbstractProject<?,?> project;
public final FeatureBranchProperty branchProperty;
public IntegrationStatusAction(FeatureBranchProperty fbp) {
this.project = fbp.getOwner();
this.branchProperty = fbp;
}
/**
* Finds the last build that got integrated to the upstream, or else null.
*/
public AbstractBuild<?,?> getLastIntegratedBuild() {
IntegrateAction ia = getLastIntegrateAction(project);
return ia!=null ? ia.build : null;
}
public IntegrateAction getLastIntegrateAction() {
return getLastIntegrateAction(project);
}
private static IntegrateAction getLastIntegrateAction(Job<?,?> j) {
for(Run<?,?> b=j.getLastBuild(); b!=null; b=b.getPreviousBuild()) {
IntegrateAction ia = b.getAction(IntegrateAction.class);
if(ia!=null && ia.isIntegrated())
return ia;
}
return null;
}
public List<Permalink> getPermalinks() {
return PERMALINKS;
}
public String getIconFileName() {
return "/plugin/svnmerge/24x24/integrate.gif";
}
public String getDisplayName() {
return "Integration Status";
}
public String getUrlName() {
return "integration-status";
}
private static final List<Permalink> PERMALINKS = Collections.<Permalink>singletonList(new Permalink() {
public String getDisplayName() {
return "Last Integrated build";
}
@Override
public String getId() {
return "lastIntegratedBuild";
}
@Override
public Run<?,?> resolve(Job<?,?> job) {
IntegrateAction ia = getLastIntegrateAction(job);
return ia!=null ? ia.build : null;
}
});
}