示例#1
0
    public async Task CannotBeMergedDueNotInMergeableState()
    {
        await CreateTheWorld();

        var master = await _github.Git.Reference.Get(Helper.UserName, _context.RepositoryName, "heads/master");

        var newMasterTree = await CreateTree(new Dictionary <string, string> {
            { "README.md", "Hello World, we meet again!" }
        });

        var masterCommit = await CreateCommit("Commit in master", newMasterTree.Sha, master.Object.Sha);

        await _github.Git.Reference.Update(Helper.UserName, _context.RepositoryName, "heads/master", new ReferenceUpdate(masterCommit.Sha));

        var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
        var pullRequest    = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);

        await Task.Delay(TimeSpan.FromSeconds(5));

        var updatedPullRequest = await _fixture.Get(Helper.UserName, _context.RepositoryName, pullRequest.Number);

        Assert.False(updatedPullRequest.Mergeable);

        var merge = new MergePullRequest {
            Sha = pullRequest.Head.Sha
        };
        var ex = await Assert.ThrowsAsync <PullRequestNotMergeableException>(() => _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge));

        Assert.True(ex.Message.Equals("Pull Request is not mergeable"));
    }
示例#2
0
        public bool MergePullRequest(int pullRequestNumber, string mergeCommitMessage)
        {
            try
            {
                var client = CreateGitHubClient();
                _logger.LogDebug("Trying to merge pull request number {pullRequestNumber}", pullRequestNumber);
                var mergePullRequestModel = new MergePullRequest()
                {
                    MergeMethod   = PullRequestMergeMethod.Merge,
                    CommitMessage = mergeCommitMessage
                };
                var pullRequestMerge = client.PullRequest.Merge(_repositoryOwner, _repositoryName, pullRequestNumber, mergePullRequestModel).Result;
                _logger.LogDebug("Pull request {pullRequestNumber} successfully merged", pullRequestNumber);
                return(true);
            }
            catch (AggregateException e) when(e.InnerExceptions.OfType <PullRequestNotMergeableException>().Any())
            {
                var ex = e.InnerExceptions.OfType <PullRequestNotMergeableException>().First();

                _logger.LogDebug("Pull request {pullRequestNumber} has not been merged because it is not mergeable. GitHub error message: {gitHubErrorMessage} {apiErrors}",
                                 pullRequestNumber,
                                 ex.Message,
                                 ex.ApiError?.Errors);
                return(false);
            }
        }
示例#3
0
        /// <inheritdoc />
        public async Task <IMessageHandler> MergePrAsync(Options options)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            if (this.GitHubClient == null)
            {
                throw new InvalidOperationException("GitHubClient Not Found");
            }

            var mpr = new MergePullRequest()
                      .WithCommitTitle(options.CommitTitle)
                      .WithCommitMessage(options.CommitMessage)
                      .WithSha(this.Sha)
                      .WithMergeMethod(options.MergeMethod);

            var result = await this.GitHubClient
                         .PullRequest
                         .Merge(options.Owner, options.Repository, options.IssueId, mpr)
                         .ConfigureAwait(false);

            this.IsMerged = result.Merged;

            return(this);
        }
示例#4
0
        public void Given_Null_Parameters_When_WithMergeMethod_Invoked_Then_It_Return_Value(PullRequestMergeMethod value, PullRequestMergeMethod expected)
        {
            var mpr = new MergePullRequest();

            var result = MergePullRequestExtensions.WithMergeMethod(mpr, value);

            result.MergeMethod.Should().Be(expected);
        }
示例#5
0
        public void Given_Null_Parameters_When_WithSha_Invoked_Then_It_Return_Value(string value, string expected)
        {
            var mpr = new MergePullRequest();

            var result = MergePullRequestExtensions.WithSha(mpr, value);

            result.Sha.Should().BeEquivalentTo(expected);
        }
