Skip to content

Commit 91da7dd

Browse files
authored
Edit session filesystem provider should implement IFileSystemProviderWithReadWriteCapability (microsoft#159203)
* Implement `IFileSystemProviderWithFileReadWriteCapability` * Revert "Allow read operations for file system providers implementing `readFile`" This reverts commit cd477d6.
1 parent 21aa6be commit 91da7dd

File tree

3 files changed

+16
-19
lines changed

3 files changed

+16
-19
lines changed

src/vs/platform/files/common/fileService.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { extUri, extUriIgnorePathCase, IExtUri, isAbsolutePath } from 'vs/base/c
1818
import { consumeStream, isReadableBufferedStream, isReadableStream, listenStream, newWriteableStream, peekReadable, peekStream, transform } from 'vs/base/common/stream';
1919
import { URI } from 'vs/base/common/uri';
2020
import { localize } from 'vs/nls';
21-
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, hasFileReadCapability, IFileSystemProviderWithFileReadCapability } from 'vs/platform/files/common/files';
21+
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 } from 'vs/platform/files/common/files';
2222
import { readFileIntoStream } from 'vs/platform/files/common/io';
2323
import { ILogService } from 'vs/platform/log/common/log';
2424

@@ -146,14 +146,14 @@ export class FileService extends Disposable implements IFileService {
146146
return provider;
147147
}
148148

