提交 2f8c5c11 编写于 作者: J Joao Moreno

fixes #13561

上级 3c6f232d
...@@ -424,26 +424,6 @@ function getShellEnvironment(): TPromise<platform.IProcessEnvironment> { ...@@ -424,26 +424,6 @@ function getShellEnvironment(): TPromise<platform.IProcessEnvironment> {
return getUnixShellEnvironment(); return getUnixShellEnvironment();
} }
/**
* Returns the user environment necessary for all Code processes.
* Such environment needs to be propagated to the renderer/shared
* processes.
*/
function getEnvironment(accessor: ServicesAccessor): TPromise<platform.IProcessEnvironment> {
const environmentService = accessor.get(IEnvironmentService);
return getShellEnvironment().then(shellEnv => {
const instanceEnv = {
VSCODE_PID: String(process.pid),
VSCODE_IPC_HOOK: environmentService.mainIPCHandle,
VSCODE_SHARED_IPC_HOOK: environmentService.sharedIPCHandle,
VSCODE_NLS_CONFIG: process.env['VSCODE_NLS_CONFIG']
};
return assign({}, shellEnv, instanceEnv);
});
}
function createPaths(environmentService: IEnvironmentService): TPromise<any> { function createPaths(environmentService: IEnvironmentService): TPromise<any> {
const paths = [environmentService.appSettingsHome, environmentService.userHome, environmentService.extensionsPath]; const paths = [environmentService.appSettingsHome, environmentService.userHome, environmentService.extensionsPath];
...@@ -480,16 +460,30 @@ function start(): void { ...@@ -480,16 +460,30 @@ function start(): void {
// On some platforms we need to manually read from the global environment variables // On some platforms we need to manually read from the global environment variables
// and assign them to the process environment (e.g. when doubleclick app on Mac) // and assign them to the process environment (e.g. when doubleclick app on Mac)
return instantiationService.invokeFunction(accessor => { return getShellEnvironment().then(shellEnv => {
return getEnvironment(accessor).then(env => { // Patch `process.env` with the user's shell environment
assign(process.env, env); assign(process.env, shellEnv);
return instantiationService.invokeFunction(accessor => {
const environmentService = accessor.get(IEnvironmentService);
const instanceEnv = {
VSCODE_PID: String(process.pid),
VSCODE_IPC_HOOK: environmentService.mainIPCHandle,
VSCODE_SHARED_IPC_HOOK: environmentService.sharedIPCHandle,
VSCODE_NLS_CONFIG: process.env['VSCODE_NLS_CONFIG']
};
// Patch `process.env` with the instance's environment
assign(process.env, instanceEnv);
// Collect all environment patches to send to other processes
const env = assign({}, shellEnv, instanceEnv);
return instantiationService.invokeFunction(a => createPaths(a.get(IEnvironmentService))) return instantiationService.invokeFunction(a => createPaths(a.get(IEnvironmentService)))
.then(() => instantiationService.invokeFunction(setupIPC)) .then(() => instantiationService.invokeFunction(setupIPC))
.then(mainIpcServer => instantiationService.invokeFunction(main, mainIpcServer, env)); .then(mainIpcServer => instantiationService.invokeFunction(main, mainIpcServer, env));
}); });
}) }).done(null, err => instantiationService.invokeFunction(quit, err));
.done(null, err => instantiationService.invokeFunction(quit, err));
} }
start(); start();
...@@ -30,7 +30,7 @@ function getUniqueUserId(): string { ...@@ -30,7 +30,7 @@ function getUniqueUserId(): string {
return crypto.createHash('sha256').update(username).digest('hex').substr(0, 6); return crypto.createHash('sha256').update(username).digest('hex').substr(0, 6);
} }
function getIPCHandleBaseName(): string { function getIPCHandlePrefix(): string {
let name = pkg.name; let name = pkg.name;
// Support to run VS Code multiple times as different user // Support to run VS Code multiple times as different user
...@@ -47,8 +47,9 @@ function getIPCHandleBaseName(): string { ...@@ -47,8 +47,9 @@ function getIPCHandleBaseName(): string {
return path.join(os.tmpdir(), name); return path.join(os.tmpdir(), name);
} }
const IPCHandlePrefix = getIPCHandleBaseName(); function getIPCHandleSuffix(): string {
const IPCHandleSuffix = process.platform === 'win32' ? '-sock' : '.sock'; return process.platform === 'win32' ? '-sock' : '.sock';
}
export class EnvironmentService implements IEnvironmentService { export class EnvironmentService implements IEnvironmentService {
...@@ -97,10 +98,10 @@ export class EnvironmentService implements IEnvironmentService { ...@@ -97,10 +98,10 @@ export class EnvironmentService implements IEnvironmentService {
get logExtensionHostCommunication(): boolean { return this._args.logExtensionHostCommunication; } get logExtensionHostCommunication(): boolean { return this._args.logExtensionHostCommunication; }
@memoize @memoize
get mainIPCHandle(): string { return `${IPCHandlePrefix}-${pkg.version}${IPCHandleSuffix}`; } get mainIPCHandle(): string { return `${getIPCHandlePrefix()}-${pkg.version}${getIPCHandleSuffix()}`; }
@memoize @memoize
get sharedIPCHandle(): string { return `${IPCHandlePrefix}-${pkg.version}-shared${IPCHandleSuffix}`; } get sharedIPCHandle(): string { return `${getIPCHandlePrefix()}-${pkg.version}-shared${getIPCHandleSuffix()}`; }
constructor(private _args: ParsedArgs, private _execPath: string) { } constructor(private _args: ParsedArgs, private _execPath: string) { }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册