示例#6
0
        public void Given_Null_Parameters_When_WithMergeMethod_Invoked_Then_It_Throws_Exception()
        {
            var mpr = new MergePullRequest();

            Action action = () => MergePullRequestExtensions.WithMergeMethod(null, PullRequestMergeMethod.Merge);

            action.Should().Throw <ArgumentNullException>();
        }
示例#7
0
        public async Task MergePullRequest(String branch, int prNum)
        {
            MergePullRequest mpr = new MergePullRequest();

            mpr.CommitMessage = String.Format("Merging branch {0} Timestamp: {1}", branch, DateTime.Now);
            mpr.CommitTitle   = String.Format("Merge pullrequest for {0}", branch);
            await session.client.Repository.PullRequest.Merge(repo.Id, prNum, mpr);
        }
示例#8
0
            public void MergesPullRequest()
            {
                var mergePullRequest = new MergePullRequest("fake commit message");
                var gitHubClient     = Substitute.For <IGitHubClient>();
                var client           = new ObservablePullRequestsClient(gitHubClient);

                client.Merge("fake", "repo", 42, mergePullRequest);

                gitHubClient.Repository.PullRequest.Received().Merge("fake", "repo", 42, mergePullRequest);
            }
示例#9
0
        public PullRequestViewModel(
            ISessionService applicationService,
            IMarkdownService markdownService,
            IActionMenuFactory actionMenuService,
            IAlertDialogFactory alertDialogFactory)
            : base(applicationService, markdownService, actionMenuService, alertDialogFactory)
        {
            this.WhenAnyValue(x => x.Id)
            .Subscribe(x => Title = "Pull Request #" + x);

            this.WhenAnyValue(x => x.PullRequest.HtmlUrl)
            .ToProperty(this, x => x.HtmlUrl, out _htmlUrl);

            var canMergeObservable = this.WhenAnyValue(x => x.PullRequest)
                                     .Select(x => x != null && !x.Merged && x.Mergeable.HasValue && x.Mergeable.Value);

            _canMerge = canMergeObservable.CombineLatest(
                this.WhenAnyValue(x => x.PushAccess), (x, y) => x && y)
                        .ToProperty(this, x => x.CanMerge);

            _commentsCount = this.WhenAnyValue(x => x.Issue.Comments, x => x.Comments.Count, (x, y) => x + y)
                             .ToProperty(this, x => x.CommentCount);

            MergeCommand = ReactiveCommand.CreateAsyncTask(canMergeObservable, async t => {
                using (alertDialogFactory.Activate("Merging..."))
                {
                    var req = new MergePullRequest {
                        Message = MergeComment
                    };
                    var response = await applicationService.GitHubClient.PullRequest.Merge(RepositoryOwner, RepositoryName, Id, req);
                    if (!response.Merged)
                    {
                        throw new Exception(string.Format("Unable to merge pull request: {0}", response.Message));
                    }
                    await LoadCommand.ExecuteAsync();
                }
            });

            var canGoToCommits = this.WhenAnyValue(x => x.PullRequest.Commits).Select(x => x > 0);

            GoToCommitsCommand = ReactiveCommand.Create(canGoToCommits);
            GoToCommitsCommand
            .Select(x => this.CreateViewModel <PullRequestCommitsViewModel>())
            .Select(x => x.Init(RepositoryOwner, RepositoryName, Id))
            .Subscribe(NavigateTo);

            var canGoToFiles = this.WhenAnyValue(x => x.PullRequest.ChangedFiles).Select(x => x > 0);

            GoToFilesCommand = ReactiveCommand.Create(canGoToFiles);
            GoToFilesCommand
            .Select(x => this.CreateViewModel <PullRequestFilesViewModel>())
            .Select(x => x.Init(RepositoryOwner, RepositoryName, Id, PullRequest.Head.Sha))
            .Do(x => x.CommentCreated.Subscribe(AddComment))
            .Subscribe(NavigateTo);
        }
