Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit b32cb7d

Browse files
authored
Merge pull request #1572 from github/fixes/cancel-pr-review
Add the ability to cancel a Pull Request review.
2 parents b4cf1d0 + 06cfa75 commit b32cb7d

File tree

13 files changed

+246
-23
lines changed

13 files changed

+246
-23
lines changed

appveyor.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: '2.4.4.{build}'
1+
version: '2.4.99.{build}'
22
skip_tags: true
33
install:
44
- ps: |

src/GitHub.App/SampleData/PullRequestReviewAuthoringViewModelDesigner.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public PullRequestReviewAuthoringViewModelDesigner()
4848
public IPullRequestModel PullRequestModel { get; set; }
4949
public string RemoteRepositoryOwner { get; set; }
5050
public ReactiveCommand<Unit> Submit { get; }
51+
public ReactiveCommand<Unit> Cancel { get; }
5152

5253
public Task InitializeAsync(
5354
ILocalRepositoryModel localRepository,

src/GitHub.App/ViewModels/GitHubPane/PullRequestReviewAuthoringViewModel.cs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public PullRequestReviewAuthoringViewModel(
5858

5959
Files = files;
6060
Submit = ReactiveCommand.CreateAsyncTask(DoSubmit);
61+
Cancel = ReactiveCommand.CreateAsyncTask(DoCancel);
6162
}
6263

6364
/// <inheritdoc/>
@@ -112,6 +113,7 @@ public IReadOnlyList<IPullRequestReviewFileCommentViewModel> FileComments
112113

113114
public ReactiveCommand<object> NavigateToPullRequest { get; }
114115
public ReactiveCommand<Unit> Submit { get; }
116+
public ReactiveCommand<Unit> Cancel { get; }
115117

116118
public async Task InitializeAsync(
117119
ILocalRepositoryModel localRepository,
@@ -259,5 +261,29 @@ async Task DoSubmit(object arg)
259261
IsBusy = false;
260262
}
261263
}
264+
265+
async Task DoCancel(object arg)
266+
{
267+
OperationError = null;
268+
IsBusy = true;
269+
270+
try
271+
{
272+
if (Model?.Id != 0)
273+
{
274+
await session.CancelReview();
275+
}
276+
277+
Close();
278+
}
279+
catch (Exception ex)
280+
{
281+
OperationError = ex.Message;
282+
}
283+
finally
284+
{
285+
IsBusy = false;
286+
}
287+
}
262288
}
263289
}

src/GitHub.Exports.Reactive/Services/IPullRequestSession.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ Task<IPullRequestReviewCommentModel> PostReviewComment(
122122
/// </summary>
123123
Task<IPullRequestReviewModel> StartReview();
124124

125+
/// <summary>
126+
/// Cancels the currently pending review.
127+
/// </summary>
128+
/// <exception cref="InvalidOperationException">
129+
/// There is no pending review.
130+
/// </exception>
131+
Task CancelReview();
132+
125133
/// <summary>
126134
/// Posts the currently pending review.
127135
/// </summary>

src/GitHub.Exports.Reactive/ViewModels/GitHubPane/IPullRequestReviewAuthoringViewModel.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,11 @@ public interface IPullRequestReviewAuthoringViewModel : IPanePageViewModel, IDis
7272
/// </summary>
7373
ReactiveCommand<Unit> Submit { get; }
7474

75+
/// <summary>
76+
/// Gets a command which cancels the review.
77+
/// </summary>
78+
ReactiveCommand<Unit> Cancel { get; }
79+
7580
/// <summary>
7681
/// Initializes the view model for creating a new review.
7782
/// </summary>

src/GitHub.InlineReviews/Services/IPullRequestSessionService.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,14 @@ Task<IPullRequestReviewModel> CreatePendingReview(
181181
IAccount user,
182182
string pullRequestId);
183183

184+
/// <summary>
185+
/// Cancels a pending review on the server.
186+
/// </summary>
187+
/// <param name="reviewId">The GraphQL ID of the review.</param>
188+
Task CancelPendingReview(
189+
ILocalRepositoryModel localRepository,
190+
string reviewId);
191+
184192
/// <summary>
185193
/// Posts PR review with no comments.
186194
/// </summary>

src/GitHub.InlineReviews/Services/PullRequestSession.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,26 @@ public async Task<IPullRequestReviewModel> StartReview()
213213
return model;
214214
}
215215

