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 `.` 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))