Skip to content

Commit fffb33a

Browse files
Copilotalexr00
andcommitted
Add lightweight GraphQL query for PR numbers
- Created PullRequestNumbers query that fetches only number, title, and author - Added getPullRequestNumbers() method to GitHubRepository - Updated checkout command to use new lightweight query - Reverted title change in package.nls.json per feedback Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent cec928c commit fffb33a

File tree

6 files changed

+84
-10
lines changed

6 files changed

+84
-10
lines changed

package.nls.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@
210210
"command.pr.focusDescriptionInput.title": "Focus Pull Request Description Review Input",
211211
"command.pr.showDiffSinceLastReview.title": "Show Changes Since Last Review",
212212
"command.pr.showDiffAll.title": "Show All Changes",
213-
"command.pr.checkoutByNumber.title": "Checkout Pull Request...",
213+
"command.pr.checkoutByNumber.title": "Checkout Pull Request by Number",
214214
"command.review.openFile.title": "Open File",
215215
"command.review.openLocalFile.title": "Open File",
216216
"command.review.approve.title": "Approve",

src/@types/vscode.proposed.chatParticipantAdditions.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ declare module 'vscode' {
105105
isComplete?: boolean;
106106
toolSpecificData?: ChatTerminalToolInvocationData;
107107
fromSubAgent?: boolean;
108+
presentation?: 'hidden' | 'hiddenAfterComplete' | undefined;
108109

109110
constructor(toolName: string, toolCallId: string, isError?: boolean);
110111
}

src/commands.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ import { ChatSessionWithPR, CrossChatSessionWithPR } from './github/copilotApi';
2323
import { CopilotRemoteAgentManager, SessionIdForPr } from './github/copilotRemoteAgent';
2424
import { FolderRepositoryManager } from './github/folderRepositoryManager';
2525
import { GitHubRepository } from './github/githubRepository';
26-
import { Issue, PRType } from './github/interface';
26+
import { Issue } from './github/interface';
2727
import { IssueModel } from './github/issueModel';
2828
import { IssueOverviewPanel } from './github/issueOverview';
2929
import { GHPRComment, GHPRCommentThread, TemporaryComment } from './github/prComment';
@@ -1616,23 +1616,26 @@ ${contents}
16161616
let acceptDisposable: vscode.Disposable | undefined;
16171617
let hideDisposable: vscode.Disposable | undefined;
16181618