216+
/// <inheritdoc/>
217+
public async Task CancelReview()
218+
{
219+
if (!HasPendingReview)
220+
{
221+
throw new InvalidOperationException("There is no pending review to cancel.");
222+
}
223+
224+
await service.CancelPendingReview(LocalRepository, pendingReviewNodeId);
225+
226+
PullRequest.Reviews = PullRequest.Reviews
227+
.Where(x => x.NodeId != pendingReviewNodeId)
228+
.ToList();
229+
PullRequest.ReviewComments = PullRequest.ReviewComments
230+
.Where(x => x.PullRequestReviewId != PendingReviewId)
231+
.ToList();
232+
233+
await Update(PullRequest);
234+
}
235+
216236
/// <inheritdoc/>
217237
public async Task<IPullRequestReviewModel> PostReview(string body, Octokit.PullRequestReviewEvent e)
218238
{

src/GitHub.InlineReviews/Services/PullRequestSessionService.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,26 @@ public async Task<IPullRequestReviewModel> CreatePendingReview(
349349
return result;
350350
}
351351

352+
/// <inheritdoc/>
353+
public async Task CancelPendingReview(
354+
ILocalRepositoryModel localRepository,
355+
string reviewId)
356+
{
357+
var address = HostAddress.Create(localRepository.CloneUrl.Host);
358+
var graphql = await graphqlFactory.CreateConnection(address);
359+
360+
var delete = new DeletePullRequestReviewInput
361+
{
362+
PullRequestReviewId = reviewId,
363+
};
364+
365+
var deleteReview = new Mutation()
366+
.DeletePullRequestReview(delete)
367+
.Select(x => x.ClientMutationId);
368+
369+
await graphql.Run(deleteReview);
370+
}
371+
352372
/// <inheritdoc/>
353373
public async Task<IPullRequestReviewModel> PostReview(
354374
ILocalRepositoryModel localRepository,

src/GitHub.VisualStudio/Views/GitHubPane/PullRequestReviewAuthoringView.xaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@
7474
</ui:DropDownButton.DropDownContent>
7575
</ui:DropDownButton>
7676
<Rectangle Fill="{DynamicResource GitHubHeaderSeparatorBrush}" Width="1" Height="16" Margin="4 0"/>
77-
<ui:GitHubActionLink VerticalAlignment="Center">Cancel</ui:GitHubActionLink>
77+
<ui:GitHubActionLink Command="{Binding Cancel}" VerticalAlignment="Center">Cancel</ui:GitHubActionLink>
7878
</StackPanel>
7979

8080
<TextBox Grid.Column="0"

src/GitHub.VisualStudio/source.extension.vsixmanifest

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
33
<Metadata>
4-
<Identity Id="c3d3dc68-c977-411f-b3e8-03b0dccf7dfc" Version="2.4.4.0" Language="en-US" Publisher="GitHub, Inc" />
4+
<Identity Id="c3d3dc68-c977-411f-b3e8-03b0dccf7dfc" Version="2.4.99.0" Language="en-US" Publisher="GitHub, Inc" />
55
<DisplayName>GitHub Extension for Visual Studio</DisplayName>
66
<Description xml:space="preserve">A Visual Studio Extension that brings the GitHub Flow into Visual Studio.</Description>
77
<PackageId>GitHub.VisualStudio</PackageId>
@@ -39,4 +39,4 @@
3939
<Prerequisites>
4040
<Prerequisite Id="Microsoft.VisualStudio.Component.CoreEditor" Version="[15.0.25824.0,16.0)" DisplayName="Visual Studio core editor" />
4141
</Prerequisites>
42-
</PackageManifest>
42+
</PackageManifest>

0 commit comments

Comments
 (0)