From b43174e1b275850f5b80d170e47c1c04eb780790 Mon Sep 17 00:00:00 2001 From: Andre Weinand Date: Thu, 27 Jun 2019 12:02:21 +0200 Subject: [PATCH] properly pass env vars to new VS Code instance; fixes #76212 --- src/vs/platform/windows/common/windows.ts | 2 +- .../windows/electron-browser/windowsService.ts | 5 +++-- .../platform/windows/electron-main/windowsService.ts | 7 ++++--- src/vs/platform/windows/node/windowsIpc.ts | 2 +- src/vs/workbench/browser/web.simpleservices.ts | 3 ++- .../contrib/debug/browser/rawDebugSession.ts | 11 ++++++++++- src/vs/workbench/test/workbenchTestServices.ts | 4 ++-- 7 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/vs/platform/windows/common/windows.ts b/src/vs/platform/windows/common/windows.ts index 9075b9e7416..19abdf93184 100644 --- a/src/vs/platform/windows/common/windows.ts +++ b/src/vs/platform/windows/common/windows.ts @@ -153,7 +153,7 @@ export interface IWindowsService { // Global methods openWindow(windowId: number, uris: IURIToOpen[], options: IOpenSettings): Promise; openNewWindow(options?: INewWindowOptions): Promise; - openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise; + openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise; getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]>; getWindowCount(): Promise; log(severity: string, ...messages: string[]): Promise; diff --git a/src/vs/platform/windows/electron-browser/windowsService.ts b/src/vs/platform/windows/electron-browser/windowsService.ts index 1eb8c60b8ee..34ec58fc49a 100644 --- a/src/vs/platform/windows/electron-browser/windowsService.ts +++ b/src/vs/platform/windows/electron-browser/windowsService.ts @@ -12,6 +12,7 @@ import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { URI } from 'vs/base/common/uri'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { IMainProcessService } from 'vs/platform/ipc/electron-browser/mainProcessService'; +import { IProcessEnvironment } from 'vs/base/common/platform'; export class WindowsService implements IWindowsService { @@ -195,8 +196,8 @@ export class WindowsService implements IWindowsService { return this.channel.call('openNewWindow', options); } - openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { - return this.channel.call('openExtensionDevelopmentHostWindow', args); + openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { + return this.channel.call('openExtensionDevelopmentHostWindow', [args, env]); } async getWindows(): Promise<{ id: number; workspace?: IWorkspaceIdentifier; folderUri?: ISingleFolderWorkspaceIdentifier; title: string; filename?: string; }[]> { diff --git a/src/vs/platform/windows/electron-main/windowsService.ts b/src/vs/platform/windows/electron-main/windowsService.ts index 1c3c4734384..da1b56c7ee9 100644 --- a/src/vs/platform/windows/electron-main/windowsService.ts +++ b/src/vs/platform/windows/electron-main/windowsService.ts @@ -21,7 +21,7 @@ import { IWorkspaceIdentifier, ISingleFolderWorkspaceIdentifier } from 'vs/platf import { ISerializableCommandAction } from 'vs/platform/actions/common/actions'; import { Schemas } from 'vs/base/common/network'; import { mnemonicButtonLabel } from 'vs/base/common/labels'; -import { isMacintosh, isLinux } from 'vs/base/common/platform'; +import { isMacintosh, isLinux, IProcessEnvironment } from 'vs/base/common/platform'; import { ILogService } from 'vs/platform/log/common/log'; import { ServiceIdentifier } from 'vs/platform/instantiation/common/instantiation'; @@ -306,13 +306,14 @@ export class WindowsService extends Disposable implements IWindowsService, IURLH this.windowsMainService.openNewWindow(OpenContext.API, options); } - async openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + async openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { this.logService.trace('windowsService#openExtensionDevelopmentHostWindow ' + JSON.stringify(args)); if (args.extensionDevelopmentPath) { this.windowsMainService.openExtensionDevelopmentHostWindow(args.extensionDevelopmentPath, { context: OpenContext.API, - cli: args + cli: args, + userEnv: Object.keys(env).length > 0 ? env : undefined }); } } diff --git a/src/vs/platform/windows/node/windowsIpc.ts b/src/vs/platform/windows/node/windowsIpc.ts index 30876b55e10..6fbad27a549 100644 --- a/src/vs/platform/windows/node/windowsIpc.ts +++ b/src/vs/platform/windows/node/windowsIpc.ts @@ -102,7 +102,7 @@ export class WindowsChannel implements IServerChannel { return this.service.openWindow(arg[0], urisToOpen, options); } case 'openNewWindow': return this.service.openNewWindow(arg); - case 'openExtensionDevelopmentHostWindow': return this.service.openExtensionDevelopmentHostWindow(arg); + case 'openExtensionDevelopmentHostWindow': return this.service.openExtensionDevelopmentHostWindow(arg[0], arg[1]); case 'getWindows': return this.service.getWindows(); case 'getWindowCount': return this.service.getWindowCount(); case 'relaunch': return this.service.relaunch(arg[0]); diff --git a/src/vs/workbench/browser/web.simpleservices.ts b/src/vs/workbench/browser/web.simpleservices.ts index 6df0b784daf..b253e573ae5 100644 --- a/src/vs/workbench/browser/web.simpleservices.ts +++ b/src/vs/workbench/browser/web.simpleservices.ts @@ -52,6 +52,7 @@ import { IFileService } from 'vs/platform/files/common/files'; import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { ClassifiedEvent, StrictPropertyCheck, GDPRClassification } from 'vs/platform/telemetry/common/gdprTypings'; +import { IProcessEnvironment } from 'vs/base/common/platform'; //#region Backup File @@ -1119,7 +1120,7 @@ export class SimpleWindowsService implements IWindowsService { return Promise.resolve(); } - openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { return Promise.resolve(); } diff --git a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts index b4828af8340..1fdbad5a8f9 100644 --- a/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts +++ b/src/vs/workbench/contrib/debug/browser/rawDebugSession.ts @@ -16,6 +16,7 @@ import { ISignService } from 'vs/platform/sign/common/sign'; import { ParsedArgs } from 'vs/platform/environment/common/environment'; import { IWindowsService } from 'vs/platform/windows/common/windows'; import { URI } from 'vs/base/common/uri'; +import { IProcessEnvironment } from 'vs/base/common/platform'; /** * This interface represents a single command line argument split into a "prefix" and a "path" half. @@ -606,7 +607,15 @@ export class RawDebugSession { } } - return this.windowsService.openExtensionDevelopmentHostWindow(args); + let env: IProcessEnvironment = {}; + if (vscodeArgs.env) { + // merge environment variables into a copy of the process.env + env = objects.mixin(objects.mixin(env, process.env), vscodeArgs.env); + // and delete some if necessary + Object.keys(env).filter(k => env[k] === null).forEach(key => delete env[key]); + } + + return this.windowsService.openExtensionDevelopmentHostWindow(args, env); } private send(command: string, args: any, timeout?: number): Promise { diff --git a/src/vs/workbench/test/workbenchTestServices.ts b/src/vs/workbench/test/workbenchTestServices.ts index 01b3c98401c..45bf09e967a 100644 --- a/src/vs/workbench/test/workbenchTestServices.ts +++ b/src/vs/workbench/test/workbenchTestServices.ts @@ -71,7 +71,7 @@ import { IViewletService } from 'vs/workbench/services/viewlet/browser/viewlet'; import { ViewletDescriptor, Viewlet } from 'vs/workbench/browser/viewlet'; import { IViewlet } from 'vs/workbench/common/viewlet'; import { IStorageService, InMemoryStorageService } from 'vs/platform/storage/common/storage'; -import { isLinux, isMacintosh } from 'vs/base/common/platform'; +import { isLinux, isMacintosh, IProcessEnvironment } from 'vs/base/common/platform'; import { LabelService } from 'vs/workbench/services/label/common/labelService'; import { IDimension } from 'vs/platform/layout/browser/layoutService'; import { Part } from 'vs/workbench/browser/part'; @@ -1447,7 +1447,7 @@ export class TestWindowsService implements IWindowsService { return Promise.resolve(); } - openExtensionDevelopmentHostWindow(args: ParsedArgs): Promise { + openExtensionDevelopmentHostWindow(args: ParsedArgs, env: IProcessEnvironment): Promise { return Promise.resolve(); }