@@ -29,7 +29,7 @@ import { GHPRComment, GHPRCommentThread, TemporaryComment } from './github/prCom
2929import { PullRequestModel } from './github/pullRequestModel' ;
3030import { PullRequestOverviewPanel } from './github/pullRequestOverview' ;
3131import { RepositoriesManager } from './github/repositoriesManager' ;
32- import { getIssuesUrl , getPullsUrl , isInCodespaces , vscodeDevPrLink } from './github/utils' ;
32+ import { getIssuesUrl , getPullsUrl , isInCodespaces , vscodeDevPrLink , parseIssueExpressionOutput , ISSUE_OR_URL_EXPRESSION } from './github/utils' ;
3333import { isNotificationTreeItem , NotificationTreeItem } from './notifications/notificationItem' ;
3434import { PullRequestsTreeDataProvider } from './view/prsTreeDataProvider' ;
3535import { ReviewCommentController } from './view/reviewCommentController' ;
@@ -1475,19 +1475,41 @@ ${contents}
14751475 }
14761476 const prNumberMatcher = / ^ # ? ( \d * ) $ / ;
14771477 const prNumber = await vscode . window . showInputBox ( {
1478- ignoreFocusOut : true , prompt : vscode . l10n . t ( 'Enter the pull request number' ) ,
1478+ ignoreFocusOut : true , prompt : vscode . l10n . t ( 'Enter the pull request number or URL ' ) ,
14791479 validateInput : ( input : string ) => {
1480- const matches = input . match ( prNumberMatcher ) ;
1481- if ( ! matches || ( matches . length !== 2 ) || Number . isNaN ( Number ( matches [ 1 ] ) ) ) {
1482- return vscode . l10n . t ( 'Value must be a number' ) ;
1480+ const numberMatches = input . match ( prNumberMatcher ) ;
1481+ if ( numberMatches && ( numberMatches . length === 2 ) && ! Number . isNaN ( Number ( numberMatches [ 1 ] ) ) ) {
1482+ return undefined ; // Valid number
14831483 }
1484- return undefined ;
1484+
1485+ const urlMatches = input . match ( ISSUE_OR_URL_EXPRESSION ) ;
1486+ const parsed = parseIssueExpressionOutput ( urlMatches ) ;
1487+ if ( parsed && parsed . issueNumber ) {
1488+ return undefined ; // Valid URL
1489+ }
1490+
1491+ return vscode . l10n . t ( 'Value must be a pull request number or GitHub URL' ) ;
14851492 }
14861493 } ) ;
14871494 if ( ( prNumber === undefined ) || prNumber === '#' ) {
14881495 return ;
14891496 }
1490- const prModel = await githubRepo . manager . fetchById ( githubRepo . repo , Number ( prNumber . match ( prNumberMatcher ) ! [ 1 ] ) ) ;
1497+
1498+ // Extract PR number from input (either direct number or URL)
1499+ let extractedPrNumber : number ;
1500+ const numberMatches = prNumber . match ( prNumberMatcher ) ;
1501+ if ( numberMatches && ( numberMatches . length === 2 ) && ! Number . isNaN ( Number ( numberMatches [ 1 ] ) ) ) {
1502+ extractedPrNumber = Number ( numberMatches [ 1 ] ) ;
1503+ } else {
1504+ const urlMatches = prNumber . match ( ISSUE_OR_URL_EXPRESSION ) ;
1505+ const parsed = parseIssueExpressionOutput ( urlMatches ) ;
1506+ if ( ! parsed || ! parsed . issueNumber ) {
1507+ return vscode . window . showErrorMessage ( vscode . l10n . t ( 'Invalid pull request number or URL' ) ) ;
1508+ }
1509+ extractedPrNumber = parsed . issueNumber ;
1510+ }
1511+
1512+ const prModel = await githubRepo . manager . fetchById ( githubRepo . repo , extractedPrNumber ) ;
14911513 if ( prModel ) {
14921514 return ReviewManager . getReviewManagerForFolderManager ( reviewsManager . reviewManagers , githubRepo . manager ) ?. switch ( prModel ) ;
14931515 }
0 commit comments