From e0eb7df5b3a15231fad09b340d0fda104fae9aff Mon Sep 17 00:00:00 2001 From: "ermin.zem" Date: Thu, 30 May 2024 17:09:23 +0800 Subject: [PATCH] feat: support cancel before save file(#213894) --- src/vs/platform/files/common/fileService.ts | 5 ++++- .../services/textfile/common/textFileEditorModel.ts | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/vs/platform/files/common/fileService.ts b/src/vs/platform/files/common/fileService.ts index b353968540e28..02584d10938c1 100644 --- a/src/vs/platform/files/common/fileService.ts +++ b/src/vs/platform/files/common/fileService.ts @@ -21,7 +21,7 @@ import { localize } from 'vs/nls'; import { ensureFileSystemProviderError, etag, ETAG_DISABLED, FileChangesEvent, IFileDeleteOptions, FileOperation, FileOperationError, FileOperationEvent, FileOperationResult, FilePermission, FileSystemProviderCapabilities, FileSystemProviderErrorCode, FileType, hasFileAtomicReadCapability, hasFileFolderCopyCapability, hasFileReadStreamCapability, hasOpenReadWriteCloseCapability, hasReadWriteCapability, ICreateFileOptions, IFileContent, IFileService, IFileStat, IFileStatWithMetadata, IFileStreamContent, IFileSystemProvider, IFileSystemProviderActivationEvent, IFileSystemProviderCapabilitiesChangeEvent, IFileSystemProviderRegistrationEvent, IFileSystemProviderWithFileAtomicReadCapability, IFileSystemProviderWithFileReadStreamCapability, IFileSystemProviderWithFileReadWriteCapability, IFileSystemProviderWithOpenReadWriteCloseCapability, IReadFileOptions, IReadFileStreamOptions, IResolveFileOptions, IFileStatResult, IFileStatResultWithMetadata, IResolveMetadataFileOptions, IStat, IFileStatWithPartialMetadata, IWatchOptions, IWriteFileOptions, NotModifiedSinceFileOperationError, toFileOperationResult, toFileSystemProviderErrorCode, hasFileCloneCapability, TooLargeFileOperationError, hasFileAtomicDeleteCapability, hasFileAtomicWriteCapability, IWatchOptionsWithCorrelation, IFileSystemWatcher, IWatchOptionsWithoutCorrelation } from 'vs/platform/files/common/files'; import { readFileIntoStream } from 'vs/platform/files/common/io'; import { ILogService } from 'vs/platform/log/common/log'; -import { ErrorNoTelemetry } from 'vs/base/common/errors'; +import { ErrorNoTelemetry, isCancellationError } from 'vs/base/common/errors'; export class FileService extends Disposable implements IFileService { @@ -424,6 +424,9 @@ export class FileService extends Disposable implements IFileService { // events this._onDidRunOperation.fire(new FileOperationEvent(resource, FileOperation.WRITE)); } catch (error) { + if (isCancellationError(error)) { + throw error; + } throw new FileOperationError(localize('err.write', "Unable to write file '{0}' ({1})", this.resourceForError(resource), ensureFileSystemProviderError(error).toString()), toFileOperationResult(error), writeFileOptions); } diff --git a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts index b127ae7b7ca74..51bf34519e80c 100644 --- a/src/vs/workbench/services/textfile/common/textFileEditorModel.ts +++ b/src/vs/workbench/services/textfile/common/textFileEditorModel.ts @@ -33,6 +33,7 @@ import { IAccessibilityService } from 'vs/platform/accessibility/common/accessib import { PLAINTEXT_LANGUAGE_ID } from 'vs/editor/common/languages/modesRegistry'; import { IExtensionService } from 'vs/workbench/services/extensions/common/extensions'; import { IMarkdownString } from 'vs/base/common/htmlContent'; +import { isCancellationError } from 'vs/base/common/errors'; interface IBackupMetaData extends IWorkingCopyBackupMeta { mtime: number; @@ -940,6 +941,10 @@ export class TextFileEditorModel extends BaseTextEditorModel implements ITextFil } private handleSaveError(error: Error, versionId: number, options: ITextFileSaveAsOptions): void { + if (isCancellationError(error)) { + throw error; + } + (options.ignoreErrorHandler ? this.logService.trace : this.logService.error).apply(this.logService, [`[text file model] handleSaveError(${versionId}) - exit - resulted in a save error: ${error.toString()}`, this.resource.toString()]); // Return early if the save() call was made asking to