From 8a67041ed9964def7794e9270f395b6548785700 Mon Sep 17 00:00:00 2001 From: Ramya Achutha Rao Date: Thu, 12 Oct 2017 11:54:16 -0700 Subject: [PATCH] Pass env via extension api when creating terminal --- src/vs/vscode.d.ts | 4 ++++ .../api/electron-browser/mainThreadTerminalService.ts | 5 +++-- src/vs/workbench/api/node/extHost.protocol.ts | 2 +- src/vs/workbench/api/node/extHostTerminalService.ts | 5 +++-- .../parts/tasks/electron-browser/terminalTaskSystem.ts | 9 +-------- .../parts/terminal/electron-browser/terminalInstance.ts | 8 +++++++- 6 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 4c7756fbfcb..a2df3e091fe 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -4852,6 +4852,10 @@ declare module 'vscode' { * Args for the custom shell executable, this does not work on Windows (see #8429) */ shellArgs?: string[]; + /** + * Object with environment variables that will be added to the VS Code process. + */ + env?: { [key: string]: string }; } /** diff --git a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts index a0c4d0db90f..aade4a664e3 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadTerminalService.ts @@ -33,13 +33,14 @@ export class MainThreadTerminalService implements MainThreadTerminalServiceShape // when the extension host process goes down ? } - public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], waitOnExit?: boolean): TPromise { + public $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], env?: { [key: string]: string }, waitOnExit?: boolean): TPromise { const shellLaunchConfig: IShellLaunchConfig = { name, executable: shellPath, args: shellArgs, waitOnExit, - ignoreConfigurationCwd: true + ignoreConfigurationCwd: true, + env }; return TPromise.as(this.terminalService.createInstance(shellLaunchConfig).id); } diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index a3d65955516..e14bb827cf8 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -280,7 +280,7 @@ export interface MainThreadProgressShape extends IDisposable { } export interface MainThreadTerminalServiceShape extends IDisposable { - $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], waitOnExit?: boolean): TPromise; + $createTerminal(name?: string, shellPath?: string, shellArgs?: string[], env?: { [key: string]: string }, waitOnExit?: boolean): TPromise; $dispose(terminalId: number): void; $hide(terminalId: number): void; $sendText(terminalId: number, text: string, addNewLine: boolean): void; diff --git a/src/vs/workbench/api/node/extHostTerminalService.ts b/src/vs/workbench/api/node/extHostTerminalService.ts index e42fc83d1f6..adcd7ddd9a1 100644 --- a/src/vs/workbench/api/node/extHostTerminalService.ts +++ b/src/vs/workbench/api/node/extHostTerminalService.ts @@ -24,6 +24,7 @@ export class ExtHostTerminal implements vscode.Terminal { name?: string, shellPath?: string, shellArgs?: string[], + env?: { [key: string]: string }, waitOnExit?: boolean ) { this._name = name; @@ -32,7 +33,7 @@ export class ExtHostTerminal implements vscode.Terminal { this._pidPromise = new TPromise(c => { this._pidPromiseComplete = c; }); - this._proxy.$createTerminal(name, shellPath, shellArgs, waitOnExit).then((id) => { + this._proxy.$createTerminal(name, shellPath, shellArgs, env, waitOnExit).then((id) => { this._id = id; this._queuedRequests.forEach((r) => { r.run(this._proxy, this._id); @@ -113,7 +114,7 @@ export class ExtHostTerminalService implements ExtHostTerminalServiceShape { } public createTerminalFromOptions(options: vscode.TerminalOptions): vscode.Terminal { - let terminal = new ExtHostTerminal(this._proxy, options.name, options.shellPath, options.shellArgs/*, options.waitOnExit*/); + let terminal = new ExtHostTerminal(this._proxy, options.name, options.shellPath, options.shellArgs, options.env/*, options.waitOnExit*/); this._terminals.push(terminal); return terminal; } diff --git a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts index 446001d7d91..39e7bb10cc6 100644 --- a/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts +++ b/src/vs/workbench/parts/tasks/electron-browser/terminalTaskSystem.ts @@ -549,14 +549,7 @@ export class TerminalTaskSystem extends EventEmitter implements ITaskSystem { shellLaunchConfig.cwd = options.cwd; } if (options.env) { - let env: IStringDictionary = Object.create(null); - Object.keys(process.env).forEach((key) => { - env[key] = process.env[key]; - }); - Object.keys(options.env).forEach((key) => { - env[key] = options.env[key]; - }); - shellLaunchConfig.env = env; + shellLaunchConfig.env = options.env; } let prefersSameTerminal = task.command.presentation.panel === PanelKind.Dedicated; let allowsSharedTerminal = task.command.presentation.panel === PanelKind.Shared; diff --git a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts index da798434930..8c365585b2f 100644 --- a/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts +++ b/src/vs/workbench/parts/terminal/electron-browser/terminalInstance.ts @@ -775,7 +775,13 @@ export class TerminalInstance implements ITerminalInstance { // TODO: This should be private/protected // TODO: locale should not be optional public static createTerminalEnv(parentEnv: IStringDictionary, shell: IShellLaunchConfig, cwd: string, locale?: string, cols?: number, rows?: number): IStringDictionary { - const env = shell.env ? shell.env : TerminalInstance._cloneEnv(parentEnv); + const env = TerminalInstance._cloneEnv(parentEnv); + if (shell.env) { + Object.keys(shell.env).forEach((key) => { + env[key] = shell.env[key]; + }); + } + env['PTYPID'] = process.pid.toString(); env['PTYSHELL'] = shell.executable; env['TERM_PROGRAM'] = 'vscode'; -- GitLab