@@ -41,8 +41,8 @@ import { ConflictModel } from './conflictGuide';
4141import { ConflictResolutionCoordinator } from './conflictResolutionCoordinator' ;
4242import { Conflict , ConflictResolutionModel } from './conflictResolutionModel' ;
4343import { CredentialStore } from './credentials' ;
44- import { GitHubRepository , GraphQLError , GraphQLErrorType , ItemsData , PullRequestData , TeamReviewerRefreshKind , ViewerPermission } from './githubRepository' ;
45- import { MergeMethod as GraphQLMergeMethod , MergePullRequestInput , MergePullRequestResponse , PullRequestState , UserResponse } from './graphql' ;
44+ import { GitHubRepository , GraphQLError , GraphQLErrorType , IMetadata , ItemsData , PULL_REQUEST_PAGE_SIZE , PullRequestData , TeamReviewerRefreshKind , ViewerPermission } from './githubRepository' ;
45+ import { MergeMethod as GraphQLMergeMethod , MergePullRequestInput , MergePullRequestResponse , PullRequestResponse , PullRequestState , UserResponse } from './graphql' ;
4646import { IAccount , ILabel , IMilestone , IProject , IPullRequestsPagingOptions , Issue , ITeam , MergeMethod , PRType , PullRequestMergeability , RepoAccessAndMergeMethods , User } from './interface' ;
4747import { IssueModel } from './issueModel' ;
4848import { PullRequestGitHelper , PullRequestMetadata } from './pullRequestGitHelper' ;
@@ -51,7 +51,9 @@ import {
5151 convertRESTIssueToRawPullRequest ,
5252 convertRESTPullRequestToRawPullRequest ,
5353 getOverrideBranch ,
54+ getPRFetchQuery ,
5455 loginComparator ,
56+ parseGraphQLPullRequest ,
5557 parseGraphQLTimelineEvents ,
5658 parseGraphQLUser ,
5759 teamComparator ,
@@ -1085,7 +1087,7 @@ export class FolderRepositoryManager extends Disposable {
10851087 if ( type === PRType . All ) {
10861088 return githubRepository . getAllPullRequests ( pageNumber ) ;
10871089 } else {
1088- return githubRepository . getPullRequestsForCategory ( resolvedQuery || '' , pageNumber ) ;
1090+ return this . getPullRequestsForCategory ( githubRepository , resolvedQuery || '' , pageNumber ) ;
10891091 }
10901092 }
10911093 case PagedDataType . IssueSearch : {
@@ -1146,6 +1148,85 @@ export class FolderRepositoryManager extends Disposable {
11461148 } ;
11471149 }
11481150
1151+ async getPullRequestsForCategory ( githubRepository : GitHubRepository , categoryQuery : string , page ?: number ) : Promise < PullRequestData | undefined > {
1152+ let repo : IMetadata | undefined ;
1153+ try {
1154+ Logger . debug ( `Fetch pull request category ${ categoryQuery } - enter` , this . id ) ;
1155+ const { octokit, query, schema } = await githubRepository . ensure ( ) ;
1156+
1157+ const user = await githubRepository . getAuthenticatedUser ( ) ;
1158+ // Search api will not try to resolve repo that redirects, so get full name first
1159+ repo = await githubRepository . getMetadata ( ) ;
1160+ const { data, headers } = await octokit . call ( octokit . api . search . issuesAndPullRequests , {
1161+ q : getPRFetchQuery ( user , categoryQuery ) ,
1162+ per_page : PULL_REQUEST_PAGE_SIZE ,
1163+ page : page || 1 ,
1164+ } ) ;
1165+
1166+ const promises : Promise < { data : PullRequestResponse , repo : GitHubRepository } | undefined > [ ] = data . items . map ( async ( item ) => {
1167+ const protocol = new Protocol ( item . repository_url ) ;
1168+
1169+ const prRepo = await this . createGitHubRepositoryFromOwnerName ( protocol . owner , protocol . repositoryName ) ;
1170+ const { data } = await query < PullRequestResponse > ( {
1171+ query : schema . PullRequest ,
1172+ variables : {
1173+ owner : prRepo . remote . owner ,
1174+ name : prRepo . remote . repositoryName ,
1175+ number : item . number
1176+ }
1177+ } ) ;
1178+ return { data, repo : prRepo } ;
1179+ } ) ;
1180+
1181+ const hasMorePages = ! ! headers . link && headers . link . indexOf ( 'rel="next"' ) > - 1 ;
1182+ const pullRequestResponses = await Promise . all ( promises ) ;
1183+
1184+ const pullRequests = pullRequestResponses
1185+ . map ( response => {
1186+ if ( ! response ?. data . repository ) {
1187+ Logger . appendLine ( 'Pull request doesn\'t appear to exist.' , this . id ) ;
1188+ return null ;
1189+ }
1190+
1191+ // Pull requests fetched with a query can be from any repo.
1192+ // We need to use the correct GitHubRepository for this PR.
1193+ return response . repo . createOrUpdatePullRequestModel (
1194+ parseGraphQLPullRequest ( response . data . repository . pullRequest , response . repo ) ,
1195+ ) ;
1196+ } )
1197+ . filter ( item => item !== null ) as PullRequestModel [ ] ;
1198+
1199+ Logger . debug ( `Fetch pull request category ${ categoryQuery } - done` , this . id ) ;
1200+
1201+ return {
1202+ items : pullRequests ,
1203+ hasMorePages,
1204+ totalCount : data . total_count
1205+ } ;
1206+ } catch ( e ) {
1207+ Logger . error ( `Fetching pull request with query failed: ${ e } ` , this . id ) ;
1208+ if ( e . code === 404 ) {
1209+ // not found
1210+ vscode . window . showWarningMessage (
1211+ `Fetching pull requests for remote ${ githubRepository . remote . remoteName } with query failed, please check if the repo ${ repo ?. full_name } is valid.` ,
1212+ ) ;
1213+ } else {
1214+ throw e ;
1215+ }
1216+ }
1217+ return undefined ;
1218+ }
1219+
1220+ isPullRequestAssociatedWithOpenRepository ( pullRequest : PullRequestModel ) : boolean {
1221+ const remote = pullRequest . githubRepository . remote ;
1222+ const repository = this . repository . state . remotes . find ( repo => repo . name === remote . remoteName ) ;
1223+ if ( repository ) {
1224+ return true ;
1225+ }
1226+
1227+ return false ;
1228+ }
1229+
11491230 async getPullRequests (
11501231 type : PRType ,
11511232 options : IPullRequestsPagingOptions = { fetchNextPage : false } ,
0 commit comments