diff --git a/src/vs/workbench/contrib/mergeEditor/browser/commands/commands.ts b/src/vs/workbench/contrib/mergeEditor/browser/commands/commands.ts index e041c2c83ed..9e1c1821afa 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/commands/commands.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/commands/commands.ts @@ -14,12 +14,13 @@ import { IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { ITextEditorOptions } from 'vs/platform/editor/common/editor'; import { ServicesAccessor } from 'vs/platform/instantiation/common/instantiation'; import { IOpenerService } from 'vs/platform/opener/common/opener'; +import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { IEditorIdentifier, IResourceMergeEditorInput } from 'vs/workbench/common/editor'; import { MergeEditorInput, MergeEditorInputData } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput'; import { IMergeEditorInputModel } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel'; import { MergeEditor } from 'vs/workbench/contrib/mergeEditor/browser/view/mergeEditor'; import { MergeEditorViewModel } from 'vs/workbench/contrib/mergeEditor/browser/view/viewModel'; -import { ctxIsMergeEditor, ctxMergeEditorLayout, ctxMergeEditorShowBase, ctxMergeEditorShowBaseAtTop, ctxMergeEditorShowNonConflictingChanges } from 'vs/workbench/contrib/mergeEditor/common/mergeEditor'; +import { ctxIsMergeEditor, ctxMergeEditorLayout, ctxMergeEditorShowBase, ctxMergeEditorShowBaseAtTop, ctxMergeEditorShowNonConflictingChanges, StorageCloseWithConflicts } from 'vs/workbench/contrib/mergeEditor/common/mergeEditor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; abstract class MergeEditorAction extends Action2 { @@ -636,6 +637,26 @@ export class ResetToBaseAndAutoMergeCommand extends MergeEditorAction { } } +export class ResetCloseWithConflictsChoice extends Action2 { + constructor() { + super({ + id: 'mergeEditor.resetCloseWithConflictsChoice', + category: mergeEditorCategory, + title: { + value: localize( + 'mergeEditor.resetChoice', + 'Reset Choice for \'Close with Conflicts\'' + ), + original: 'Reset Choice for \'Close with Conflicts\'', + }, + f1: true, + }); + } + run(accessor: ServicesAccessor): void { + accessor.get(IStorageService).remove(StorageCloseWithConflicts, StorageScope.PROFILE); + } +} + // this is an API command export class AcceptMerge extends MergeEditorAction2 { constructor() { diff --git a/src/vs/workbench/contrib/mergeEditor/browser/mergeEditor.contribution.ts b/src/vs/workbench/contrib/mergeEditor/browser/mergeEditor.contribution.ts index 7218c3cf281..b40ba6d5c6a 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/mergeEditor.contribution.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/mergeEditor.contribution.ts @@ -15,7 +15,7 @@ import { AcceptAllInput1, AcceptAllInput2, AcceptMerge, CompareInput1WithBaseCommand, CompareInput2WithBaseCommand, GoToNextUnhandledConflict, GoToPreviousUnhandledConflict, OpenBaseFile, OpenMergeEditor, OpenResultResource, ResetToBaseAndAutoMergeCommand, SetColumnLayout, SetMixedLayout, ShowHideTopBase, ShowHideCenterBase, ShowHideBase, - ShowNonConflictingChanges, ToggleActiveConflictInput1, ToggleActiveConflictInput2 + ShowNonConflictingChanges, ToggleActiveConflictInput1, ToggleActiveConflictInput2, ResetCloseWithConflictsChoice } from 'vs/workbench/contrib/mergeEditor/browser/commands/commands'; import { MergeEditorCopyContentsToJSON, MergeEditorLoadContentsFromFolder, MergeEditorSaveContentsToFolder } from 'vs/workbench/contrib/mergeEditor/browser/commands/devCommands'; import { MergeEditorInput } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput'; @@ -83,6 +83,7 @@ registerAction2(AcceptAllInput2); registerAction2(ResetToBaseAndAutoMergeCommand); registerAction2(AcceptMerge); +registerAction2(ResetCloseWithConflictsChoice); // Dev Commands registerAction2(MergeEditorCopyContentsToJSON); diff --git a/src/vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel.ts b/src/vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel.ts index c7243ad2bdb..5db6c2fa5ad 100644 --- a/src/vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel.ts +++ b/src/vs/workbench/contrib/mergeEditor/browser/mergeEditorInputModel.ts @@ -17,6 +17,7 @@ import { localize } from 'vs/nls'; import { ConfirmResult, IDialogOptions, IDialogService } from 'vs/platform/dialogs/common/dialogs'; import { IEditorModel } from 'vs/platform/editor/common/editor'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { IStorageService, StorageScope, StorageTarget } from 'vs/platform/storage/common/storage'; import { IRevertOptions, SaveSourceRegistry } from 'vs/workbench/common/editor'; import { EditorModel } from 'vs/workbench/common/editor/editorModel'; import { MergeEditorInputData } from 'vs/workbench/contrib/mergeEditor/browser/mergeEditorInput'; @@ -24,6 +25,7 @@ import { conflictMarkers } from 'vs/workbench/contrib/mergeEditor/browser/mergeM import { MergeDiffComputer } from 'vs/workbench/contrib/mergeEditor/browser/model/diffComputer'; import { InputData, MergeEditorModel } from 'vs/workbench/contrib/mergeEditor/browser/model/mergeEditorModel'; import { MergeEditorTelemetry } from 'vs/workbench/contrib/mergeEditor/browser/telemetry'; +import { StorageCloseWithConflicts } from 'vs/workbench/contrib/mergeEditor/common/mergeEditor'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { ITextFileEditorModel, ITextFileSaveOptions, ITextFileService } from 'vs/workbench/services/textfile/common/textfiles'; @@ -349,6 +351,7 @@ class WorkspaceMergeEditorInputModel extends EditorModel implements IMergeEditor private readonly resultTextFileModel: ITextFileEditorModel, private readonly telemetry: MergeEditorTelemetry, @IDialogService private readonly _dialogService: IDialogService, + @IStorageService private readonly _storageService: IStorageService, ) { super(); } @@ -449,7 +452,7 @@ class WorkspaceMergeEditorInputModel extends EditorModel implements IMergeEditor const { choice } = await this._dialogService.show(Severity.Info, message, actions.map(a => a[0]), { ...options, cancelId: actions.length - 1 }); return actions[choice][1]; - } else if (someUnhandledConflicts) { + } else if (someUnhandledConflicts && !this._storageService.getBoolean(StorageCloseWithConflicts, StorageScope.PROFILE, false)) { const message = isMany ? localize('workspace.messageN.nonDirty', 'Do you want to close {0} merge editors?', inputModels.length) : localize('workspace.message1.nonDirty', 'Do you want to close the merge editor for {0}?', basename(inputModels[0].resultUri)); @@ -471,7 +474,16 @@ class WorkspaceMergeEditorInputModel extends EditorModel implements IMergeEditor [localize('workspace.cancel', 'Cancel'), ConfirmResult.CANCEL], ]; - const { choice } = await this._dialogService.show(Severity.Info, message, actions.map(a => a[0]), { ...options, cancelId: actions.length - 1 }); + const { choice, checkboxChecked } = await this._dialogService.show(Severity.Info, message, actions.map(a => a[0]), { + ...options, + cancelId: actions.length - 1, + checkbox: { label: localize('noMoreWarn', "Don't ask again") } + }); + + if (checkboxChecked) { + this._storageService.store(StorageCloseWithConflicts, true, StorageScope.PROFILE, StorageTarget.USER); + } + return actions[choice][1]; } else { // This shouldn't do anything diff --git a/src/vs/workbench/contrib/mergeEditor/common/mergeEditor.ts b/src/vs/workbench/contrib/mergeEditor/common/mergeEditor.ts index 07001c6684a..9670eb8a573 100644 --- a/src/vs/workbench/contrib/mergeEditor/common/mergeEditor.ts +++ b/src/vs/workbench/contrib/mergeEditor/common/mergeEditor.ts @@ -26,3 +26,5 @@ export interface MergeEditorContents { result: string; initialResult?: string; } + +export const StorageCloseWithConflicts = 'mergeEditorCloseWithConflicts';