149-
private async withReadProvider(resource: URI): Promise<IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability | IFileSystemProviderWithFileReadCapability> {
149+
private async withReadProvider(resource: URI): Promise<IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability> {
150150
const provider = await this.withProvider(resource);
151151

152-
if (hasOpenReadWriteCloseCapability(provider) || hasReadWriteCapability(provider) || hasFileReadStreamCapability(provider) || hasFileReadCapability(provider)) {
152+
if (hasOpenReadWriteCloseCapability(provider) || hasReadWriteCapability(provider) || hasFileReadStreamCapability(provider)) {
153153
return provider;
154154
}
155155

156-
throw new Error(`Filesystem provider for scheme '${resource.scheme}' neither has FileReadWrite, FileReadStream, FileOpenReadWriteClose nor Readonly capability which is needed for the read operation.`);
156+
throw new Error(`Filesystem provider for scheme '${resource.scheme}' neither has FileReadWrite, FileReadStream nor FileOpenReadWriteClose capability which is needed for the read operation.`);
157157
}
158158

159159
private async withWriteProvider(resource: URI): Promise<IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability> {
@@ -464,7 +464,7 @@ export class FileService extends Disposable implements IFileService {
464464
return this.doReadFile(provider, resource, options, token);
465465
}
466466

467-
private async doReadFileAtomic(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability | IFileSystemProviderWithFileReadCapability, resource: URI, options?: IReadFileOptions, token?: CancellationToken): Promise<IFileContent> {
467+
private async doReadFileAtomic(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability, resource: URI, options?: IReadFileOptions, token?: CancellationToken): Promise<IFileContent> {
468468
return new Promise<IFileContent>((resolve, reject) => {
469469
this.writeQueue.queueFor(resource, this.getExtUri(provider).providerExtUri).queue(async () => {
470470
try {
@@ -477,7 +477,7 @@ export class FileService extends Disposable implements IFileService {
477477
});
478478
}
479479

480-
private async doReadFile(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability | IFileSystemProviderWithFileReadCapability, resource: URI, options?: IReadFileOptions, token?: CancellationToken): Promise<IFileContent> {
480+
private async doReadFile(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability, resource: URI, options?: IReadFileOptions, token?: CancellationToken): Promise<IFileContent> {
481481
const stream = await this.doReadFileStream(provider, resource, {
482482
...options,
483483
// optimization: since we know that the caller does not
@@ -500,7 +500,7 @@ export class FileService extends Disposable implements IFileService {
500500
return this.doReadFileStream(provider, resource, options, token);
501501
}
502502

503-
private async doReadFileStream(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability | IFileSystemProviderWithFileReadCapability, resource: URI, options?: IReadFileOptions & IReadFileStreamOptions & { preferUnbuffered?: boolean }, token?: CancellationToken): Promise<IFileStreamContent> {
503+
private async doReadFileStream(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithOpenReadWriteCloseCapability | IFileSystemProviderWithFileReadStreamCapability, resource: URI, options?: IReadFileOptions & IReadFileStreamOptions & { preferUnbuffered?: boolean }, token?: CancellationToken): Promise<IFileStreamContent> {
504504

505505
// install a cancellation token that gets cancelled
506506
// when any error occurs. this allows us to resolve
@@ -596,7 +596,7 @@ export class FileService extends Disposable implements IFileService {
596596
return stream;
597597
}
598598

599-
private readFileUnbuffered(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithFileAtomicReadCapability | IFileSystemProviderWithFileReadCapability, resource: URI, options?: IReadFileOptions & IReadFileStreamOptions): VSBufferReadableStream {
599+
private readFileUnbuffered(provider: IFileSystemProviderWithFileReadWriteCapability | IFileSystemProviderWithFileAtomicReadCapability, resource: URI, options?: IReadFileOptions & IReadFileStreamOptions): VSBufferReadableStream {
600600
const stream = newWriteableStream<VSBuffer>(data => VSBuffer.concat(data));
601601

602602
// Read the file into the stream async but do not wait for

src/vs/platform/files/common/files.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -567,14 +567,6 @@ export function hasFileReadStreamCapability(provider: IFileSystemProvider): prov
567567
return !!(provider.capabilities & FileSystemProviderCapabilities.FileReadStream);
568568
}
569569

570-
export interface IFileSystemProviderWithFileReadCapability extends IFileSystemProvider {
571-
readFile(resource: URI): Promise<Uint8Array>;
572-
}
573-
574-
export function hasFileReadCapability(provider: IFileSystemProvider): provider is IFileSystemProviderWithFileReadCapability {
575-
return !!(provider.capabilities & FileSystemProviderCapabilities.Readonly);
576-
}
577-
578570
export interface IFileSystemProviderWithFileAtomicReadCapability extends IFileSystemProvider {
579571
readFile(resource: URI, opts?: IFileAtomicReadOptions): Promise<Uint8Array>;
580572
}

src/vs/workbench/contrib/editSessions/browser/editSessionsFileSystemProvider.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,19 @@
66
import { Disposable, IDisposable } from 'vs/base/common/lifecycle';
77
import { Event } from 'vs/base/common/event';
88
import { URI } from 'vs/base/common/uri';
9-
import { FilePermission, FileSystemProviderCapabilities, FileSystemProviderErrorCode, FileType, IFileDeleteOptions, IFileOverwriteOptions, IFileSystemProviderWithFileReadCapability, IStat, IWatchOptions } from 'vs/platform/files/common/files';
9+
import { FilePermission, FileSystemProviderCapabilities, FileSystemProviderErrorCode, FileType, IFileDeleteOptions, IFileOverwriteOptions, IFileSystemProviderWithFileReadWriteCapability, IStat, IWatchOptions } from 'vs/platform/files/common/files';
1010
import { ChangeType, decodeEditSessionFileContent, EDIT_SESSIONS_SCHEME, IEditSessionsStorageService } from 'vs/workbench/contrib/editSessions/common/editSessions';
11+
import { NotSupportedError } from 'vs/base/common/errors';
1112

12-
export class EditSessionsFileSystemProvider implements IFileSystemProviderWithFileReadCapability {
13+
export class EditSessionsFileSystemProvider implements IFileSystemProviderWithFileReadWriteCapability {
1314

1415
static readonly SCHEMA = EDIT_SESSIONS_SCHEME;
1516

1617
constructor(
1718
@IEditSessionsStorageService private editSessionsStorageService: IEditSessionsStorageService,
1819
) { }
1920

20-
readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.Readonly;
21+
readonly capabilities: FileSystemProviderCapabilities = FileSystemProviderCapabilities.Readonly + FileSystemProviderCapabilities.FileReadWrite;
2122

2223
async readFile(resource: URI): Promise<Uint8Array> {
2324
const match = /(?<ref>[^/]+)\/(?<folderName>[^/]+)\/(?<filePath>.*)/.exec(resource.path.substring(1));
@@ -59,5 +60,9 @@ export class EditSessionsFileSystemProvider implements IFileSystemProviderWithFi
5960

6061
async rename(from: URI, to: URI, opts: IFileOverwriteOptions): Promise<void> { }
6162
async delete(resource: URI, opts: IFileDeleteOptions): Promise<void> { }
63+
64+
async writeFile() {
65+
throw new NotSupportedError();
66+
}
6267
//#endregion
6368
}

0 commit comments

Comments
 (0)