/// <inheritdoc /> public async Task ProcessPayload(PullRequestEventPayload payload, CancellationToken cancellationToken) { if (payload == null) { throw new ArgumentNullException(nameof(payload)); } if (payload.Action != "opened") { throw new NotSupportedException(); } if (await gitHubManager.UserHasWriteAccess(payload.PullRequest.User).ConfigureAwait(false)) { return; } var allPrs = await gitHubManager.GetOpenPullRequests().ConfigureAwait(false); string result = null; foreach (var I in allPrs.Where(x => x.User.Id == payload.PullRequest.User.Id && x.Id != payload.PullRequest.Id).Select(x => x.Number)) { result = (result != null) ? result + String.Format(CultureInfo.InvariantCulture, ", #{0}", I) : String.Format(CultureInfo.InvariantCulture, "#{0}", I); } if (result != null) { await gitHubManager.CreateComment(payload.PullRequest.Number, stringLocalizer["TooManyPRs", result]).ConfigureAwait(false); await gitHubManager.Close(payload.PullRequest.Number).ConfigureAwait(false); } }
/// <summary> /// Merges a <paramref name="pullRequest"/> /// </summary> /// <param name="pullRequest">The <see cref="PullRequest"/> to merge</param> /// <param name="mergerToken">The token to use for merging</param> /// <param name="cancellationToken">The <see cref="CancellationToken"/> for the operation</param> /// <returns>A <see cref="Task"/> representing the running operation</returns> async Task MergePullRequest(PullRequest pullRequest, string mergerToken, CancellationToken cancellationToken) { var acceptedHEAD = pullRequest.Head.Sha; var startoffCommit = await repository.CreatePullRequestWorkingCommit(pullRequest, cancellationToken).ConfigureAwait(false); //run any merge handlers var workingCommit = startoffCommit; foreach (var I in componentProvider.MergeHooks) { workingCommit = await I.ModifyMerge(pullRequest, workingCommit, cancellationToken).ConfigureAwait(false); } var anyUpdate = acceptedHEAD != workingCommit; if (anyUpdate) { //force push this bitch up await repository.Push(pullRequest.Head.Repository.GitUrl, pullRequest.Head.Ref.Split(':')[1], workingCommit, mergerToken, true, cancellationToken).ConfigureAwait(false); } try { await gitHubManager.MergePullRequest(pullRequest, mergerToken).ConfigureAwait(false); } catch (Exception e2) { logger.LogError(e2, "Merge process unable to be completed!"); try { await gitHubManager.CreateComment(pullRequest.Number, stringLocalizer["MergeProcessInterruption", e2.ToString()]).ConfigureAwait(false); } catch (Exception e) { logger.LogError(e, "Unable to comment on merge process failure!"); } throw; } }