diff --git a/src/vs/base/node/processes.ts b/src/vs/base/node/processes.ts index 28ea85bff6f4d62c7cf4b14e8a8b4a8e62455bb8..799915f1e5afed035aa99140b969fcf5c9e8fdf1 100644 --- a/src/vs/base/node/processes.ts +++ b/src/vs/base/node/processes.ts @@ -485,4 +485,38 @@ export function createQueuedSender(childProcess: ChildProcess | NodeJS.Process): }; return { send }; -} \ No newline at end of file +} + + +export interface IEnv { + addDelayedEnvironment(promise: TPromise): any; + ready: TPromise; +} + +export const env: IEnv = new class { + + private _promises: TPromise[] = []; + + addDelayedEnvironment(promise: TPromise): any { + const p = TPromise.wrap(promise).then(env => { + // mixin new env + Objects.mixin(process.env, env, true); + }); + this._promises.push(p); + const remove = () => { + const idx = this._promises.indexOf(p); + if (idx >= 0) { + this._promises.splice(idx, 1); + } + }; + p.then(remove, remove); + } + + get ready(): TPromise { + if (this._promises.length === 0) { + return TPromise.as(undefined); + } else { + return TPromise.join(this._promises).then(() => this.ready); + } + } +}; diff --git a/src/vs/base/test/node/processes/processes.test.ts b/src/vs/base/test/node/processes/processes.test.ts index cd260f1c89b380527a7b4d2e7980f629853b7d63..d297830dc03fb8acc3146bf5129ba24f5ddb6d03 100644 --- a/src/vs/base/test/node/processes/processes.test.ts +++ b/src/vs/base/test/node/processes/processes.test.ts @@ -9,6 +9,7 @@ import * as assert from 'assert'; import * as cp from 'child_process'; import * as objects from 'vs/base/common/objects'; import * as platform from 'vs/base/common/platform'; +import { TPromise } from 'vs/base/common/winjs.base'; import URI from 'vs/base/common/uri'; import processes = require('vs/base/node/processes'); @@ -82,4 +83,17 @@ suite('Processes', () => { } }); }); -}); \ No newline at end of file + + test('env, ready by default', function () { + return processes.env.ready.then(() => { + assert.ok(true); + }); + }); + + test('env, delayed', function () { + processes.env.addDelayedEnvironment(TPromise.as({ foo: 1 })); + return processes.env.ready.then(() => { + assert.equal(process.env.foo, 1); + }); + }); +});