diff --git a/src/vs/workbench/electron-browser/desktop.main.ts b/src/vs/workbench/electron-browser/desktop.main.ts index 19678d72168fe5d292eeb85315460e4a8ff8c011..93dcb0f386e73e6f024c1351d14666c6b24af6cf 100644 --- a/src/vs/workbench/electron-browser/desktop.main.ts +++ b/src/vs/workbench/electron-browser/desktop.main.ts @@ -6,7 +6,7 @@ import * as fs from 'fs'; import * as gracefulFs from 'graceful-fs'; import { createHash } from 'crypto'; -import { stat } from 'vs/base/node/pfs'; +import { exists, stat } from 'vs/base/node/pfs'; import { isLinux, isMacintosh, isWindows } from 'vs/base/common/platform'; import { zoomLevelToZoomFactor } from 'vs/platform/windows/common/windows'; import { mark } from 'vs/base/common/performance'; @@ -21,7 +21,7 @@ import { NativeWorkbenchEnvironmentService } from 'vs/workbench/services/environ import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService'; import { INativeWorkbenchConfiguration, INativeWorkbenchEnvironmentService } from 'vs/workbench/services/environment/electron-sandbox/environmentService'; import { ServiceCollection } from 'vs/platform/instantiation/common/serviceCollection'; -import { ISingleFolderWorkspaceIdentifier, IWorkspaceInitializationPayload, ISingleFolderWorkspaceInitializationPayload, reviveWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces'; +import { ISingleFolderWorkspaceIdentifier, IWorkspaceInitializationPayload, ISingleFolderWorkspaceInitializationPayload, reviveWorkspaceIdentifier, IWorkspaceIdentifier, IMultiFolderWorkspaceInitializationPayload } from 'vs/platform/workspaces/common/workspaces'; import { ILogService } from 'vs/platform/log/common/log'; import { NativeStorageService } from 'vs/platform/storage/node/storageService'; import { Schemas } from 'vs/base/common/network'; @@ -280,7 +280,7 @@ class DesktopMain extends Disposable { return service; }), - this.createKeyboardLayoutService(logService, mainProcessService).then(service => { + this.createKeyboardLayoutService(mainProcessService).then(service => { // KeyboardLayout serviceCollection.set(IKeyboardLayoutService, service); @@ -307,15 +307,15 @@ class DesktopMain extends Disposable { } private async resolveWorkspaceInitializationPayload(): Promise { + let workspaceInitializationPayload: IWorkspaceInitializationPayload | undefined; // Multi-root workspace if (this.configuration.workspace) { - return this.configuration.workspace; + workspaceInitializationPayload = await this.resolveMultiFolderWorkspaceInitializationPayload(this.configuration.workspace); } // Single-folder workspace - let workspaceInitializationPayload: IWorkspaceInitializationPayload | undefined; - if (this.configuration.folderUri) { + else if (this.configuration.folderUri) { workspaceInitializationPayload = await this.resolveSingleFolderWorkspaceInitializationPayload(this.configuration.folderUri); } @@ -336,6 +336,18 @@ class DesktopMain extends Disposable { return workspaceInitializationPayload; } + private async resolveMultiFolderWorkspaceInitializationPayload(workspace: IWorkspaceIdentifier): Promise { + + // It is possible that the workspace file does not exist + // on disk anymore, so we return `undefined` in that case + // (https://github.com/microsoft/vscode/issues/110982) + if (workspace.configPath.scheme === Schemas.file && !await exists(workspace.configPath.fsPath)) { + return undefined; + } + + return workspace; + } + private async resolveSingleFolderWorkspaceInitializationPayload(folderUri: ISingleFolderWorkspaceIdentifier): Promise { try { const folder = folderUri.scheme === Schemas.file @@ -388,7 +400,6 @@ class DesktopMain extends Disposable { return workspaceService; } catch (error) { onUnexpectedError(error); - logService.error(error); return workspaceService; } @@ -404,13 +415,12 @@ class DesktopMain extends Disposable { return storageService; } catch (error) { onUnexpectedError(error); - logService.error(error); return storageService; } } - private async createKeyboardLayoutService(logService: ILogService, mainProcessService: IMainProcessService): Promise { + private async createKeyboardLayoutService(mainProcessService: IMainProcessService): Promise { const keyboardLayoutService = new KeyboardLayoutService(mainProcessService); try { @@ -419,7 +429,6 @@ class DesktopMain extends Disposable { return keyboardLayoutService; } catch (error) { onUnexpectedError(error); - logService.error(error); return keyboardLayoutService; }