66import * as vscode from 'vscode' ;
77import { openPullRequestOnGitHub } from '../commands' ;
88import { FolderRepositoryManager } from './folderRepositoryManager' ;
9- import { GithubItemStateEnum , IAccount , isITeam , ITeam , PullRequestMergeability , reviewerId , ReviewEventEnum , ReviewState } from './interface' ;
10- import { PullRequestModel } from './pullRequestModel' ;
9+ import { GithubItemStateEnum , IAccount , isITeam , ITeam , MergeMethod , PullRequestMergeability , reviewerId , ReviewEventEnum , ReviewState } from './interface' ;
10+ import { isCopilotOnMyBehalf , PullRequestModel } from './pullRequestModel' ;
1111import { getDefaultMergeMethod } from './pullRequestOverview' ;
1212import { PullRequestView } from './pullRequestOverviewCommon' ;
1313import { isInCodespaces , parseReviewers } from './utils' ;
14- import { MergeArguments , PullRequest , ReviewType , SubmitReviewReply } from './views' ;
14+ import { MergeArguments , PullRequest , ReadyForReviewReply , ReviewType , SubmitReviewReply } from './views' ;
1515import { IComment } from '../common/comment' ;
1616import { emojify , ensureEmojis } from '../common/emoji' ;
1717import { disposeAll } from '../common/lifecycle' ;
@@ -34,6 +34,12 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W
3434 ) {
3535 super ( extensionUri ) ;
3636
37+ this . _register ( vscode . commands . registerCommand ( 'pr.readyForReview' , async ( ) => {
38+ return this . readyForReviewCommand ( ) ;
39+ } ) ) ;
40+ this . _register ( vscode . commands . registerCommand ( 'pr.readyForReviewAndMerge' , async ( context : { mergeMethod : MergeMethod } ) => {
41+ return this . readyForReviewAndMergeCommand ( context ) ;
42+ } ) ) ;
3743 this . _register ( vscode . commands . registerCommand ( 'review.approve' , ( e : { body : string } ) => this . approvePullRequestCommand ( e ) ) ) ;
3844 this . _register ( vscode . commands . registerCommand ( 'review.comment' , ( e : { body : string } ) => this . submitReviewCommand ( e ) ) ) ;
3945 this . _register ( vscode . commands . registerCommand ( 'review.requestChanges' , ( e : { body : string } ) => this . requestChangesCommand ( e ) ) ) ;
@@ -212,7 +218,7 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W
212218 this . registerPrSpecificListeners ( pullRequestModel ) ;
213219 }
214220 this . _item = pullRequestModel ;
215- const [ pullRequest , repositoryAccess , timelineEvents , requestedReviewers , branchInfo , defaultBranch , currentUser , viewerCanEdit , hasReviewDraft ] = await Promise . all ( [
221+ const [ pullRequest , repositoryAccess , timelineEvents , requestedReviewers , branchInfo , defaultBranch , currentUser , viewerCanEdit , hasReviewDraft , coAuthors ] = await Promise . all ( [
216222 this . _folderRepositoryManager . resolvePullRequest (
217223 pullRequestModel . remote . owner ,
218224 pullRequestModel . remote . repositoryName ,
@@ -226,6 +232,7 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W
226232 this . _folderRepositoryManager . getCurrentUser ( pullRequestModel . githubRepository ) ,
227233 pullRequestModel . canEdit ( ) ,
228234 pullRequestModel . validateDraftMode ( ) ,
235+ pullRequestModel . getCoAuthors ( ) ,
229236 ensureEmojis ( this . _folderRepositoryManager . context )
230237 ] ) ;
231238
@@ -308,7 +315,8 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W
308315 isDarkTheme : vscode . window . activeColorTheme . kind === vscode . ColorThemeKind . Dark ,
309316 isEnterprise : pullRequest . githubRepository . remote . isEnterprise ,
310317 hasReviewDraft,
311- currentUserReviewState : reviewState
318+ currentUserReviewState : reviewState ,
319+ isCopilotOnMyBehalf : await isCopilotOnMyBehalf ( pullRequest , currentUser , coAuthors )
312320 } ;
313321
314322 this . _postMessage ( {
@@ -457,6 +465,51 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W
457465 } ) ;
458466 }
459467
468+ private async readyForReviewCommand ( ) : Promise < void > {
469+ this . _postMessage ( {
470+ command : 'pr.readying-for-review'
471+ } ) ;
472+ try {
473+ const result = await this . _item . setReadyForReview ( ) ;
474+
475+ const readiedResult : ReadyForReviewReply = {
476+ isDraft : result . isDraft
477+ } ;
478+ await this . _postMessage ( {
479+ command : 'pr.readied-for-review' ,
480+ result : readiedResult
481+ } ) ;
482+ } catch ( e ) {
483+ vscode . window . showErrorMessage ( `Unable to set pull request ready for review. ${ formatError ( e ) } ` ) ;
484+ this . _throwError ( undefined , e . message ) ;
485+ }
486+ }
487+
488+ private async readyForReviewAndMergeCommand ( context : { mergeMethod : MergeMethod } ) : Promise < void > {
489+ this . _postMessage ( {
490+ command : 'pr.readying-for-review'
491+ } ) ;
492+ try {
493+ const [ readyResult , approveResult ] = await Promise . all ( [ this . _item . setReadyForReview ( ) , this . _item . approve ( this . _folderRepositoryManager . repository ) ] ) ;
494+ await this . _item . enableAutoMerge ( context . mergeMethod ) ;
495+ this . updateReviewers ( approveResult ) ;
496+
497+ const readiedResult : ReadyForReviewReply = {
498+ isDraft : readyResult . isDraft ,
499+ autoMerge : true ,
500+ reviewEvent : approveResult ,
501+ reviewers : this . _existingReviewers
502+ } ;
503+ await this . _postMessage ( {
504+ command : 'pr.readied-for-review' ,
505+ result : readiedResult
506+ } ) ;
507+ } catch ( e ) {
508+ vscode . window . showErrorMessage ( `Unable to set pull request ready for review. ${ formatError ( e ) } ` ) ;
509+ this . _throwError ( undefined , e . message ) ;
510+ }
511+ }
512+
460513 private async mergePullRequest (
461514 message : IRequestMessage < MergeArguments > ,
462515 ) : Promise < void > {
0 commit comments