From 9ff29d17fb36c7efdf96f068d9fc9fb0da76a15f Mon Sep 17 00:00:00 2001 From: Asher Date: Fri, 7 May 2021 11:34:39 -0500 Subject: [PATCH 1/2] Make sure directories exist Fixes #3040. --- lib/vscode/src/vs/server/node/server.ts | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/vscode/src/vs/server/node/server.ts b/lib/vscode/src/vs/server/node/server.ts index a3708045..1d5de690 100644 --- a/lib/vscode/src/vs/server/node/server.ts +++ b/lib/vscode/src/vs/server/node/server.ts @@ -1,4 +1,4 @@ -import * as fs from 'fs'; +import { promises as fs } from 'fs'; import * as net from 'net'; import { hostname, release } from 'os'; import * as path from 'path'; @@ -213,8 +213,18 @@ export class Vscode { private async initializeServices(args: NativeParsedArgs): Promise { const productService = { _serviceBrand: undefined, ...product }; const environmentService = new NativeEnvironmentService(args, productService); - // https://github.com/cdr/code-server/issues/1693 - fs.mkdirSync(environmentService.globalStorageHome.fsPath, { recursive: true }); + + await Promise.all([ + environmentService.extensionsPath, + environmentService.logsPath, + environmentService.globalStorageHome.fsPath, + environmentService.workspaceStorageHome.fsPath, + ...environmentService.extraExtensionPaths, + ...environmentService.extraBuiltinExtensionPaths, + ].map((p) => fs.mkdir(p, { recursive: true }).catch((error) => { + logger.warn(error.message || error); + }))); + const logService = new MultiplexLogService([ new ConsoleLogger(getLogLevel(environmentService)), new SpdLogLogger(RemoteExtensionLogFileName, path.join(environmentService.logsPath, `${RemoteExtensionLogFileName}.log`), false, getLogLevel(environmentService)) From 51d294e163ec7bf7632b025fad7f531a28470fb8 Mon Sep 17 00:00:00 2001 From: Asher Date: Fri, 7 May 2021 11:43:19 -0500 Subject: [PATCH 2/2] Remove extension dir scan catch Now that we are creating the directories these shouldn't error. If they are somehow missing (if the user deletes them after VS Code starts for example) then I think we should surface that to the user. --- .../node/extensionsScanner.ts | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/lib/vscode/src/vs/platform/extensionManagement/node/extensionsScanner.ts b/lib/vscode/src/vs/platform/extensionManagement/node/extensionsScanner.ts index b59301aa..ffec784a 100644 --- a/lib/vscode/src/vs/platform/extensionManagement/node/extensionsScanner.ts +++ b/lib/vscode/src/vs/platform/extensionManagement/node/extensionsScanner.ts @@ -24,7 +24,7 @@ import { isWindows } from 'vs/base/common/platform'; import { flatten } from 'vs/base/common/arrays'; import { IStringDictionary } from 'vs/base/common/collections'; import { FileAccess } from 'vs/base/common/network'; -import { FileOperationError, FileOperationResult, IFileService } from 'vs/platform/files/common/files'; +import { IFileService } from 'vs/platform/files/common/files'; import { basename } from 'vs/base/common/resources'; import { generateUuid } from 'vs/base/common/uuid'; import { getErrorMessage } from 'vs/base/common/errors'; @@ -274,22 +274,11 @@ export class ExtensionsScanner extends Disposable { return [...systemExtensions, ...devSystemExtensions]; } + private async scanExtensionsInDir(dir: string, type: ExtensionType): Promise { const limiter = new Limiter(10); - /* - * NOTE@coder: use fileService.resolve() like upstream does, - * but simply ignore directories that do not exist. (upstream does not) - * - * Used to (<1.54) use pfs.readdir. - */ - const stat = await this.fileService.resolve(URI.file(dir)) - .catch((error) => { - if (!(error instanceof FileOperationError && error.fileOperationResult === FileOperationResult.FILE_NOT_FOUND)) { - throw error; - } - return undefined; - }); - if (stat && stat.children) { + const stat = await this.fileService.resolve(URI.file(dir)); + if (stat.children) { const extensions = await Promise.all(stat.children.filter(c => c.isDirectory) .map(c => limiter.queue(async () => { if (type === ExtensionType.User && basename(c.resource).indexOf('.') === 0) { // Do not consider user extension folder starting with `.`