Skip to content

Commit ec09627

Browse files
authored
Refresh whole tree view when PR is added (#7313)
1 parent 5d1d6e6 commit ec09627

File tree

5 files changed

+34
-3
lines changed

5 files changed

+34
-3
lines changed

src/github/folderRepositoryManager.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,8 @@ export class FolderRepositoryManager extends Disposable {
216216
private _onDidChangePullRequestsEvents: vscode.Disposable[] = [];
217217
private readonly _onDidChangeAnyPullRequests = this._register(new vscode.EventEmitter<IssueModel[]>());
218218
readonly onDidChangeAnyPullRequests: vscode.Event<IssueModel[]> = this._onDidChangeAnyPullRequests.event;
219+
private readonly _onDidAddPullRequest = this._register(new vscode.EventEmitter<IssueModel>());
220+
readonly onDidAddPullRequest: vscode.Event<IssueModel> = this._onDidAddPullRequest.event;
219221

220222
private _onDidDispose = this._register(new vscode.EventEmitter<void>());
221223
readonly onDidDispose: vscode.Event<void> = this._onDidDispose.event;
@@ -533,6 +535,7 @@ export class FolderRepositoryManager extends Disposable {
533535
this._githubRepositories = repositories;
534536
for (const repo of this._githubRepositories) {
535537
this._onDidChangePullRequestsEvents.push(repo.onDidChangePullRequests(e => this._onDidChangeAnyPullRequests.fire(e)));
538+
this._onDidChangePullRequestsEvents.push(repo.onDidAddPullRequest(e => this._onDidAddPullRequest.fire(e)));
536539
}
537540
oldRepositories.filter(old => this._githubRepositories.indexOf(old) < 0).forEach(repo => repo.dispose());
538541

src/github/issueModel.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import { COPILOT_ACCOUNTS, IComment } from '../common/comment';
88
import { Disposable } from '../common/lifecycle';
99
import Logger from '../common/logger';
1010
import { Remote } from '../common/remote';
11-
import { ClosedEvent, EventType, TimelineEvent } from '../common/timelineEvent';
12-
import { formatError } from '../common/utils';
11+
import { ClosedEvent, CrossReferencedEvent, EventType, TimelineEvent } from '../common/timelineEvent';
12+
import { compareIgnoreCase, formatError } from '../common/utils';
1313
import { OctokitCommon } from './common';
1414
import { CopilotWorkingStatus, GitHubRepository } from './githubRepository';
1515
import {
@@ -470,8 +470,23 @@ export class IssueModel<TItem extends Issue = Issue> extends Disposable {
470470
Logger.error('Unexpected null repository when getting issue timeline events', GitHubRepository.ID);
471471
return [];
472472
}
473+
473474
const ret = data.repository.pullRequest.timelineItems.nodes;
474475
const events = await parseCombinedTimelineEvents(ret, await this.getCopilotTimelineEvents(issueModel, true), this.githubRepository);
476+
477+
const crossRefs = events.filter((event): event is CrossReferencedEvent => {
478+
if ((event.event === EventType.CrossReferenced) && !event.source.isIssue) {
479+
return !this.githubRepository.getExistingPullRequestModel(event.source.number) && (compareIgnoreCase(event.source.owner, issueModel.remote.owner) === 0 && compareIgnoreCase(event.source.repo, issueModel.remote.repositoryName) === 0);
480+
}
481+
return false;
482+
483+
});
484+
485+
for (const unseenPrs of crossRefs) {
486+
// Kick off getting the new PRs so that the system knows about them (and refreshes the tree when they're found)
487+
this.githubRepository.getPullRequest(unseenPrs.source.number);
488+
}
489+
475490
issueModel.timelineEvents = events;
476491
return events;
477492
} catch (e) {

src/github/repositoriesManager.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ export class RepositoriesManager extends Disposable {
4848
private _onDidChangeAnyPullRequests = new vscode.EventEmitter<IssueModel[]>();
4949
readonly onDidChangeAnyPullRequests = this._onDidChangeAnyPullRequests.event;
5050

51+
private _onDidAddPullRequest = new vscode.EventEmitter<IssueModel>();
52+
readonly onDidAddPullRequest = this._onDidAddPullRequest.event;
53+
5154
private _onDidAddAnyGitHubRepository = new vscode.EventEmitter<FolderRepositoryManager>();
5255
readonly onDidChangeAnyGitHubRepository = this._onDidAddAnyGitHubRepository.event;
5356

@@ -85,6 +88,7 @@ export class RepositoriesManager extends Disposable {
8588
folderManager.onDidChangeActivePullRequest(() => this.updateActiveReviewCount()),
8689
folderManager.onDidDispose(() => this.removeRepo(folderManager.repository)),
8790
folderManager.onDidChangeAnyPullRequests(e => this._onDidChangeAnyPullRequests.fire(e)),
91+
folderManager.onDidAddPullRequest(e => this._onDidAddPullRequest.fire(e)),
8892
folderManager.onDidChangeGithubRepositories(() => this._onDidAddAnyGitHubRepository.fire(folderManager)),
8993
];
9094
this._subs.set(folderManager, disposables);

src/view/prsTreeDataProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export class PullRequestsTreeDataProvider extends Disposable implements vscode.T
6363
} else if (Array.isArray(e) && e[0] instanceof IssueModel) {
6464
this.refreshPullRequests(e);
6565
} else {
66-
this.refresh();
66+
this.refresh(undefined, true);
6767
}
6868
}));
6969
this._register(new PRStatusDecorationProvider(this.prsTreeModel, this._copilotManager));

src/view/prsTreeModel.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ export class PrsTreeModel extends Disposable {
8484
this._onDidChangeData.fire(prs);
8585
}));
8686

87+
this._register(this._reposManager.onDidAddPullRequest(() => {
88+
if (this._hasLoaded) {
89+
this._onDidChangeData.fire();
90+
}
91+
}));
92+
8793
this._register(this._reposManager.onDidChangeFolderRepositories((changed) => {
8894
if (changed.added) {
8995
repoEvents(changed.added);
@@ -132,6 +138,9 @@ export class PrsTreeModel extends Disposable {
132138
}
133139

134140
public clearCache(silent: boolean = false) {
141+
if (this._cachedPRs.size === 0) {
142+
return;
143+
}
135144
this._cachedPRs.clear();
136145
if (!silent) {
137146
this._onDidChangeData.fire();

0 commit comments

Comments
 (0)