package hudson.plugins.tfs.util;
import hudson.model.Run;
import hudson.model.TaskListener;
import hudson.plugins.tfs.CommitParameterAction;
import hudson.plugins.tfs.PullRequestParameterAction;
import hudson.plugins.tfs.UnsupportedIntegrationAction;
import hudson.plugins.tfs.model.GitCodePushedEventArgs;
import hudson.plugins.tfs.model.PullRequestMergeCommitCreatedEventArgs;
import hudson.plugins.tfs.model.TeamGitStatus;
import javax.annotation.Nonnull;
import java.io.IOException;
import java.io.PrintStream;
import java.net.URI;
public class TeamStatus {
public static void createFromRun(@Nonnull final Run<?, ?> run, @Nonnull final TaskListener listener, final String featureDisplayName) throws IOException {
if (!UnsupportedIntegrationAction.isSupported(run, listener)) {
final PrintStream logger = listener.getLogger();
logger.print("NOTICE: ");
logger.print("You selected '");
logger.print(featureDisplayName);
logger.println("' on your Jenkins job, but this option has no effect when calling the job from the 'Jenkins Queue Job' task in TFS/Team Services.");
return;
}
final CommitParameterAction commitParameter = run.getAction(CommitParameterAction.class);
final GitCodePushedEventArgs gitCodePushedEventArgs;
final PullRequestMergeCommitCreatedEventArgs pullRequestMergeCommitCreatedEventArgs;
if (commitParameter != null) {
gitCodePushedEventArgs = commitParameter.getGitCodePushedEventArgs();
if (commitParameter instanceof PullRequestParameterAction) {
final PullRequestParameterAction prpa = (PullRequestParameterAction) commitParameter;
pullRequestMergeCommitCreatedEventArgs = prpa.getPullRequestMergeCommitCreatedEventArgs();
}
else {
pullRequestMergeCommitCreatedEventArgs = null;
}
}
else {
// TODO: try to guess based on what we _do_ have (i.e. RevisionParameterAction)
return;
}
final URI collectionUri = gitCodePushedEventArgs.collectionUri;
final TeamRestClient client = new TeamRestClient(collectionUri);
final TeamGitStatus status = TeamGitStatus.fromRun(run);
// TODO: when code is pushed and polling happens, are we sure we built against the requested commit?
if (pullRequestMergeCommitCreatedEventArgs != null) {
if (pullRequestMergeCommitCreatedEventArgs.iterationId == -1) {
client.addPullRequestStatus(pullRequestMergeCommitCreatedEventArgs, status);
}
else {
client.addPullRequestIterationStatus(pullRequestMergeCommitCreatedEventArgs, status);
}
}
if (gitCodePushedEventArgs != null) {
client.addCommitStatus(gitCodePushedEventArgs, status);
}
// TODO: we could contribute an Action to the run, recording the ID of the status we created
}
}