cli.ts 2.1 KB
Newer Older
J
Joao Moreno 已提交
1 2 3 4 5 6
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

import { spawn } from 'child_process';
J
Joao Moreno 已提交
7
import { TPromise } from 'vs/base/common/winjs.base';
J
Joao Moreno 已提交
8
import { assign } from 'vs/base/common/objects';
D
Daniel Imms 已提交
9
import { parseArgs, buildHelpMessage, ParsedArgs } from 'vs/code/node/argv';
J
Joao Moreno 已提交
10
import pkg from 'vs/platform/package';
J
Joao Moreno 已提交
11

J
Joao Moreno 已提交
12
function shouldSpawnCliProcess(argv: ParsedArgs): boolean {
J
Joao Moreno 已提交
13
	return argv['list-extensions'] || !!argv['install-extension'] || !!argv['uninstall-extension'];
J
Joao Moreno 已提交
14 15 16 17 18 19 20
}

interface IMainCli {
	main: (argv: ParsedArgs) => TPromise<void>;
}

export function main(args: string[]): TPromise<void> {
J
Joao Moreno 已提交
21
	const argv = parseArgs(args);
J
Joao Moreno 已提交
22

J
Joao Moreno 已提交
23
	if (argv.help) {
D
Daniel Imms 已提交
24
		console.log(buildHelpMessage(pkg.version));
J
Joao Moreno 已提交
25
	} else if (argv.version) {
J
Joao Moreno 已提交
26
		console.log(pkg.version);
J
Joao Moreno 已提交
27 28 29
	} else if (shouldSpawnCliProcess(argv)) {
		const mainCli = new TPromise<IMainCli>(c => require(['vs/code/node/cliProcessMain'], c));
		return mainCli.then(cli => cli.main(argv));
J
Joao Moreno 已提交
30
	} else {
31 32
		const env = assign({}, process.env, {
			// this will signal Code that it was spawned from this module
J
Joao Moreno 已提交
33 34
			'VSCODE_CLI': '1',
			'ELECTRON_NO_ATTACH_CONSOLE': '1'
35
		});
36
		delete env['ATOM_SHELL_INTERNAL_RUN_AS_NODE'];
J
Joao Moreno 已提交
37

38
		let options = {
D
Daniel Imms 已提交
39
			detached: true,
40 41 42 43 44 45 46 47 48 49 50 51
			env,
		};
		if (!argv.verbose) {
			options['stdio'] = 'ignore';
		}

		const child = spawn(process.execPath, args, options);

		if (argv.verbose) {
			child.stdout.on('data', (data) => console.log(data.toString('utf8').trim()));
			child.stderr.on('data', (data) => console.log(data.toString('utf8').trim()));
		}
52

53 54
		if (argv.wait || argv.verbose) {
			return new TPromise<void>(c => child.once('exit', () => c(null)));
55
		}
J
Joao Moreno 已提交
56 57
	}

J
Joao Moreno 已提交
58
	return TPromise.as(null);
J
Joao Moreno 已提交
59 60
}

J
Joao Moreno 已提交
61 62 63 64 65 66
main(process.argv.slice(2))
	.then(() => process.exit(0))
	.then(null, err => {
		console.error(err.stack ? err.stack : err);
		process.exit(1);
	});