From a8eb65c00ee071e1fd858607c572230e6a1d3e5d Mon Sep 17 00:00:00 2001 From: Alex Ross <38270282+alexr00@users.noreply.github.com> Date: Tue, 6 Jan 2026 12:23:16 +0100 Subject: [PATCH] Fix PR description update timing --- src/github/activityBarViewProvider.ts | 27 +++++++---- src/github/pullRequestOverview.ts | 68 ++++++++++++++++----------- 2 files changed, 59 insertions(+), 36 deletions(-) diff --git a/src/github/activityBarViewProvider.ts b/src/github/activityBarViewProvider.ts index 1b3cd91dad..1905c6821c 100644 --- a/src/github/activityBarViewProvider.ts +++ b/src/github/activityBarViewProvider.ts @@ -15,6 +15,7 @@ import { MergeArguments, PullRequest, ReviewType } from './views'; import { IComment } from '../common/comment'; import { emojify, ensureEmojis } from '../common/emoji'; import { disposeAll } from '../common/lifecycle'; +import Logger from '../common/logger'; import { CHECKOUT_DEFAULT_BRANCH, CHECKOUT_PULL_REQUEST_BASE_BRANCH, DELETE_BRANCH_AFTER_MERGE, POST_DONE, PR_SETTINGS_NAMESPACE } from '../common/settingKeys'; import { ReviewEvent } from '../common/timelineEvent'; import { formatError } from '../common/utils'; @@ -25,7 +26,7 @@ import { ReviewManager } from '../view/reviewManager'; export class PullRequestViewProvider extends WebviewViewBase implements vscode.WebviewViewProvider { public override readonly viewType = 'github:activePullRequest'; private _existingReviewers: ReviewState[] = []; - private _isUpdating: boolean = false; + private _updatingPromise: Promise | undefined; constructor( extensionUri: vscode.Uri, @@ -151,7 +152,7 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W } this._prDisposables = []; this._prDisposables.push(pullRequestModel.onDidChange(e => { - if ((e.state || e.comments || e.reviewers) && !this._isUpdating) { + if ((e.state || e.comments || e.reviewers) && !this._updatingPromise) { this.updatePullRequest(pullRequestModel); } })); @@ -160,10 +161,16 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W private _updatePendingVisibility: vscode.Disposable | undefined = undefined; public async updatePullRequest(pullRequestModel: PullRequestModel): Promise { - if (this._isUpdating) { - throw new Error('Already updating pull request view'); + const isSamePullRequest = pullRequestModel.equals(this._item); + if (this._updatingPromise && isSamePullRequest) { + Logger.error('Already updating pull request view', PullRequestViewProvider.name); + return; + } else if (this._updatingPromise && !isSamePullRequest) { + this._item = pullRequestModel; + await this._updatingPromise; + } else { + this._item = pullRequestModel; } - this._isUpdating = true; try { if (this._view && !this._view.visible) { @@ -178,7 +185,7 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W this.registerPrSpecificListeners(pullRequestModel); } this._item = pullRequestModel; - const [pullRequest, repositoryAccess, timelineEvents, requestedReviewers, branchInfo, defaultBranch, currentUser, viewerCanEdit, hasReviewDraft, coAuthors] = await Promise.all([ + const updatingPromise = Promise.all([ this._folderRepositoryManager.resolvePullRequest( pullRequestModel.remote.owner, pullRequestModel.remote.repositoryName, @@ -195,6 +202,8 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W pullRequestModel.getCoAuthors(), ensureEmojis(this._folderRepositoryManager.context) ]); + this._updatingPromise = updatingPromise; + const [pullRequest, repositoryAccess, timelineEvents, requestedReviewers, branchInfo, defaultBranch, currentUser, viewerCanEdit, hasReviewDraft, coAuthors] = await updatingPromise; if (!pullRequest) { throw new Error( @@ -202,6 +211,10 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W ); } + if (!this._item.equals(pullRequestModel)) { + return; + } + this._item = pullRequest; if (!this._view) { // If the there is no PR webview, then there is nothing else to update. @@ -292,8 +305,6 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W } catch (e) { vscode.window.showErrorMessage(`Error updating active pull request view: ${formatError(e)}`); - } finally { - this._isUpdating = false; } } diff --git a/src/github/pullRequestOverview.ts b/src/github/pullRequestOverview.ts index e805eaa966..88cda7b315 100644 --- a/src/github/pullRequestOverview.ts +++ b/src/github/pullRequestOverview.ts @@ -57,7 +57,7 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel | undefined; public static override async createOrShow( telemetry: ITelemetry, @@ -172,7 +172,7 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel { - if ((e.state || e.comments) && !this._isUpdating) { + if ((e.state || e.comments) && !this._updatingPromise) { this.refreshPanel(); } })); @@ -235,32 +235,19 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel { - this._item = pullRequestModel; - - if (this._isUpdating) { - throw new Error('Already updating pull request webview'); + const isSamePullRequest = pullRequestModel.equals(this._item); + if (this._updatingPromise && isSamePullRequest) { + Logger.error('Already updating pull request webview', PullRequestOverviewPanel.ID); + return; + } else if (this._updatingPromise && !isSamePullRequest) { + this._item = pullRequestModel; + await this._updatingPromise; + } else { + this._item = pullRequestModel; } - this._isUpdating = true; + try { - const [ - pullRequest, - timelineEvents, - defaultBranch, - status, - requestedReviewers, - repositoryAccess, - branchInfo, - currentUser, - viewerCanEdit, - orgTeamsCount, - mergeQueueMethod, - isBranchUpToDateWithBase, - mergeability, - emailForCommit, - coAuthors, - hasReviewDraft, - assignableUsers - ] = await Promise.all([ + const updatingPromise = Promise.all([ this._folderRepositoryManager.resolvePullRequest( pullRequestModel.remote.owner, pullRequestModel.remote.repositoryName, @@ -283,12 +270,39 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel