From 2c03f6a7d0f5f76c1845e3d9a5cf3ee13d2dd247 Mon Sep 17 00:00:00 2001 From: RedCMD Date: Tue, 26 May 2026 21:07:28 +1200 Subject: [PATCH] revert #283546 --- extensions/git/src/quickDiffProvider.ts | 16 ++++++++- .../api/browser/mainThreadEditors.ts | 33 ++++++++++--------- .../contrib/scm/common/quickDiffService.ts | 3 +- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/extensions/git/src/quickDiffProvider.ts b/extensions/git/src/quickDiffProvider.ts index 961f5387555fd..4f3228bdb8ced 100644 --- a/extensions/git/src/quickDiffProvider.ts +++ b/extensions/git/src/quickDiffProvider.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { FileType, l10n, LogOutputChannel, QuickDiffProvider, Uri, workspace } from 'vscode'; +import { FileType, l10n, LogOutputChannel, QuickDiffProvider, TabInputTextDiff, TabInputTextMultiDiff, Uri, window, workspace } from 'vscode'; import { IRepositoryResolver, Repository } from './repository'; import { isDescendant, pathEquals } from './util'; import { toGitUri } from './uri'; @@ -71,6 +71,20 @@ export class GitQuickDiffProvider implements QuickDiffProvider { return undefined; } + const activeTabInput = window.tabGroups.activeTabGroup.activeTab?.input; + + // Ignore file that is on the right-hand side of a diff editor + if (activeTabInput instanceof TabInputTextDiff && pathEquals(activeTabInput.modified.fsPath, uri.fsPath)) { + this.logger.trace(`[Repository][provideOriginalResource] Resource is on the right-hand side of a diff editor: ${uri.toString()}`); + return undefined; + } + + // Ignore file that is on the right -hand side of a multi-file diff editor + if (activeTabInput instanceof TabInputTextMultiDiff && activeTabInput.textDiffs.some(diff => pathEquals(diff.modified.fsPath, uri.fsPath))) { + this.logger.trace(`[Repository][provideOriginalResource] Resource is on the right-hand side of a multi-file diff editor: ${uri.toString()}`); + return undefined; + } + const originalResource = toGitUri(uri, '', { replaceFileExtension: true }); this.logger.trace(`[Repository][provideOriginalResource] Original resource: ${originalResource.toString()}`); diff --git a/src/vs/workbench/api/browser/mainThreadEditors.ts b/src/vs/workbench/api/browser/mainThreadEditors.ts index fb3ef0087d9c7..55866782fbdb5 100644 --- a/src/vs/workbench/api/browser/mainThreadEditors.ts +++ b/src/vs/workbench/api/browser/mainThreadEditors.ts @@ -153,9 +153,13 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { return constObservable(undefined); } + const editorModelUri = isITextModel(editorModel) + ? editorModel.uri + : editorModel.modified.uri; + // TextEditor if (isITextModel(editorModel)) { - const quickDiffModelRef = this._quickDiffModelService.createQuickDiffModelReference(editorModel.uri); + const quickDiffModelRef = this._quickDiffModelService.createQuickDiffModelReference(editorModelUri); if (!quickDiffModelRef) { return constObservable(undefined); } @@ -171,35 +175,32 @@ export class MainThreadTextEditors implements MainThreadTextEditorsShape { }); } - // DiffEditor - we create a quick diff model (using the diff algorithm used by the diff editor) - // even for diff editor so that we can provide multiple "original resources" to diff with the original - // and modified resources. + // DirtyDiffModel - we create a dirty diff model for diff editor so that + // we can provide multiple "original resources" to diff with the modified + // resource. const diffAlgorithm = this._configurationService.getValue('diffEditor.diffAlgorithm'); - const quickDiffModelRef = this._quickDiffModelService.createQuickDiffModelReference(editorModel.modified.uri, { algorithm: diffAlgorithm }); + const quickDiffModelRef = this._quickDiffModelService.createQuickDiffModelReference(editorModelUri, { algorithm: diffAlgorithm }); if (!quickDiffModelRef) { return constObservable(undefined); } toDispose.push(quickDiffModelRef); return observableFromEvent(Event.any(quickDiffModelRef.object.onDidChange, diffEditor.onDidUpdateDiff), () => { - const diffChanges = diffEditor.getDiffComputationResult()?.changes2 ?? []; - const diffInformation = [{ - original: editorModel.original.uri, - modified: editorModel.modified.uri, - changes: diffChanges.map(change => change as LineRangeMapping) - }]; - - // Add quick diff information from secondary/contributed providers const quickDiffInformation = quickDiffModelRef.object.getQuickDiffResults() - .filter(result => result.providerKind !== 'primary') .map(result => ({ original: result.original, modified: result.modified, changes: result.changes2 })); - // Combine diff and quick diff information - return diffInformation.concat(quickDiffInformation); + const diffChanges = diffEditor.getDiffComputationResult()?.changes2 ?? []; + const diffInformation = [{ + original: editorModel.original.uri, + modified: editorModel.modified.uri, + changes: diffChanges.map(change => change as LineRangeMapping) + }]; + + return [...quickDiffInformation, ...diffInformation]; }); }); diff --git a/src/vs/workbench/contrib/scm/common/quickDiffService.ts b/src/vs/workbench/contrib/scm/common/quickDiffService.ts index c354555653a2f..6759d4e35609c 100644 --- a/src/vs/workbench/contrib/scm/common/quickDiffService.ts +++ b/src/vs/workbench/contrib/scm/common/quickDiffService.ts @@ -152,6 +152,5 @@ export class QuickDiffService extends Disposable implements IQuickDiffService { export async function getOriginalResource(quickDiffService: IQuickDiffService, uri: URI, language: string | undefined, isSynchronized: boolean | undefined): Promise { const quickDiffs = await quickDiffService.getQuickDiffs(uri, language, isSynchronized); - const primaryQuickDiffs = quickDiffs.find(quickDiff => quickDiff.kind === 'primary'); - return primaryQuickDiffs ? primaryQuickDiffs.originalResource : null; + return quickDiffs.length > 0 ? quickDiffs[0].originalResource : null; }