From f3ca4f6e09832eea66e325e86d340b4c3575356d Mon Sep 17 00:00:00 2001 From: Michel Kaporin Date: Tue, 9 May 2017 12:06:05 +0200 Subject: [PATCH] Added handling for multiple '--user-data-dir' to enable Spectron smoke testing in #25291. --- src/main.js | 9 ++++++++- src/vs/platform/environment/node/argv.ts | 9 ++++++++- .../environment/test/node/environmentService.test.ts | 7 +++++++ 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main.js b/src/main.js index 43a92f8069a..bf1c9542f1b 100644 --- a/src/main.js +++ b/src/main.js @@ -170,8 +170,15 @@ function mkdir(dir) { }); } +// Because Spectron doesn't allow us to pass a custom user-data-dir, +// Code receives two of them. Let's just take the first one. +var userDataDir = args['user-data-dir']; +if (userDataDir) { + userDataDir = typeof userDataDir === 'string' ? userDataDir : userDataDir[0]; +} + // Set userData path before app 'ready' event and call to process.chdir -var userData = path.resolve(args['user-data-dir'] || paths.getDefaultUserDataPath(process.platform)); +var userData = path.resolve(userDataDir || paths.getDefaultUserDataPath(process.platform)); app.setPath('userData', userData); // Update cwd based on environment and platform diff --git a/src/vs/platform/environment/node/argv.ts b/src/vs/platform/environment/node/argv.ts index b5bd5de2417..757875134f8 100644 --- a/src/vs/platform/environment/node/argv.ts +++ b/src/vs/platform/environment/node/argv.ts @@ -105,7 +105,14 @@ export function parseCLIProcessArgv(processArgv: string[]): ParsedArgs { * Use this to parse code arguments such as `--verbose --wait` */ export function parseArgs(args: string[]): ParsedArgs { - return minimist(args, options) as ParsedArgs; + const result = minimist(args, options) as ParsedArgs; + + // Because Spectron doesn't allow us to pass a custom user-data-dir, + // Code receives two of them. Let's just take the first one. + const userDataDir: string | string[] = result['user-data-dir']; + result['user-data-dir'] = typeof userDataDir === 'string' ? userDataDir : userDataDir[0]; + + return result; } export const optionsHelp: { [name: string]: string; } = { diff --git a/src/vs/platform/environment/test/node/environmentService.test.ts b/src/vs/platform/environment/test/node/environmentService.test.ts index 1f3b16ab944..44617be5a87 100644 --- a/src/vs/platform/environment/test/node/environmentService.test.ts +++ b/src/vs/platform/environment/test/node/environmentService.test.ts @@ -41,4 +41,11 @@ suite('EnvironmentService', () => { assert.equal(parse(['--user-data-dir', './dir'], { cwd: () => '/foo', env: { 'VSCODE_CWD': '/bar' } }), path.resolve('/bar/dir'), 'should use VSCODE_CWD as the cwd when --user-data-dir is specified'); }); + + test('userDataPath should always take the first one', () => { + const parse = (a, b: { cwd: () => string, env: { [key: string]: string } }) => parseUserDataDir(parseArgs(a), b); + + assert.equal(parse(['--user-data-dir', './dir1', '--user-data-dir', './dir2'], { cwd: () => '/foo', env: {} }), path.resolve('/foo/dir1'), + 'should pick first --user-data-dir (dir1)'); + }); }); \ No newline at end of file