示例#10
0
            public void PutsToCorrectUrl()
            {
                var mergePullRequest = new MergePullRequest("fake commit message");
                var connection       = Substitute.For <IApiConnection>();
                var client           = new PullRequestsClient(connection);

                client.Merge("fake", "repo", 42, mergePullRequest);

                connection.Received().Put <PullRequestMerge>(Arg.Is <Uri>(u => u.ToString() == "repos/fake/repo/pulls/42/merge"),
                                                             mergePullRequest);
            }
        public PullRequestMerge MergePullRequest(Repository repository, int pullRequestId)
        {
            var mergePullRequest = new MergePullRequest
            {
                MergeMethod = PullRequestMergeMethod.Squash
            };

            var mergePullRequestTask = octoClient.PullRequest.Merge(repository.Id, pullRequestId, mergePullRequest);

            return(mergePullRequestTask.Result);
        }
示例#12
0
        /// <summary>
        /// Adds <see cref="PullRequestMergeMethod"/> value to PR merge request.
        /// </summary>
        /// <param name="value"><see cref="MergePullRequest"/> instance.</param>
        /// <param name="mergeMethod"><see cref="PullRequestMergeMethod"/> value.</param>
        /// <returns>Returns the <see cref="MergePullRequest"/> instance.</returns>
        public static MergePullRequest WithMergeMethod(this MergePullRequest value, PullRequestMergeMethod mergeMethod)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            value.MergeMethod = mergeMethod;

            return(value);
        }
示例#13
0
        /// <summary>
        /// Adds commit message to PR merge request.
        /// </summary>
        /// <param name="value"><see cref="MergePullRequest"/> instance.</param>
        /// <param name="commitMessage">Commit message.</param>
        /// <returns>Returns the <see cref="MergePullRequest"/> instance.</returns>
        public static MergePullRequest WithCommitMessage(this MergePullRequest value, string commitMessage)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            value.CommitMessage = commitMessage;

            return(value);
        }
示例#14
0
        public async Task <PullRequestMerge> MergePR(long repo, int issueNum, string commitMessage, string?commitTitle)
        {
            var request = new MergePullRequest()
            {
                CommitMessage = commitMessage,
                CommitTitle   = commitTitle,
                MergeMethod   = PullRequestMergeMethod.Merge
            };

            return(await client.PullRequest.Merge(repo, issueNum, request));
        }
示例#15
0
    public async Task CanBeMerged()
    {
        await CreateTheWorld();

        var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
        var pullRequest    = await _fixture.Create(Helper.UserName, _repository.Name, newPullRequest);

        var merge  = new MergePullRequest("thing the thing");
        var result = await _fixture.Merge(Helper.UserName, _repository.Name, pullRequest.Number, merge);

        Assert.True(result.Merged);
    }
示例#16
0
        public PullRequestMerge MergePullRequest(Repository repository, int pullRequestId, PullRequestMergeMethod mergeMethod, string commitTitle)
        {
            var mergePullRequest = new MergePullRequest
            {
                CommitTitle = commitTitle,
                MergeMethod = mergeMethod
            };

            var mergePullRequestTask = octoClient.PullRequest.Merge(repository.Id, pullRequestId, mergePullRequest);

            return(mergePullRequestTask.Result);
        }
示例#17
0
            public void MergesPullRequestWithRepositoryId()
            {
                var mergePullRequest = new MergePullRequest {
                    CommitMessage = "fake commit message"
                };
                var gitHubClient = Substitute.For <IGitHubClient>();
                var client       = new ObservablePullRequestsClient(gitHubClient);

                client.Merge(1, 42, mergePullRequest);

                gitHubClient.Repository.PullRequest.Received().Merge(1, 42, mergePullRequest);
            }