1619-
// Fetch all open PRs
1619+
// Fetch all open PRs (lightweight query)
16201620
try {
1621-
const prs = await githubRepo.manager.getPullRequests(PRType.All, { fetchNextPage: false });
1621+
const prs = await githubRepo.repo.getPullRequestNumbers();
1622+
if (!prs) {
1623+
return vscode.window.showErrorMessage(vscode.l10n.t('Failed to fetch pull requests'));
1624+
}
16221625
// Sort PRs by number in descending order (most recent first)
1623-
const sortedPRs = prs.items.sort((a, b) => b.number - a.number);
1624-
const prItems: (vscode.QuickPickItem & { pr: PullRequestModel })[] = sortedPRs.map(pr => ({
1626+
const sortedPRs = prs.sort((a, b) => b.number - a.number);
1627+
const prItems: (vscode.QuickPickItem & { prNumber: number })[] = sortedPRs.map(pr => ({
16251628
label: `#${pr.number}`,
16261629
description: pr.title,
16271630
detail: `by @${pr.author.login}`,
1628-
pr
1631+
prNumber: pr.number
16291632
}));
16301633

16311634
quickPick.items = prItems;
16321635
quickPick.busy = false;
16331636

16341637
// Handle selection
1635-
const selected = await new Promise<(vscode.QuickPickItem & { pr?: PullRequestModel }) | string | undefined>((resolve) => {
1638+
const selected = await new Promise<(vscode.QuickPickItem & { prNumber?: number }) | string | undefined>((resolve) => {
16361639
acceptDisposable = quickPick.onDidAccept(() => {
16371640
if (quickPick.selectedItems.length > 0) {
16381641
resolve(quickPick.selectedItems[0]);
@@ -1661,9 +1664,9 @@ ${contents}
16611664
return vscode.window.showErrorMessage(parseResult.errorMessage || vscode.l10n.t('Invalid pull request number or URL'));
16621665
}
16631666
prModel = await githubRepo.manager.fetchById(githubRepo.repo, parseResult.prNumber);
1664-
} else if (selected.pr) {
1667+
} else if (selected.prNumber) {
16651668
// User selected from the list
1666-
prModel = selected.pr;
1669+
prModel = await githubRepo.manager.fetchById(githubRepo.repo, selected.prNumber);
16671670
}
16681671

16691672
if (prModel) {

src/github/githubRepository.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
OrganizationTeamsCountResponse,
2828
OrganizationTeamsResponse,
2929
OrgProjectsResponse,
30+
PullRequestNumbersResponse,
3031
PullRequestParticipantsResponse,
3132
PullRequestResponse,
3233
PullRequestsResponse,
@@ -668,6 +669,40 @@ export class GitHubRepository extends Disposable {
668669
return undefined;
669670
}
670671

672+
async getPullRequestNumbers(): Promise<{ number: number; title: string; author: { login: string } }[] | undefined> {
673+
let remote: GitHubRemote | undefined;
674+
try {
675+
Logger.debug(`Fetch pull request numbers - enter`, this.id);
676+
const ensured = await this.ensure();
677+
remote = ensured.remote;
678+
const { query, schema } = ensured;
679+
const { data } = await query<PullRequestNumbersResponse>({
680+
query: schema.PullRequestNumbers,
681+
variables: {
682+
owner: remote.owner,
683+
name: remote.repositoryName,
684+
first: 100,
685+
},
686+
});
687+
Logger.debug(`Fetch pull request numbers - done`, this.id);
688+
689+
if (data?.repository?.pullRequests) {
690+
return data.repository.pullRequests.nodes;
691+
}
692+
} catch (e) {
693+
Logger.error(`Fetching pull request numbers failed: ${e}`, this.id);
694+
if (e.status === 404) {
695+
// not found
696+
vscode.window.showWarningMessage(
697+
`Fetching pull request numbers for remote '${remote?.remoteName}' failed, please check if the repository ${remote?.owner}/${remote?.repositoryName} is valid.`,
698+
);
699+
} else {
700+
throw e;
701+
}
702+
}
703+
return undefined;
704+
}
705+
671706
async getPullRequestForBranch(branch: string, headOwner: string): Promise<PullRequestModel | undefined> {
672707
let remote: GitHubRemote | undefined;
673708
try {

src/github/graphql.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -844,6 +844,20 @@ export interface PullRequestsResponse {
844844
} | null;
845845
}
846846

847+
export interface PullRequestNumbersResponse {
848+
repository: {
849+
pullRequests: {
850+
nodes: {
851+
number: number;
852+
title: string;
853+
author: {
854+
login: string;
855+
};
856+
}[]
857+
}
858+
} | null;
859+
}
860+
847861
export interface MaxIssueResponse {
848862
repository: {
849863
issues: {

src/github/queries.gql

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -763,4 +763,25 @@ mutation ReplaceActorsForAssignable($input: ReplaceActorsForAssignableInput!) {
763763
}
764764
}
765765
}
766+
}
767+
768+
fragment PullRequestNumberFragment on PullRequest {
769+
number
770+
title
771+
author {
772+
login
773+
}
774+
}
775+
776+
query PullRequestNumbers($owner: String!, $name: String!, $first: Int!) {
777+
repository(owner: $owner, name: $name) {
778+
pullRequests(first: $first, states: OPEN, orderBy: { field: CREATED_AT, direction: DESC }) {
779+
nodes {
780+
...PullRequestNumberFragment
781+
}
782+
}
783+
}
784+
rateLimit {
785+
...RateLimit
786+
}
766787
}

0 commit comments

Comments
 (0)