Ejemplo n.º 1
0
        /// <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;
            }
        }