示例#18
0
    public async Task CanBeMergedWithNoOptionalInput()
    {
        await CreateTheWorld();

        var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
        var pullRequest    = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);

        var merge  = new MergePullRequest();
        var result = await _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge);

        Assert.True(result.Merged);
    }
        private async Task <EventHandlerResult> OkCommandExecute(string commentContents, IssueCommentPayload payload)
        {
            var merge = new MergePullRequest();

            merge.CommitTitle = $"merged PR via +ok: #{payload.Issue.Number} {payload.Issue.Title}";
            var result = await GitHubClient.PullRequest.Merge(payload.Repository.Id, payload.Issue.Number, merge);

            return(result.Merged
                ? EventHandlerResult.ActionPerformed(
                       $"merged pull request #{payload.Issue.Number} {payload.Issue.Title}")
                : EventHandlerResult.PayloadError(
                       $"failed to merge pull request ${payload.Issue.Number} {payload.Issue.Title}"));
        }
            public void PutsToCorrectUrl()
            {
                var mergePullRequest = new MergePullRequest {
                    CommitMessage = "fake commit message"
                };
                var connection = Substitute.For <IApiConnection>();
                var client     = new PullRequestsClient(connection);

                client.Merge("fake", "repo", 42, mergePullRequest);

                connection.Received().Put <PullRequestMerge>(Arg.Is <Uri>(u => u.ToString() == "repos/fake/repo/pulls/42/merge"),
                                                             mergePullRequest, null, "application/vnd.github.polaris-preview+json");
            }
示例#21
0
            public void PutsToCorrectUrlWithRepositoryId()
            {
                var mergePullRequest = new MergePullRequest {
                    CommitMessage = "fake commit message"
                };
                var connection = Substitute.For <IApiConnection>();
                var client     = new PullRequestsClient(connection);

                client.Merge(1, 42, mergePullRequest);

                connection.Received()
                .Put <PullRequestMerge>(Arg.Is <Uri>(u => u.ToString() == "repositories/1/pulls/42/merge"), mergePullRequest);
            }
示例#22
0
    public async Task CanBeMergedWithShaSpecified()
    {
        await CreateTheWorld();

        var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
        var pullRequest    = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);

        var merge = new MergePullRequest {
            CommitMessage = "thing the thing", Sha = pullRequest.Head.Sha
        };
        var result = await _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge);

        Assert.True(result.Merged);
    }
示例#23
0
    public async Task UpdatesMaster()
    {
        await CreateTheWorld();

        var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
        var pullRequest    = await _fixture.Create(Helper.UserName, _repository.Name, newPullRequest);

        var merge  = new MergePullRequest("thing the thing");
        var result = await _fixture.Merge(Helper.UserName, _repository.Name, pullRequest.Number, merge);

        var master = await _client.GitDatabase.Reference.Get(Helper.UserName, _repository.Name, "heads/master");

        Assert.Equal(result.Sha, master.Object.Sha);
    }
示例#24
0
        /// <summary>
        /// Adds SHA value to PR merge request.
        /// </summary>
        /// <param name="value"><see cref="MergePullRequest"/> instance.</param>
        /// <param name="sha">SHA value.</param>
        /// <returns>Returns the <see cref="MergePullRequest"/> instance.</returns>
        public static MergePullRequest WithSha(this MergePullRequest value, string sha)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            if (string.IsNullOrWhiteSpace(sha))
            {
                throw new ArgumentNullException(nameof(sha));
            }

            value.Sha = sha;

            return(value);
        }
示例#25
0
    public async Task CannotBeMergedDueMismatchConflict()
    {
        await CreateTheWorld();

        var fakeSha = new string('f', 40);

        var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
        var pullRequest    = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);

        var merge = new MergePullRequest {
            Sha = fakeSha
        };
        var ex = await Assert.ThrowsAsync <PullRequestMismatchException>(() => _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge));

        Assert.True(ex.Message.StartsWith("Head branch was modified"));
    }
示例#26
0
    public async Task UpdatesMaster()
    {
        await CreateTheWorld();

        var newPullRequest = new NewPullRequest("a pull request", branchName, "master");
        var pullRequest    = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);

        var merge = new MergePullRequest {
            CommitMessage = "thing the thing"
        };
        var result = await _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge);

        var master = await _github.Git.Reference.Get(Helper.UserName, _context.RepositoryName, "heads/master");

        Assert.Equal(result.Sha, master.Object.Sha);
    }
