From 7e7f0edcf7691c27cdd8271b4c3e44e4cbf8934b Mon Sep 17 00:00:00 2001 From: Alex Ross Date: Wed, 24 Apr 2024 15:03:20 +0200 Subject: [PATCH] Failed to save 'index.tsx': The content of the file is newer Fixes #5943 --- src/github/conflictResolutionCoordinator.ts | 6 +++--- src/github/conflictResolutionModel.ts | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/github/conflictResolutionCoordinator.ts b/src/github/conflictResolutionCoordinator.ts index 19ab8f81ab..83ea76dd1a 100644 --- a/src/github/conflictResolutionCoordinator.ts +++ b/src/github/conflictResolutionCoordinator.ts @@ -79,7 +79,7 @@ class MergeOutputProvider implements vscode.FileSystemProvider { clear(): void { const fileEvents: vscode.FileChangeEvent[] = []; for (const file of this._mergedFiles.keys()) { - fileEvents.push({ uri: vscode.Uri.from({ scheme: Schemes.MergeOutput, path: file }), type: vscode.FileChangeType.Changed }); + fileEvents.push({ uri: vscode.Uri.from({ scheme: this._conflictResolutionModel.mergeScheme, path: file }), type: vscode.FileChangeType.Changed }); this.updateFile(file, buffer.Buffer.from(ORIGINAL_FILE)); } this._onDidChangeFile.fire(fileEvents); @@ -124,7 +124,7 @@ export class ConflictResolutionCoordinator { private register(): void { this._disposables.push(vscode.workspace.registerFileSystemProvider(Schemes.GithubPr, new GitHubContentProvider(this._githubRepositories), { isReadonly: true })); - this._disposables.push(vscode.workspace.registerFileSystemProvider(Schemes.MergeOutput, this._mergeOutputProvider)); + this._disposables.push(vscode.workspace.registerFileSystemProvider(this._conflictResolutionModel.mergeScheme, this._mergeOutputProvider)); this._disposables.push(vscode.commands.registerCommand('pr.resolveConflict', (conflict: Conflict) => { return this.openConflict(conflict); })); @@ -184,7 +184,7 @@ export class ConflictResolutionCoordinator { const tabsToClose: vscode.Tab[] = []; for (const group of vscode.window.tabGroups.all) { for (const tab of group.tabs) { - if ((tab.input instanceof vscode.TabInputTextMerge) && (tab.input.result.scheme === Schemes.MergeOutput)) { + if ((tab.input instanceof vscode.TabInputTextMerge) && (tab.input.result.scheme === this._conflictResolutionModel.mergeScheme)) { tabsToClose.push(tab); } } diff --git a/src/github/conflictResolutionModel.ts b/src/github/conflictResolutionModel.ts index 14085cf556..a1ef517605 100644 --- a/src/github/conflictResolutionModel.ts +++ b/src/github/conflictResolutionModel.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import { randomUUID } from 'crypto'; import * as vscode from 'vscode'; import { Schemes, toGitHubUri } from '../common/uri'; @@ -26,6 +27,7 @@ export class ConflictResolutionModel { private readonly _resolvedConflicts: Map = new Map(); private readonly _onAddedResolution: vscode.EventEmitter = new vscode.EventEmitter(); public readonly onAddedResolution: vscode.Event = this._onAddedResolution.event; + public readonly mergeScheme = `${Schemes.MergeOutput}-${randomUUID()}`; constructor(public readonly startingConflicts: Conflict[], public readonly repositoryName: string, public readonly prBaseOwner: string, public readonly latestPrBaseSha: string, @@ -67,7 +69,7 @@ export class ConflictResolutionModel { } public mergeOutputUri(conflict: Conflict) { - return vscode.Uri.parse(`${Schemes.MergeOutput}:/${conflict.prHeadFilePath}`); + return vscode.Uri.parse(`${this.mergeScheme}:/${conflict.prHeadFilePath}`); } public mergeBaseUri(conflict: { prHeadFilePath: string }): vscode.Uri {