/// <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 async Task <PullRequestMerge> Merge(int repositoryId, int number, MergePullRequest mergePullRequest) { Ensure.ArgumentNotNull(mergePullRequest, "mergePullRequest"); try { var endpoint = ApiUrls.MergePullRequest(repositoryId, number); return(await ApiConnection.Put <PullRequestMerge>(endpoint, mergePullRequest, null, AcceptHeaders.SquashCommitPreview).ConfigureAwait(false)); } catch (ApiException ex) { if (ex.StatusCode == HttpStatusCode.MethodNotAllowed) { throw new PullRequestNotMergeableException(ex.HttpResponse); } if (ex.StatusCode == HttpStatusCode.Conflict) { throw new PullRequestMismatchException(ex.HttpResponse); } throw; } }
/// <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>An <see cref="PullRequestMerge"/> result which indicates the merge result</returns> public Task <PullRequestMerge> Merge(string owner, string name, int number, MergePullRequest mergePullRequest) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); Ensure.ArgumentNotNullOrEmptyString(name, "name"); Ensure.ArgumentNotNull(mergePullRequest, "mergePullRequest"); return(ApiConnection.Put <PullRequestMerge>(ApiUrls.MergePullRequest(owner, name, number), mergePullRequest)); }
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); }
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); }
public async Task CannotBeMerged() { 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<ApiException>(() => _fixture.Merge(Helper.UserName, _context.RepositoryName, pullRequest.Number, merge)); Assert.True(ex.ApiError.Message.StartsWith("Head branch was modified")); }
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); }
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); }
/// <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>An <see cref="PullRequestMerge"/> result which indicates the merge result</returns> public Task<PullRequestMerge> Merge(string owner, string name, int number, MergePullRequest mergePullRequest) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); Ensure.ArgumentNotNullOrEmptyString(name, "name"); Ensure.ArgumentNotNull(mergePullRequest, "mergePullRequest"); return ApiConnection.Put<PullRequestMerge>(ApiUrls.MergePullRequest(owner, name, number), mergePullRequest); }
public async Task <PullRequestMerge> Merge(string owner, string name, int number, MergePullRequest mergePullRequest) { Ensure.ArgumentNotNullOrEmptyString(owner, nameof(owner)); Ensure.ArgumentNotNullOrEmptyString(name, nameof(name)); Ensure.ArgumentNotNull(mergePullRequest, nameof(mergePullRequest)); try { var endpoint = ApiUrls.MergePullRequest(owner, name, number); return(await ApiConnection.Put <PullRequestMerge>(endpoint, mergePullRequest).ConfigureAwait(false)); } catch (ApiException ex) { if (ex.StatusCode == HttpStatusCode.MethodNotAllowed) { throw new PullRequestNotMergeableException(ex.HttpResponse); } if (ex.StatusCode == HttpStatusCode.Conflict) { throw new PullRequestMismatchException(ex.HttpResponse); } throw; } }
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); }
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")); }
public async Task CanBeMergedWithSquashCommit() { 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", Squash = true }; 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); var message = commit.Commit.Message; Assert.True(result.Merged); Assert.Equal("fake title\n\nfake commit message", commit.Commit.Message); }
/// <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 async Task<PullRequestMerge> Merge(long repositoryId, int number, MergePullRequest mergePullRequest) { Ensure.ArgumentNotNull(mergePullRequest, "mergePullRequest"); try { var endpoint = ApiUrls.MergePullRequest(repositoryId, number); return await ApiConnection.Put<PullRequestMerge>(endpoint, mergePullRequest, null, AcceptHeaders.SquashCommitPreview).ConfigureAwait(false); } catch (ApiException ex) { if (ex.StatusCode == HttpStatusCode.MethodNotAllowed) { throw new PullRequestNotMergeableException(ex.HttpResponse); } if (ex.StatusCode == HttpStatusCode.Conflict) { throw new PullRequestMismatchException(ex.HttpResponse); } throw; } }
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(); } }); GoToCommitsCommand = ReactiveCommand.Create(); GoToCommitsCommand .Select(x => this.CreateViewModel<PullRequestCommitsViewModel>()) .Select(x => x.Init(RepositoryOwner, RepositoryName, Id)) .Subscribe(NavigateTo); var canGoToFiles = this.WhenAnyValue(x => x.PullRequest).Select(x => x != null); 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); }
private PullRequestMerge MergePullRequest(Octokit.PullRequest pullRequest, int issueNumber, string branchName, bool tryAgain) { var newMergePullRequest = new MergePullRequest { Message = "Merged " + pullRequest.Title }; try { var merge = _github.PullRequest.Merge(_owner, _repoName, pullRequest.Number, newMergePullRequest).Result; return merge; } catch (Exception e) { var aggregateException = e as AggregateException; if (aggregateException != null) { var apiException = aggregateException.GetBaseException() as ApiException; if (apiException != null && apiException.Message.Equals("Pull Request is not mergeable") && tryAgain) { Thread.Sleep(5000); return MergePullRequest(pullRequest, issueNumber, branchName, false); } var commentBody = string.Format("{0} <br/>Zhenbot™ was unable to merge Pull Request #{1} for {2}. Sorry about that :person_frowning:. Exception: {2}.", FallDownRobot, pullRequest.Number, branchName, e); LeaveIssueComment(issueNumber, commentBody); } throw new RobotFallDownException(); } }
/// <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>An <see cref="PullRequestMerge"/> result which indicates the merge result</returns> public async Task<PullRequestMerge> Merge(string owner, string name, int number, MergePullRequest mergePullRequest) { Ensure.ArgumentNotNullOrEmptyString(owner, "owner"); Ensure.ArgumentNotNullOrEmptyString(name, "name"); Ensure.ArgumentNotNull(mergePullRequest, "mergePullRequest"); try { return await ApiConnection.Put<PullRequestMerge>(ApiUrls.MergePullRequest(owner, name, number), mergePullRequest); } catch (ApiException ex) { if (ex.StatusCode == HttpStatusCode.MethodNotAllowed) { throw new PullRequestNotMergeableException(ex.HttpResponse); } if (ex.StatusCode == HttpStatusCode.Conflict) { throw new PullRequestMismatchException(ex.HttpResponse); } throw; } }