示例#27
0
    public async Task CanBeMergedWithRebaseMethod()
    {
        await CreateTheWorld();

        var newPullRequest = new NewPullRequest("squash commit pull request", branchName, "master");
        var pullRequest    = await _fixture.Create(Helper.UserName, _context.RepositoryName, newPullRequest);

        var merge = new MergePullRequest {
            CommitMessage = "fake commit message", CommitTitle = "fake title", MergeMethod = PullRequestMergeMethod.Rebase
        };
        var result = await _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge);

        var commit = await _github.Repository.Commit.Get(_context.RepositoryOwner, _context.RepositoryName, result.Sha);

        Assert.True(result.Merged);
        Assert.Equal("this is a 2nd commit to merge into the pull request", commit.Commit.Message);
    }
示例#28
0
        /// <summary>
        ///     Merge a pull request
        /// </summary>
        /// <param name="pullRequestUrl">Uri of pull request to merge</param>
        /// <param name="parameters">Settings for merge</param>
        /// <returns></returns>
        public async Task MergePullRequestAsync(string pullRequestUrl, MergePullRequestParameters parameters)
        {
            (string owner, string repo, int id) = ParsePullRequestUri(pullRequestUrl);

            var mergePullRequest = new MergePullRequest
            {
                Sha         = parameters.CommitToMerge,
                MergeMethod = parameters.SquashMerge ? PullRequestMergeMethod.Squash : PullRequestMergeMethod.Merge
            };

            Octokit.PullRequest pr = await Client.PullRequest.Get(owner, repo, id);

            await Client.PullRequest.Merge(owner, repo, id, mergePullRequest);

            if (parameters.DeleteSourceBranch)
            {
                await Client.Git.Reference.Delete(owner, repo, $"heads/{pr.Head.Ref}");
            }
        }
