Skip to content

Commit 1e55634

Browse files
Copilotalexr00
andauthored
Fix: Enable adding Copilot as a reviewer in VS Code (#7807)
* Initial plan * Fix Copilot reviewer selection in VS Code Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com> * Show Copilot reviewer, but still can't manage copilot reviewer * Allow bot reviewers --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent d00e05c commit 1e55634

File tree

4 files changed

+31
-9
lines changed

4 files changed

+31
-9
lines changed

src/common/copilot.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,11 @@
66
import { EventType, TimelineEvent } from './timelineEvent';
77

88
export const COPILOT_SWE_AGENT = 'copilot-swe-agent';
9+
export const COPILOT_REVIEWER = 'copilot-pull-request-reviewer';
10+
export const COPILOT_REVIEWER_ID = 'BOT_kgDOCnlnWA';
911

1012
export const COPILOT_LOGINS = [
11-
'copilot-pull-request-reviewer',
13+
COPILOT_REVIEWER,
1214
COPILOT_SWE_AGENT,
1315
'Copilot'
1416
];

src/github/pullRequestModel.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1134,8 +1134,8 @@ export class PullRequestModel extends IssueModel<PullRequest> implements IPullRe
11341134
owner: remote.owner,
11351135
repo: remote.repositoryName,
11361136
pull_number: this.number,
1137-
reviewers: reviewers.filter(r => r.accountType !== AccountType.Bot).map(r => r.id),
1138-
team_reviewers: teamReviewers.map(t => t.id)
1137+
reviewers: reviewers.map(r => r.id),
1138+
team_reviewers: teamReviewers.map(t => t.id),
11391139
});
11401140

11411141
this.reviewers = this.reviewers?.filter(r => !reviewers.some(rr => rr.id === r.id) && !teamReviewers.some(t => t.id === r.id)) || [];

src/github/pullRequestOverview.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,7 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel<PullRequestMode
424424
quickPick.busy = false;
425425
const acceptPromise: Promise<(IAccount | ITeam)[]> = asPromise<void>(quickPick.onDidAccept).then(() => {
426426
const pickedReviewers: (IAccount | ITeam)[] | undefined = quickPick?.selectedItems.filter(item => item.user).map(item => item.user) as (IAccount | ITeam)[];
427-
const botReviewers = this._existingReviewers.filter(reviewer => !isITeam(reviewer.reviewer) && reviewer.reviewer.accountType === 'Bot').map(reviewer => reviewer.reviewer);
428-
return pickedReviewers.concat(botReviewers);
427+
return pickedReviewers;
429428
});
430429
const hidePromise = asPromise<void>(quickPick.onDidHide);
431430
const allReviewers = await Promise.race<(IAccount | ITeam)[] | void>([acceptPromise, hidePromise]);

src/github/quickPicks.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import { Buffer } from 'buffer';
88
import * as vscode from 'vscode';
99
import { COPILOT_ACCOUNTS } from '../common/comment';
10-
import { COPILOT_SWE_AGENT } from '../common/copilot';
10+
import { COPILOT_REVIEWER, COPILOT_REVIEWER_ID, COPILOT_SWE_AGENT } from '../common/copilot';
1111
import { emojify, ensureEmojis } from '../common/emoji';
1212
import Logger from '../common/logger';
1313
import { DataUri } from '../common/uri';
@@ -152,7 +152,6 @@ function userThemeIcon(user: IAccount | ITeam) {
152152
async function getReviewersQuickPickItems(folderRepositoryManager: FolderRepositoryManager, remoteName: string, isInOrganization: boolean, author: IAccount, existingReviewers: ReviewState[],
153153
suggestedReviewers: ISuggestedReviewer[] | undefined, refreshKind: TeamReviewerRefreshKind,
154154
): Promise<(vscode.QuickPickItem & { user?: IAccount | ITeam })[]> {
155-
existingReviewers = existingReviewers.filter(reviewer => isITeam(reviewer.reviewer) || (reviewer.reviewer.accountType !== AccountType.Bot));
156155
if (!suggestedReviewers) {
157156
return [];
158157
}
@@ -162,8 +161,17 @@ async function getReviewersQuickPickItems(folderRepositoryManager: FolderReposit
162161
const teamReviewers: ITeam[] = allTeamReviewers[remoteName] ?? [];
163162
const assignableUsers: (IAccount | ITeam)[] = [...teamReviewers];
164163

165-
// Remove the swe agent as it can't do reviews
166-
const assignableUsersForRemote = allAssignableUsers[remoteName].filter(user => user.login !== COPILOT_SWE_AGENT);
164+
// Remove the swe agent as it can't do reviews, but add the reviewer instead
165+
const originalAssignableUsers = allAssignableUsers[remoteName] ?? [];
166+
let hasCopilotSweAgent: boolean = false;
167+
const assignableUsersForRemote = originalAssignableUsers.filter(user => {
168+
if (user.login === COPILOT_SWE_AGENT) {
169+
hasCopilotSweAgent = true;
170+
return false;
171+
}
172+
return true;
173+
});
174+
167175
if (assignableUsersForRemote) {
168176
assignableUsers.push(...assignableUsersForRemote);
169177
}
@@ -181,6 +189,19 @@ async function getReviewersQuickPickItems(folderRepositoryManager: FolderReposit
181189
reviewersPromises.push(getItems<IAccount | ITeam>(folderRepositoryManager.context, skipList, existingReviewers.map(reviewer => reviewer.reviewer), true));
182190
}
183191

192+
// If we removed the coding agent, add the Copilot reviewer instead
193+
if (hasCopilotSweAgent && !existingReviewers.find(user => (user.reviewer as IAccount).login === COPILOT_REVIEWER)) {
194+
const copilotReviewer: IAccount = {
195+
login: COPILOT_REVIEWER,
196+
id: COPILOT_REVIEWER_ID,
197+
url: '',
198+
avatarUrl: '',
199+
name: COPILOT_ACCOUNTS[COPILOT_REVIEWER]?.name ?? 'Copilot',
200+
accountType: AccountType.Bot
201+
};
202+
assignableUsers.push(copilotReviewer);
203+
}
204+
184205
// Suggested reviewers
185206
reviewersPromises.push(getItems<ISuggestedReviewer>(folderRepositoryManager.context, skipList, suggestedReviewers, false));
186207

0 commit comments

Comments
 (0)