From 6a9c5b44e232ccd5076e5a0dd7133071f0619416 Mon Sep 17 00:00:00 2001 From: isidor Date: Thu, 21 Jun 2018 17:54:55 +0200 Subject: [PATCH] With Joh remote file service: throw when doing a mutating action --- .../electron-browser/remoteFileService.ts | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts index 610f6c09692..108c385d1ae 100644 --- a/src/vs/workbench/services/files/electron-browser/remoteFileService.ts +++ b/src/vs/workbench/services/files/electron-browser/remoteFileService.ts @@ -443,12 +443,20 @@ export class RemoteFileService extends FileService { } } + private static _throwIfFileSystemIsReadonly(provider: IFileSystemProvider): IFileSystemProvider { + if (provider.capabilities & FileSystemProviderCapabilities.Readonly) { + throw new FileOperationError(localize('err.readonly', "Resource can not be modified."), FileOperationResult.FILE_PERMISSION_DENIED); + } + return provider; + } + createFile(resource: URI, content?: string, options?: ICreateFileOptions): TPromise { if (resource.scheme === Schemas.file) { return super.createFile(resource, content, options); } else { - return this._withProvider(resource).then(provider => { + return this._withProvider(resource).then(RemoteFileService._throwIfFileSystemIsReadonly).then(provider => { + return RemoteFileService._mkdirp(provider, resource.with({ path: posix.dirname(resource.path) })).then(() => { const encoding = this.encoding.getWriteEncoding(resource); return this._writeFile(provider, resource, new StringSnapshot(content), encoding, { create: true, overwrite: Boolean(options && options.overwrite) }); @@ -469,7 +477,7 @@ export class RemoteFileService extends FileService { if (resource.scheme === Schemas.file) { return super.updateContent(resource, value, options); } else { - return this._withProvider(resource).then(provider => { + return this._withProvider(resource).then(RemoteFileService._throwIfFileSystemIsReadonly).then(provider => { return RemoteFileService._mkdirp(provider, resource.with({ path: posix.dirname(resource.path) })).then(() => { const snapshot = typeof value === 'string' ? new StringSnapshot(value) : value; return this._writeFile(provider, resource, snapshot, options && options.encoding, { create: true, overwrite: true }); @@ -515,7 +523,7 @@ export class RemoteFileService extends FileService { if (resource.scheme === Schemas.file) { return super.del(resource, useTrash); } else { - return this._withProvider(resource).then(provider => { + return this._withProvider(resource).then(RemoteFileService._throwIfFileSystemIsReadonly).then(provider => { return provider.delete(resource).then(() => { this._onAfterOperation.fire(new FileOperationEvent(resource, FileOperation.DELETE)); }); @@ -527,7 +535,7 @@ export class RemoteFileService extends FileService { if (resource.scheme === Schemas.file) { return super.createFolder(resource); } else { - return this._withProvider(resource).then(provider => { + return this._withProvider(resource).then(RemoteFileService._throwIfFileSystemIsReadonly).then(provider => { return RemoteFileService._mkdirp(provider, resource.with({ path: posix.dirname(resource.path) })).then(() => { return provider.mkdir(resource).then(() => { return this.resolveFile(resource); @@ -556,7 +564,7 @@ export class RemoteFileService extends FileService { ? this.del(target).then(undefined, err => { /*ignore*/ }) : TPromise.as(null); - return prepare.then(() => this._withProvider(source)).then(provider => { + return prepare.then(() => this._withProvider(source)).then(RemoteFileService._throwIfFileSystemIsReadonly).then(provider => { return provider.rename(source, target, { overwrite }).then(() => { return this.resolveFile(target); }).then(fileStat => { @@ -588,7 +596,7 @@ export class RemoteFileService extends FileService { return super.copyFile(source, target, overwrite); } - return this._withProvider(target).then(provider => { + return this._withProvider(target).then(RemoteFileService._throwIfFileSystemIsReadonly).then(provider => { if (source.scheme === target.scheme && (provider.capabilities & FileSystemProviderCapabilities.FileFolderCopy)) { // good: provider supports copy withing scheme -- GitLab