@@ -11,7 +11,7 @@ import { dispose, formatError } from '../common/utils';
1111import { getNonce , IRequestMessage , WebviewViewBase } from '../common/webview' ;
1212import { ReviewManager } from '../view/reviewManager' ;
1313import { FolderRepositoryManager } from './folderRepositoryManager' ;
14- import { GithubItemStateEnum , IAccount , isTeam , reviewerId , ReviewEvent , ReviewState } from './interface' ;
14+ import { GithubItemStateEnum , IAccount , isTeam , PullRequestMergeability , reviewerId , ReviewEvent , ReviewState } from './interface' ;
1515import { PullRequestModel } from './pullRequestModel' ;
1616import { getDefaultMergeMethod } from './pullRequestOverview' ;
1717import { PullRequestView } from './pullRequestOverviewCommon' ;
@@ -75,6 +75,32 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W
7575 this . updatePullRequest ( this . _item ) ;
7676 }
7777
78+ private async updateBranch ( message : IRequestMessage < string > ) : Promise < void > {
79+ if ( this . _folderRepositoryManager . repository . state . workingTreeChanges . length > 0 || this . _folderRepositoryManager . repository . state . indexChanges . length > 0 ) {
80+ await vscode . window . showErrorMessage ( vscode . l10n . t ( 'The pull request branch cannot be updated when the there changed files in the working tree or index. Stash or commit all change and then try again.' ) , { modal : true } ) ;
81+ return this . _replyMessage ( message , { } ) ;
82+ }
83+ const mergeSucceeded = await this . _folderRepositoryManager . tryMergeBaseIntoHead ( this . _item , true ) ;
84+ if ( ! mergeSucceeded ) {
85+ this . _replyMessage ( message , { } ) ;
86+ }
87+ // The mergability of the PR doesn't update immediately. Poll.
88+ let mergability = PullRequestMergeability . Unknown ;
89+ let attemptsRemaining = 5 ;
90+ do {
91+ mergability = ( await this . _item . getMergeability ( ) ) . mergeability ;
92+ attemptsRemaining -- ;
93+ await new Promise ( c => setTimeout ( c , 1000 ) ) ;
94+ } while ( attemptsRemaining > 0 && mergability === PullRequestMergeability . Unknown ) ;
95+
96+ const result : Partial < PullRequest > = {
97+ events : await this . _item . getTimelineEvents ( ) ,
98+ mergeable : mergability ,
99+ } ;
100+ await this . refresh ( ) ;
101+ this . _replyMessage ( message , result ) ;
102+ }
103+
78104 protected async _onDidReceiveMessage ( message : IRequestMessage < any > ) {
79105 const result = await super . _onDidReceiveMessage ( message ) ;
80106 if ( result !== this . MESSAGE_UNHANDLED ) {
@@ -107,6 +133,8 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W
107133 return openPullRequestOnGitHub ( this . _item , ( this . _item as any ) . _telemetry ) ;
108134 case 'pr.checkout-default-branch' :
109135 return this . checkoutDefaultBranch ( message ) ;
136+ case 'pr.update-branch' :
137+ return this . updateBranch ( message ) ;
110138 case 'pr.re-request-review' :
111139 return this . reRequestReview ( message ) ;
112140 }
0 commit comments