package org.jenkinsci.plugins.github.status.sources;
import hudson.Extension;
import hudson.model.Descriptor;
import hudson.model.Run;
import hudson.model.TaskListener;
import org.apache.commons.lang3.EnumUtils;
import org.jenkinsci.plugins.github.common.ExpandableMessage;
import org.jenkinsci.plugins.github.extension.status.GitHubStatusResultSource;
import org.jenkinsci.plugins.github.extension.status.misc.ConditionalResult;
import org.kohsuke.github.GHCommitState;
import org.kohsuke.stapler.DataBoundConstructor;
import javax.annotation.Nonnull;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import static org.apache.commons.lang3.ObjectUtils.defaultIfNull;
import static org.kohsuke.github.GHCommitState.ERROR;
import static org.kohsuke.github.GHCommitState.PENDING;
/**
* Allows to define message and state for commit for different run results
*
* @author lanwen (Merkushev Kirill)
*/
public class ConditionalStatusResultSource extends GitHubStatusResultSource {
private List<ConditionalResult> results;
@DataBoundConstructor
public ConditionalStatusResultSource(List<ConditionalResult> results) {
this.results = results;
}
@Nonnull
public List<ConditionalResult> getResults() {
return defaultIfNull(results, Collections.<ConditionalResult>emptyList());
}
/**
* First matching result win. Or will be used pending state.
* Messages are expanded with token macro and env variables
*
* @return first matched result or pending state with warn msg
*/
@Override
public StatusResult get(@Nonnull Run<?, ?> run, @Nonnull TaskListener listener)
throws IOException, InterruptedException {
for (ConditionalResult conditionalResult : getResults()) {
if (conditionalResult.matches(run)) {
return new StatusResult(
defaultIfNull(EnumUtils.getEnum(GHCommitState.class, conditionalResult.getState()), ERROR),
new ExpandableMessage(conditionalResult.getMessage()).expandAll(run, listener)
);
}
}
return new StatusResult(
PENDING,
new ExpandableMessage("Can't define which status to set").expandAll(run, listener)
);
}
@Extension
public static class ConditionalStatusResultSourceDescriptor extends Descriptor<GitHubStatusResultSource> {
@Override
public String getDisplayName() {
return "Based on build result manually defined";
}
}
}