diff --git a/package.json b/package.json index 64ccdef8d86..bf115f5bb54 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ }, "dependencies": { "applicationinsights": "1.0.8", - "chokidar": "3.2.3", + "chokidar": "3.4.2", "graceful-fs": "4.2.3", "http-proxy-agent": "^2.1.0", "https-proxy-agent": "^2.2.3", diff --git a/remote/package.json b/remote/package.json index 4258f46d2b5..187c951af64 100644 --- a/remote/package.json +++ b/remote/package.json @@ -3,7 +3,7 @@ "version": "0.0.0", "dependencies": { "applicationinsights": "1.0.8", - "chokidar": "3.2.3", + "chokidar": "3.4.2", "cookie": "^0.4.0", "graceful-fs": "4.2.3", "http-proxy-agent": "^2.1.0", diff --git a/remote/yarn.lock b/remote/yarn.lock index b4592d2166f..748e983bd3c 100644 --- a/remote/yarn.lock +++ b/remote/yarn.lock @@ -69,10 +69,10 @@ buffer-crc32@~0.2.3: resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= -chokidar@3.2.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.2.3.tgz#b9270a565d14f02f6bfdd537a6a2bbf5549b8c8c" - integrity sha512-GtrxGuRf6bzHQmXWRepvsGnXpkQkVU+D2/9a7dAe4a7v1NhrfZOZ2oKf76M3nOs46fFYL8D+Q8JYA4GYeJ8Cjw== +chokidar@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -80,9 +80,9 @@ chokidar@3.2.3: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.2.0" + readdirp "~3.4.0" optionalDependencies: - fsevents "~2.1.1" + fsevents "~2.1.2" cookie@^0.4.0: version "0.4.0" @@ -155,10 +155,10 @@ fs-extra@^7.0.0: jsonfile "^4.0.0" universalify "^0.1.0" -fsevents@~2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.1.tgz#74c64e21df71721845d0c44fe54b7f56b82995a9" - integrity sha512-4FRPXWETxtigtJW/gxzEDsX1LVbPAM93VleB83kZB+ellqbHMkyt2aJfuzNLRvFPnGi6bcE5SvfxgbXPeKteJw== +fsevents@~2.1.2: + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== glob-parent@~5.1.0: version "5.1.0" @@ -316,17 +316,22 @@ picomatch@^2.0.4: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.0.7.tgz#514169d8c7cd0bdbeecc8a2609e34a7163de69f6" integrity sha512-oLHIdio3tZ0qH76NybpeneBhYVj0QFTfXEFTc/B3zKQspYfYYkWYgFsmzo+4kvId/bQRcNkVeguI3y+CD22BtA== +picomatch@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" + integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== -readdirp@~3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.2.0.tgz#c30c33352b12c96dfb4b895421a49fd5a9593839" - integrity sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.4" + picomatch "^2.2.1" semver-umd@^5.5.7: version "5.5.7" diff --git a/src/vs/platform/files/common/files.ts b/src/vs/platform/files/common/files.ts index 2b046ac4a59..bfbf6074d35 100644 --- a/src/vs/platform/files/common/files.ts +++ b/src/vs/platform/files/common/files.ts @@ -856,6 +856,7 @@ export function whenProviderRegistered(file: URI, fileService: IFileService): Pr if (fileService.canHandleResource(URI.from({ scheme: file.scheme }))) { return Promise.resolve(); } + return new Promise((c, e) => { const disposable = fileService.onDidChangeFileSystemProviderRegistrations(e => { if (e.scheme === file.scheme && e.added) { diff --git a/src/vs/platform/files/node/watcher/nodejs/watcherService.ts b/src/vs/platform/files/node/watcher/nodejs/watcherService.ts index 1475b56d004..16c5428714b 100644 --- a/src/vs/platform/files/node/watcher/nodejs/watcherService.ts +++ b/src/vs/platform/files/node/watcher/nodejs/watcherService.ts @@ -85,7 +85,7 @@ export class FileWatcher extends Disposable { } // Handle emit through delayer to accommodate for bulk changes and thus reduce spam - this.fileChangesDelayer.trigger(() => { + this.fileChangesDelayer.trigger(async () => { const fileChanges = this.fileChangesBuffer; this.fileChangesBuffer = []; @@ -103,8 +103,6 @@ export class FileWatcher extends Disposable { if (normalizedFileChanges.length > 0) { this.onDidFilesChange(normalizedFileChanges); } - - return Promise.resolve(); }); } diff --git a/src/vs/platform/files/node/watcher/nsfw/nsfwWatcherService.ts b/src/vs/platform/files/node/watcher/nsfw/nsfwWatcherService.ts index d2ea2f048a6..b57cdd85009 100644 --- a/src/vs/platform/files/node/watcher/nsfw/nsfwWatcherService.ts +++ b/src/vs/platform/files/node/watcher/nsfw/nsfwWatcherService.ts @@ -22,8 +22,8 @@ nsfwActionToRawChangeType[nsfw.actions.MODIFIED] = FileChangeType.UPDATED; nsfwActionToRawChangeType[nsfw.actions.DELETED] = FileChangeType.DELETED; interface IWatcherObjet { - start(): any; - stop(): any; + start(): void; + stop(): void; } interface IPathWatcher { @@ -142,7 +142,7 @@ export class NsfwWatcherService implements IWatcherService { } // Delay and send buffer - fileEventDelayer.trigger(() => { + fileEventDelayer.trigger(async () => { const events = undeliveredFileEvents; undeliveredFileEvents = []; @@ -169,8 +169,6 @@ export class NsfwWatcherService implements IWatcherService { this.log(` >> normalized ${r.type === FileChangeType.ADDED ? '[ADDED]' : r.type === FileChangeType.DELETED ? '[DELETED]' : '[CHANGED]'} ${r.path}`); }); } - - return Promise.resolve(undefined); }); }).then(watcher => { this._pathWatchers[request.path].watcher = watcher; @@ -180,8 +178,7 @@ export class NsfwWatcherService implements IWatcherService { }); } - public setRoots(roots: IWatcherRequest[]): Promise { - const promises: Promise[] = []; + async setRoots(roots: IWatcherRequest[]): Promise { const normalizedRoots = this._normalizeRoots(roots); // Gather roots that are not currently being watched @@ -214,23 +211,19 @@ export class NsfwWatcherService implements IWatcherService { this._pathWatchers[root.path].ignored = Array.isArray(root.excludes) ? root.excludes.map(ignored => glob.parse(ignored)) : []; } }); - - return Promise.all(promises).then(() => undefined); } - public setVerboseLogging(enabled: boolean): Promise { + async setVerboseLogging(enabled: boolean): Promise { this._verboseLogging = enabled; - return Promise.resolve(undefined); } - public stop(): Promise { + async stop(): Promise { for (let path in this._pathWatchers) { let watcher = this._pathWatchers[path]; watcher.ready.then(watcher => watcher.stop()); delete this._pathWatchers[path]; } this._pathWatchers = Object.create(null); - return Promise.resolve(); } /** diff --git a/src/vs/platform/files/node/watcher/nsfw/test/nsfwWatcherService.test.ts b/src/vs/platform/files/node/watcher/nsfw/test/nsfwWatcherService.test.ts index e7c28c9d760..20f000d6e76 100644 --- a/src/vs/platform/files/node/watcher/nsfw/test/nsfwWatcherService.test.ts +++ b/src/vs/platform/files/node/watcher/nsfw/test/nsfwWatcherService.test.ts @@ -10,11 +10,14 @@ import { NsfwWatcherService } from 'vs/platform/files/node/watcher/nsfw/nsfwWatc import { IWatcherRequest } from 'vs/platform/files/node/watcher/nsfw/watcher'; class TestNsfwWatcherService extends NsfwWatcherService { - public normalizeRoots(roots: string[]): string[] { + + normalizeRoots(roots: string[]): string[] { + // Work with strings as paths to simplify testing const requests: IWatcherRequest[] = roots.map(r => { return { path: r, excludes: [] }; }); + return this._normalizeRoots(requests).map(r => r.path); } } diff --git a/src/vs/platform/files/node/watcher/unix/chokidarWatcherService.ts b/src/vs/platform/files/node/watcher/unix/chokidarWatcherService.ts index 0ad9904baf2..4e82c266f27 100644 --- a/src/vs/platform/files/node/watcher/unix/chokidarWatcherService.ts +++ b/src/vs/platform/files/node/watcher/unix/chokidarWatcherService.ts @@ -23,7 +23,7 @@ process.noAsar = true; // disable ASAR support in watcher process interface IWatcher { requests: ExtendedWatcherRequest[]; - stop(): any; + stop(): Promise; } interface ExtendedWatcherRequest extends IWatcherRequest { @@ -61,13 +61,11 @@ export class ChokidarWatcherService implements IWatcherService { return this.onWatchEvent; } - setVerboseLogging(enabled: boolean): Promise { + async setVerboseLogging(enabled: boolean): Promise { this._verboseLogging = enabled; - - return Promise.resolve(); } - setRoots(requests: IWatcherRequest[]): Promise { + async setRoots(requests: IWatcherRequest[]): Promise { const watchers = Object.create(null); const newRequests: string[] = []; @@ -86,7 +84,7 @@ export class ChokidarWatcherService implements IWatcherService { // stop all old watchers for (const path in this._watchers) { - this._watchers[path].stop(); + await this._watchers[path].stop(); } // start all new watchers @@ -96,7 +94,6 @@ export class ChokidarWatcherService implements IWatcherService { } this._watchers = watchers; - return Promise.resolve(); } // for test purposes @@ -166,13 +163,13 @@ export class ChokidarWatcherService implements IWatcherService { const watcher: IWatcher = { requests, - stop: () => { + stop: async () => { try { if (this._verboseLogging) { this.log(`Stop watching: ${basePath}]`); } if (chokidarWatcher) { - chokidarWatcher.close(); + await chokidarWatcher.close(); this._watcherCount--; chokidarWatcher = null; } @@ -248,8 +245,9 @@ export class ChokidarWatcherService implements IWatcherService { undeliveredFileEvents.push(event); if (fileEventDelayer) { + // Delay and send buffer - fileEventDelayer.trigger(() => { + fileEventDelayer.trigger(async () => { const events = undeliveredFileEvents; undeliveredFileEvents = []; @@ -264,7 +262,7 @@ export class ChokidarWatcherService implements IWatcherService { }); } - return Promise.resolve(undefined); + return undefined; }); } }); @@ -291,15 +289,13 @@ export class ChokidarWatcherService implements IWatcherService { return watcher; } - stop(): Promise { + async stop(): Promise { for (const path in this._watchers) { const watcher = this._watchers[path]; - watcher.stop(); + await watcher.stop(); } this._watchers = Object.create(null); - - return Promise.resolve(); } private log(message: string) { diff --git a/src/vs/platform/files/node/watcher/win32/csharpWatcherService.ts b/src/vs/platform/files/node/watcher/win32/csharpWatcherService.ts index 0b4ea4ca211..9eda54b3c90 100644 --- a/src/vs/platform/files/node/watcher/win32/csharpWatcherService.ts +++ b/src/vs/platform/files/node/watcher/win32/csharpWatcherService.ts @@ -131,7 +131,7 @@ export class OutOfProcessWin32FolderWatcher { this.logCallback({ type: 'trace', message: `[File Watcher (C#)] ${message}` }); } - public dispose(): void { + dispose(): void { if (this.handle) { this.handle.kill(); this.handle = undefined; diff --git a/src/vs/platform/files/test/common/nullFileSystemProvider.ts b/src/vs/platform/files/test/common/nullFileSystemProvider.ts index 27250d0a7d1..7f47f2006d0 100644 --- a/src/vs/platform/files/test/common/nullFileSystemProvider.ts +++ b/src/vs/platform/files/test/common/nullFileSystemProvider.ts @@ -26,16 +26,16 @@ export class NullFileSystemProvider implements IFileSystemProvider { constructor(private disposableFactory: () => IDisposable = () => Disposable.None) { } watch(resource: URI, opts: IWatchOptions): IDisposable { return this.disposableFactory(); } - stat(resource: URI): Promise { return Promise.resolve(undefined!); } - mkdir(resource: URI): Promise { return Promise.resolve(undefined!); } - readdir(resource: URI): Promise<[string, FileType][]> { return Promise.resolve(undefined!); } - delete(resource: URI, opts: FileDeleteOptions): Promise { return Promise.resolve(undefined!); } - rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise { return Promise.resolve(undefined!); } - copy?(from: URI, to: URI, opts: FileOverwriteOptions): Promise { return Promise.resolve(undefined!); } - readFile?(resource: URI): Promise { return Promise.resolve(undefined!); } - writeFile?(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { return Promise.resolve(undefined!); } - open?(resource: URI, opts: FileOpenOptions): Promise { return Promise.resolve(undefined!); } - close?(fd: number): Promise { return Promise.resolve(undefined!); } - read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { return Promise.resolve(undefined!); } - write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { return Promise.resolve(undefined!); } + async stat(resource: URI): Promise { return undefined!; } + async mkdir(resource: URI): Promise { return undefined; } + async readdir(resource: URI): Promise<[string, FileType][]> { return undefined!; } + async delete(resource: URI, opts: FileDeleteOptions): Promise { return undefined; } + async rename(from: URI, to: URI, opts: FileOverwriteOptions): Promise { return undefined; } + async copy?(from: URI, to: URI, opts: FileOverwriteOptions): Promise { return undefined; } + async readFile?(resource: URI): Promise { return undefined!; } + async writeFile?(resource: URI, content: Uint8Array, opts: FileWriteOptions): Promise { return undefined; } + async open?(resource: URI, opts: FileOpenOptions): Promise { return undefined!; } + async close?(fd: number): Promise { return undefined; } + async read?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { return undefined!; } + async write?(fd: number, pos: number, data: Uint8Array, offset: number, length: number): Promise { return undefined!; } } diff --git a/yarn.lock b/yarn.lock index 1e6c4b9cef6..b3a08230717 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1629,7 +1629,7 @@ cheerio@^1.0.0-rc.1: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@*, chokidar@3.2.3: +chokidar@*: version "3.2.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.2.3.tgz#b9270a565d14f02f6bfdd537a6a2bbf5549b8c8c" integrity sha512-GtrxGuRf6bzHQmXWRepvsGnXpkQkVU+D2/9a7dAe4a7v1NhrfZOZ2oKf76M3nOs46fFYL8D+Q8JYA4GYeJ8Cjw== @@ -1644,6 +1644,21 @@ chokidar@*, chokidar@3.2.3: optionalDependencies: fsevents "~2.1.1" +chokidar@3.4.2: + version "3.4.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.2.tgz#38dc8e658dec3809741eb3ef7bb0a47fe424232d" + integrity sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A== + dependencies: + anymatch "~3.1.1" + braces "~3.0.2" + glob-parent "~5.1.0" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.4.0" + optionalDependencies: + fsevents "~2.1.2" + chokidar@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.0.tgz#5fcb70d0b28ebe0867eb0f09d5f6a08f29a1efa0"