Skip to content

Commit 6fba925

Browse files
authored
Fix too many refreshes when closing a PR (#7539)
Part of #7537
1 parent 7a76c2b commit 6fba925

File tree

2 files changed

+30
-24
lines changed

2 files changed

+30
-24
lines changed

src/view/prsTreeModel.ts

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export class PrsTreeModel extends Disposable {
4040

4141
private _cachedPRs: Map<FolderRepositoryManager, Map<string | PRType.LocalPullRequest | PRType.All, ItemsResponseResult<PullRequestModel>>> = new Map();
4242
private readonly _repoEvents: Map<FolderRepositoryManager, vscode.Disposable[]> = new Map();
43+
private _getPullRequestsForQueryLock: Promise<void> = Promise.resolve();
4344

4445
constructor(private _telemetry: ITelemetry, private readonly _reposManager: RepositoriesManager, private readonly _context: vscode.ExtensionContext) {
4546
super();
@@ -238,26 +239,36 @@ export class PrsTreeModel extends Disposable {
238239
}
239240

240241
async getPullRequestsForQuery(folderRepoManager: FolderRepositoryManager, fetchNextPage: boolean, query: string): Promise<ItemsResponseResult<PullRequestModel>> {
241-
const cache = this.getFolderCache(folderRepoManager);
242-
if (!fetchNextPage && cache.has(query)) {
243-
return cache.get(query)!;
244-
}
245-
246-
const prs = await folderRepoManager.getPullRequests(
247-
PRType.Query,
248-
{ fetchNextPage },
249-
query,
250-
);
251-
cache.set(query, prs);
242+
let release: () => void;
243+
const lock = new Promise<void>(resolve => { release = resolve; });
244+
const prev = this._getPullRequestsForQueryLock;
245+
this._getPullRequestsForQueryLock = prev.then(() => lock);
246+
await prev;
247+
248+
try {
249+
const cache = this.getFolderCache(folderRepoManager);
250+
if (!fetchNextPage && cache.has(query)) {
251+
return cache.get(query)!;
252+
}
252253

253-
/* __GDPR__
254-
"pr.expand.query" : {}
255-
*/
256-
this._telemetry.sendTelemetryEvent('pr.expand.query');
257-
// Don't await this._getChecks. It fires an event that will be listened to.
258-
this._getChecks(prs.items);
259-
this.hasLoaded = true;
260-
return prs;
254+
const prs = await folderRepoManager.getPullRequests(
255+
PRType.Query,
256+
{ fetchNextPage },
257+
query,
258+
);
259+
cache.set(query, prs);
260+
261+
/* __GDPR__
262+
"pr.expand.query" : {}
263+
*/
264+
this._telemetry.sendTelemetryEvent('pr.expand.query');
265+
// Don't await this._getChecks. It fires an event that will be listened to.
266+
this._getChecks(prs.items);
267+
this.hasLoaded = true;
268+
return prs;
269+
} finally {
270+
release!();
271+
}
261272
}
262273

263274
async getAllPullRequests(folderRepoManager: FolderRepositoryManager, fetchNextPage: boolean, update?: boolean): Promise<ItemsResponseResult<PullRequestModel>> {

src/view/treeNodes/pullRequestNode.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,6 @@ export class PRNode extends TreeNode implements vscode.CommentingRangeProvider2
5454
super(parent);
5555
this.registerSinceReviewChange();
5656
this.registerConfigurationChange();
57-
this._register(this.pullRequestModel.onDidChange((e) => {
58-
if (e.title || e.state) {
59-
this.refresh(this);
60-
}
61-
}));
6257
this._register(this._folderReposManager.onDidChangeActivePullRequest(e => {
6358
if (e.new?.number === this.pullRequestModel.number || e.old?.number === this.pullRequestModel.number) {
6459
this.refresh(this);

0 commit comments

Comments
 (0)