示例#29
0
        /// <inheritdoc/>
        protected override async Task <object> CallGitHubApi(DialogContext dc, Octokit.GitHubClient gitHubClient, CancellationToken cancellationToken = default(CancellationToken))
        {
            if (Owner != null && Name != null && Number != null && MergePullRequest != null)
            {
                var ownerValue            = Owner.GetValue(dc.State);
                var nameValue             = Name.GetValue(dc.State);
                var numberValue           = Number.GetValue(dc.State);
                var mergePullRequestValue = MergePullRequest.GetValue(dc.State);
                return(await gitHubClient.Repository.PullRequest.Merge(ownerValue, nameValue, (Int32)numberValue, mergePullRequestValue).ConfigureAwait(false));
            }
            if (RepositoryId != null && Number != null && MergePullRequest != null)
            {
                var repositoryIdValue     = RepositoryId.GetValue(dc.State);
                var numberValue           = Number.GetValue(dc.State);
                var mergePullRequestValue = MergePullRequest.GetValue(dc.State);
                return(await gitHubClient.Repository.PullRequest.Merge((Int64)repositoryIdValue, (Int32)numberValue, mergePullRequestValue).ConfigureAwait(false));
            }

            throw new ArgumentNullException("Required [number,mergePullRequest] arguments missing for GitHubClient.Repository.PullRequest.Merge");
        }
        /// <summary>
        /// Merge a pull request.
        /// </summary>
        /// <remarks>http://developer.github.com/v3/pulls/#merge-a-pull-request-merge-buttontrade</remarks>
        /// <param name="owner">The owner of the repository</param>
        /// <param name="name">The name of the repository</param>
        /// <param name="number">The pull request number</param>
        /// <param name="mergePullRequest">A <see cref="MergePullRequest"/> instance describing a pull request merge</param>
        /// <returns>A <see cref="PullRequestMerge"/> result</returns>
        public IObservable<PullRequestMerge> Merge(string owner, string name, int number, MergePullRequest mergePullRequest)
        {
            Ensure.ArgumentNotNullOrEmptyString(owner, "owner");
            Ensure.ArgumentNotNullOrEmptyString(name, "name");
            Ensure.ArgumentNotNull(mergePullRequest, "mergePullRequest");

            return _client.Merge(owner, name, number, mergePullRequest).ToObservable();
        }
        /// <summary>
        /// Merge a pull request.
        /// </summary>
        /// <remarks>http://developer.github.com/v3/pulls/#merge-a-pull-request-merge-buttontrade</remarks>
        /// <param name="repositoryId">The Id of the repository</param>
        /// <param name="number">The pull request number</param>
        /// <param name="mergePullRequest">A <see cref="MergePullRequest"/> instance describing a pull request merge</param>
        public IObservable<PullRequestMerge> Merge(long repositoryId, int number, MergePullRequest mergePullRequest)
        {
            Ensure.ArgumentNotNull(mergePullRequest, "mergePullRequest");

            return _client.Merge(repositoryId, number, mergePullRequest).ToObservable();
        }
            public void MergesPullRequest()
            {
                var mergePullRequest = new MergePullRequest { CommitMessage = "fake commit message" };
                var gitHubClient = Substitute.For<IGitHubClient>();
                var client = new ObservablePullRequestsClient(gitHubClient);

                client.Merge("fake", "repo", 42, mergePullRequest);

                gitHubClient.Repository.PullRequest.Received().Merge("fake", "repo", 42, mergePullRequest);
            }
        private void BtnMergeClick(object sender, EventArgs e)
        {
            var curItem = lbxPullRequests.SelectedItem as PullRequest;
            var mergeInfo = new MergeRequestInfo
            {
                Id = curItem.Id,
                Version = curItem.Version,
                ProjectKey = curItem.DestProjectKey,
                TargetRepo = curItem.DestRepo,
            };

            //Merge
            var mergeRequest = new MergePullRequest(_settings, mergeInfo);
            var response = mergeRequest.Send();
            if (response.Success)
            {
                MessageBox.Show(_success.Text);
                StashViewPullRequestFormLoad(null, null);
            }
            else
                MessageBox.Show(string.Join(Environment.NewLine, response.Messages),
                    _error.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        /// <summary>
        /// Merge a pull request.
        /// </summary>
        /// <remarks>http://developer.github.com/v3/pulls/#merge-a-pull-request-merge-buttontrade</remarks>
        /// <param name="repositoryId">The Id of the repository</param>
        /// <param name="number">The pull request number</param>
        /// <param name="mergePullRequest">A <see cref="MergePullRequest"/> instance describing a pull request merge</param>
        public IObservable <PullRequestMerge> Merge(long repositoryId, int number, MergePullRequest mergePullRequest)
        {
            Ensure.ArgumentNotNull(mergePullRequest, nameof(mergePullRequest));

            return(_client.Merge(repositoryId, number, mergePullRequest).ToObservable());
        }
            public void PutsToCorrectUrl() 
            {
                var mergePullRequest = new MergePullRequest("fake commit message");
                var connection = Substitute.For<IApiConnection>();
                var client = new PullRequestsClient(connection);

                client.Merge("fake", "repo", 42, mergePullRequest);

                connection.Received().Put<PullRequestMerge>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/pulls/42/merge"),
                    mergePullRequest);
            }
            public void PutsToCorrectUrl()
            {
                var mergePullRequest = new MergePullRequest { CommitMessage = "fake commit message" };
                var connection = Substitute.For<IApiConnection>();
                var client = new PullRequestsClient(connection);

                client.Merge("fake", "repo", 42, mergePullRequest);

                connection.Received().Put<PullRequestMerge>(Arg.Is<Uri>(u => u.ToString() == "repos/fake/repo/pulls/42/merge"),
                    mergePullRequest,null, "application/vnd.github.polaris-preview+json");
            }