package org.jenkinsci.plugins.ghprb.upstream;
import hudson.Extension;
import hudson.Launcher;
import hudson.model.*;
import hudson.tasks.BuildWrapper;
import org.jenkinsci.plugins.ghprb.extensions.comments.GhprbBuildResultMessage;
import org.kohsuke.github.GHCommitState;
import org.kohsuke.stapler.DataBoundConstructor;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
* @author Kevin Suwala
*/
public class GhprbUpstreamStatus extends BuildWrapper {
private final Boolean showMatrixStatus;
private final String commitStatusContext;
private final String triggeredStatus;
private final String startedStatus;
private final String statusUrl;
private final Boolean addTestResults;
private final List<GhprbBuildResultMessage> completedStatus;
// sets the context and message as env vars so that they are available in the Listener class
@Override
public void makeBuildVariables(@SuppressWarnings("rawtypes") AbstractBuild build, Map<String,String> variables){
variables.put("ghprbShowMatrixStatus",Boolean.toString(getShowMatrixStatus()));
variables.put("ghprbUpstreamStatus", "true");
variables.put("ghprbCommitStatusContext", getCommitStatusContext());
variables.put("ghprbTriggeredStatus", getTriggeredStatus());
variables.put("ghprbStartedStatus", getStartedStatus());
variables.put("ghprbStatusUrl", getStatusUrl());
variables.put("ghprbAddTestResults", Boolean.toString(getAddTestResults()));
Map<GHCommitState, StringBuilder> statusMessages = new HashMap<GHCommitState, StringBuilder>(5);
for (GhprbBuildResultMessage message : getCompletedStatus()) {
GHCommitState state = message.getResult();
StringBuilder sb;
if (!statusMessages.containsKey(state)) {
sb = new StringBuilder();
statusMessages.put(state, sb);
} else {
sb = statusMessages.get(state);
sb.append("\n");
}
sb.append(message.getMessage());
}
for (Entry<GHCommitState, StringBuilder> next : statusMessages.entrySet()) {
String key = String.format("ghprb%sMessage", next.getKey().name());
variables.put(key, next.getValue().toString());
}
}
@Override
@SuppressWarnings("unchecked")
public BuildWrapper.Environment setUp(@SuppressWarnings("rawtypes") AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException {
makeBuildVariables(build, build.getBuildVariables());
return new Environment(){};
}
@Override
@SuppressWarnings("unchecked")
public void preCheckout(@SuppressWarnings("rawtypes") AbstractBuild build, Launcher launcher, BuildListener listener) throws IOException, InterruptedException {
makeBuildVariables(build, build.getBuildVariables());
}
@DataBoundConstructor
public GhprbUpstreamStatus(
Boolean showMatrixStatus,
String commitStatusContext,
String statusUrl,
String triggeredStatus,
String startedStatus,
Boolean addTestResults,
List<GhprbBuildResultMessage> completedStatus
) {
this.showMatrixStatus = showMatrixStatus;
this.statusUrl = statusUrl;
this.commitStatusContext = commitStatusContext == null ? "" : commitStatusContext;
this.triggeredStatus = triggeredStatus;
this.startedStatus = startedStatus;
this.addTestResults = addTestResults;
this.completedStatus = completedStatus;
}
public String getStatusUrl() {
return statusUrl == null ? "" : statusUrl;
}
public String getCommitStatusContext() {
return commitStatusContext == null ? "" : commitStatusContext;
}
public String getStartedStatus() {
return startedStatus == null ? "" : startedStatus;
}
public String getTriggeredStatus() {
return triggeredStatus == null ? "" : triggeredStatus;
}
public Boolean getAddTestResults() {
return addTestResults == null ? Boolean.valueOf(false) : addTestResults;
}
public Boolean getShowMatrixStatus(){
return showMatrixStatus == null ? Boolean.valueOf(false) : showMatrixStatus;
}
public List<GhprbBuildResultMessage> getCompletedStatus() {
return completedStatus == null ? new ArrayList<GhprbBuildResultMessage>(0) : completedStatus;
}
@Extension
public static final class DescriptorImpl extends Descriptor<BuildWrapper> {
@Override
public String getDisplayName() {
return "Set GitHub commit status with custom context and message (Must configure upstream job using GHPRB trigger)";
}
}
}