package hudson.plugins.tfs.model; import com.fasterxml.jackson.databind.ObjectMapper; import com.microsoft.teamfoundation.sourcecontrol.webapi.model.GitCommitRef; import com.microsoft.teamfoundation.sourcecontrol.webapi.model.GitPullRequest; import com.microsoft.teamfoundation.sourcecontrol.webapi.model.GitRepository; import com.microsoft.visualstudio.services.webapi.model.IdentityRef; import hudson.model.Action; import hudson.plugins.git.GitStatus; import hudson.plugins.tfs.PullRequestParameterAction; import hudson.plugins.tfs.model.servicehooks.Event; import hudson.plugins.tfs.util.ResourceHelper; import hudson.plugins.tfs.TeamPullRequestMergedDetailsAction; import net.sf.json.JSONObject; import java.net.URI; import java.util.ArrayList; import java.util.List; public class GitPullRequestMergedEvent extends GitPushEvent { public static class Factory implements AbstractHookEvent.Factory { @Override public AbstractHookEvent create() { return new GitPullRequestMergedEvent(); } @Override public String getSampleRequestPayload() { return ResourceHelper.fetchAsString(this.getClass(), "GitPullRequestMergedEvent.json"); } } static String determineCreatedBy(final GitPullRequest gitPullRequest) { final IdentityRef createdBy = gitPullRequest.getCreatedBy(); final String result = createdBy.getDisplayName(); return result; } /* Given the following sample payload fragment: "lastMergeSourceCommit": { "commitId": "53d54ac915144006c2c9e90d2c7d3880920db49c", "url": "https://fabrikam.visualstudio.com/_apis/git/repositories/4bc14d40-c903-45e2-872e-0462c7748079/commits/53d54ac915144006c2c9e90d2c7d3880920db49c" }, "lastMergeTargetCommit": { "commitId": "a511f535b1ea495ee0c903badb68fbc83772c882", "url": "https://fabrikam.visualstudio.com/_apis/git/repositories/4bc14d40-c903-45e2-872e-0462c7748079/commits/a511f535b1ea495ee0c903badb68fbc83772c882" }, "lastMergeCommit": { "commitId": "eef717f69257a6333f221566c1c987dc94cc0d72", "url": "https://fabrikam.visualstudio.com/_apis/git/repositories/4bc14d40-c903-45e2-872e-0462c7748079/commits/eef717f69257a6333f221566c1c987dc94cc0d72" }, "commits": [ { "commitId": "53d54ac915144006c2c9e90d2c7d3880920db49c", "url": "https://fabrikam.visualstudio.com/_apis/git/repositories/4bc14d40-c903-45e2-872e-0462c7748079/commits/53d54ac915144006c2c9e90d2c7d3880920db49c" } ], ...we are assuming the user pushed `53d54a` (lastMergeSourceCommit) and Team Services attempted to merge it with `a511f5` (the tip of whatever the branch the PR is targeting, lastMergeTargetCommit), yielding `eef717f`. */ static String determineMergeCommit(final GitPullRequest gitPullRequest) { final GitCommitRef lastMergeCommit = gitPullRequest.getLastMergeCommit(); final String result = lastMergeCommit.getCommitId(); return result; } @Override public JSONObject perform(final ObjectMapper mapper, final Event serviceHookEvent, final String message, final String detailedMessage) { final Object resource = serviceHookEvent.getResource(); final GitPullRequestEx gitPullRequest = mapper.convertValue(resource, GitPullRequestEx.class); final PullRequestMergeCommitCreatedEventArgs args = decodeGitPullRequest(gitPullRequest, serviceHookEvent); final PullRequestParameterAction parameterAction = new PullRequestParameterAction(args); final Action teamPullRequestMergedDetailsAction = new TeamPullRequestMergedDetailsAction(gitPullRequest, message, detailedMessage, args.collectionUri.toString()); final ArrayList<Action> actions = new ArrayList<Action>(); actions.add(parameterAction); actions.add(teamPullRequestMergedDetailsAction); final List<GitStatus.ResponseContributor> contributors = pollOrQueueFromEvent(args, actions, true); final JSONObject response = fromResponseContributors(contributors); return response; } static PullRequestMergeCommitCreatedEventArgs decodeGitPullRequest(final GitPullRequest gitPullRequest, final Event serviceHookEvent) { final GitRepository repository = gitPullRequest.getRepository(); final URI collectionUri = determineCollectionUri(repository, serviceHookEvent); final String repoUriString = repository.getRemoteUrl(); final URI repoUri = URI.create(repoUriString); final String projectId = determineProjectId(repository); final String repoId = repository.getName(); final String commit = determineMergeCommit(gitPullRequest); final String pushedBy = determineCreatedBy(gitPullRequest); final int pullRequestId = gitPullRequest.getPullRequestId(); final PullRequestMergeCommitCreatedEventArgs args = new PullRequestMergeCommitCreatedEventArgs(); args.collectionUri = collectionUri; args.repoUri = repoUri; args.projectId = projectId; args.repoId = repoId; args.commit = commit; args.pushedBy = pushedBy; args.pullRequestId = pullRequestId; return args; } }