Skip to content

Commit c41ff98

Browse files
author
Loïc Mangeonjean
committed
feat: add file service stat middleware
1 parent 6997677 commit c41ff98

File tree

3 files changed

+67
-7
lines changed

3 files changed

+67
-7
lines changed

src/service-override/files.ts

Lines changed: 47 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ import {
3131
type IFileSystemProviderWithFileAtomicReadCapability,
3232
type IFileSystemProviderWithFileAtomicWriteCapability,
3333
type IFileSystemProviderWithFileAtomicDeleteCapability,
34-
hasFileReadStreamCapability
34+
hasFileReadStreamCapability,
35+
type IFileStat,
36+
type IFileStatWithMetadata
3537
} from 'vs/platform/files/common/files'
3638
import {
3739
DisposableStore,
@@ -1079,8 +1081,15 @@ const providers: Record<string, IFileSystemProvider> = {
10791081
[Schemas.file]: overlayFileSystemProvider
10801082
}
10811083

1084+
export interface FileServiceOptions {
1085+
statMiddleware?: (resource: URI, next: () => Promise<IFileStat>) => Promise<IFileStat>
1086+
}
1087+
10821088
class FileServiceOverride extends FileService {
1083-
constructor(logService: ILogService) {
1089+
constructor(
1090+
logService: ILogService,
1091+
private options: FileServiceOptions
1092+
) {
10841093
super(logService)
10851094

10861095
for (const [scheme, provider] of Object.entries(providers)) {
@@ -1104,6 +1113,36 @@ class FileServiceOverride extends FileService {
11041113
return super.withProvider(resource)
11051114
}
11061115

1116+
protected override async toFileStat(
1117+
provider: IFileSystemProvider,
1118+
resource: URI,
1119+
stat: IStat | ({ type: FileType } & Partial<IStat>),
1120+
siblings: number | undefined,
1121+
resolveMetadata: boolean,
1122+
recurse: (stat: IFileStat, siblings?: number) => boolean
1123+
): Promise<IFileStat>
1124+
protected override async toFileStat(
1125+
provider: IFileSystemProvider,
1126+
resource: URI,
1127+
stat: IStat,
1128+
siblings: number | undefined,
1129+
resolveMetadata: true,
1130+
recurse: (stat: IFileStat, siblings?: number) => boolean
1131+
): Promise<IFileStatWithMetadata>
1132+
protected override async toFileStat(
1133+
provider: IFileSystemProvider,
1134+
resource: URI,
1135+
stat: IStat | ({ type: FileType } & Partial<IStat>),
1136+
siblings: number | undefined,
1137+
resolveMetadata: boolean,
1138+
recurse: (stat: IFileStat, siblings?: number) => boolean
1139+
): Promise<IFileStat> {
1140+
const next = async () => {
1141+
return await super.toFileStat(provider, resource, stat, siblings, resolveMetadata, recurse)
1142+
}
1143+
return this.options.statMiddleware?.(resource, next) ?? next()
1144+
}
1145+
11071146
/**
11081147
* Hack: the parent class has dependencies, we don't, dependencies are stored in a static field
11091148
* Having no dependencies mean the field won't be overriden, so we'll inherit dependencies from the parent
@@ -1118,9 +1157,11 @@ registerServiceInitializePreParticipant(async (accessor) => {
11181157
fileLogger.logger = accessor.get(ILogService)
11191158
})
11201159

1121-
export default function getServiceOverride(): IEditorOverrideServices {
1160+
export default function getServiceOverride(
1161+
options: FileServiceOptions = {}
1162+
): IEditorOverrideServices {
11221163
return {
1123-
[IFileService.toString()]: new SyncDescriptor(FileServiceOverride, [fileLogger], true),
1164+
[IFileService.toString()]: new SyncDescriptor(FileServiceOverride, [fileLogger, options], true),
11241165
[ITextFileService.toString()]: new SyncDescriptor(BrowserTextFileService, [], true),
11251166
[IFilesConfigurationService.toString()]: new SyncDescriptor(
11261167
FilesConfigurationService,
@@ -1311,5 +1352,6 @@ export type {
13111352
IFileWriteOptions,
13121353
IFileDeleteOptions,
13131354
IFileOverwriteOptions,
1314-
IFileChange
1355+
IFileChange,
1356+
IFileStat
13151357
}

vscode-patches/0013-feat-export-some-classes-and-make-some-methods-acces.patch

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Subject: [PATCH] feat: export some classes and make some methods accessible
1212
.../platform/actionWidget/browser/actionWidget.ts | 2 +-
1313
.../actions/browser/actionViewItemService.ts | 2 +-
1414
.../browser/extensionResourceLoaderService.ts | 2 +-
15+
src/vs/platform/files/common/fileService.ts | 6 +++---
1516
.../api/browser/statusBarExtensionPoint.ts | 2 +-
1617
src/vs/workbench/browser/layout.ts | 10 +++++-----
1718
src/vs/workbench/browser/workbench.ts | 14 +++++++-------
@@ -39,7 +40,7 @@ Subject: [PATCH] feat: export some classes and make some methods accessible
3940
.../terminal/common/embedderTerminalService.ts | 2 +-
4041
.../common/remoteUserDataProfiles.ts | 2 +-
4142
.../userDataSync/common/userDataSyncUtil.ts | 2 +-
42-
35 files changed, 60 insertions(+), 56 deletions(-)
43+
36 files changed, 63 insertions(+), 59 deletions(-)
4344

4445
diff --git a/src/vs/editor/contrib/editorState/browser/keybindingCancellation.ts b/src/vs/editor/contrib/editorState/browser/keybindingCancellation.ts
4546
index 94020ce96b9..de1e9af237e 100644
@@ -167,6 +168,23 @@ index 921674ef18e..00b83a75fcb 100644
167168

168169
declare readonly _serviceBrand: undefined;
169170

171+
diff --git a/src/vs/platform/files/common/fileService.ts b/src/vs/platform/files/common/fileService.ts
172+
index a5f6dc5023a..1220e0d5b6a 100644
173+
--- a/src/vs/platform/files/common/fileService.ts
174+
+++ b/src/vs/platform/files/common/fileService.ts
175+
@@ -243,9 +243,9 @@ export class FileService extends Disposable implements IFileService {
176+
});
177+
}
178+
179+
- private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType } & Partial<IStat>, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStat>;
180+
- private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat, siblings: number | undefined, resolveMetadata: true, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStatWithMetadata>;
181+
- private async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType } & Partial<IStat>, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStat> {
182+
+ protected async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType } & Partial<IStat>, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStat>;
183+
+ protected async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat, siblings: number | undefined, resolveMetadata: true, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStatWithMetadata>;
184+
+ protected async toFileStat(provider: IFileSystemProvider, resource: URI, stat: IStat | { type: FileType } & Partial<IStat>, siblings: number | undefined, resolveMetadata: boolean, recurse: (stat: IFileStat, siblings?: number) => boolean): Promise<IFileStat> {
185+
const { providerExtUri } = this.getExtUri(provider);
186+
187+
// convert to file stat
170188
diff --git a/src/vs/workbench/api/browser/statusBarExtensionPoint.ts b/src/vs/workbench/api/browser/statusBarExtensionPoint.ts
171189
index fa0d7fd2307..46a8443e46a 100644
172190
--- a/src/vs/workbench/api/browser/statusBarExtensionPoint.ts

vscode-patches/0045-refactor-split-code-to-be-able-to-import-only-requir.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -337,7 +337,7 @@ index 8697dcb34d4..5d7426ab0db 100644
337337

338338
interface IExtensionCacheData {
339339
diff --git a/src/vs/platform/files/common/fileService.ts b/src/vs/platform/files/common/fileService.ts
340-
index a5f6dc5023a..313c0ef2b26 100644
340+
index 1220e0d5b6a..c1e984953dd 100644
341341
--- a/src/vs/platform/files/common/fileService.ts
342342
+++ b/src/vs/platform/files/common/fileService.ts
343343
@@ -23,6 +23,64 @@ import { readFileIntoStream } from './io.js';

0 commit comments

Comments
 (0)