diff --git a/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts b/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts index 21c71d72ea6814f10bac3fe48d9108d64571db60..4512e238c9bc0f1e6b376b21c63c0c8221f641d2 100644 --- a/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts +++ b/src/vs/workbench/parts/files/electron-browser/saveErrorHandler.ts @@ -174,7 +174,7 @@ export class SaveErrorHandler implements ISaveErrorHandler, IWorkbenchContributi let errorMessage: string; if (isReadonly) { - errorMessage = nls.localize('readonlySaveError', "Failed to save '{0}': File is write protected. Select 'Overwrite' to remove protection.", paths.basename(resource.fsPath)); + errorMessage = nls.localize('readonlySaveError', "Failed to save '{0}': File is write protected. Select 'Overwrite' to attempt to remove protection.", paths.basename(resource.fsPath)); } else { errorMessage = nls.localize('genericSaveError', "Failed to save '{0}': {1}", paths.basename(resource.fsPath), toErrorMessage(error, false)); } diff --git a/src/vs/workbench/services/files/node/fileService.ts b/src/vs/workbench/services/files/node/fileService.ts index 29546e8fb3d62d59fcb4db522185ffe04761766d..75a3de27e5ec617ea7e0bfcb2e4aecd27b6fe59a 100644 --- a/src/vs/workbench/services/files/node/fileService.ts +++ b/src/vs/workbench/services/files/node/fileService.ts @@ -918,21 +918,26 @@ export class FileService implements IFileService { } } - let mode = stat.mode; - const readonly = !(mode & 128); - // Throw if file is readonly and we are not instructed to overwrite - if (readonly && !options.overwriteReadonly) { - return TPromise.wrapError(new FileOperationError( - nls.localize('fileReadOnlyError', "File is Read Only"), - FileOperationResult.FILE_READ_ONLY - )); - } + if (!(stat.mode & 128) /* readonly */) { + if (!options.overwriteReadonly) { + return this.readOnlyError(); + } - if (readonly) { + // Try to change mode to writeable + let mode = stat.mode; mode = mode | 128; + return pfs.chmod(absolutePath, mode).then(() => { + + // Make sure to check the mode again, it could have failed + return pfs.stat(absolutePath).then(stat => { + if (!(stat.mode & 128) /* readonly */) { + return this.readOnlyError(); + } - return pfs.chmod(absolutePath, mode).then(() => exists); + return exists; + }); + }); } return TPromise.as(exists); @@ -943,6 +948,13 @@ export class FileService implements IFileService { }); } + private readOnlyError(): TPromise { + return TPromise.wrapError(new FileOperationError( + nls.localize('fileReadOnlyError', "File is Read Only"), + FileOperationResult.FILE_READ_ONLY + )); + } + public watchFileChanges(resource: uri): void { assert.ok(resource && resource.scheme === 'file', `Invalid resource for watching: ${resource}`);