cli.ts 2.3 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';
J
Joao Moreno 已提交
9
import { parseCLIProcessArgv, buildHelpMessage, ParsedArgs } from 'vs/code/node/argv';
J
Joao Moreno 已提交
10
import product from 'vs/platform/product';
J
Joao Moreno 已提交
11
import pkg from 'vs/platform/package';
J
Joao Moreno 已提交
12

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

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

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

J
Joao Moreno 已提交
24 25 26 27 28 29 30 31
	try {
		args = parseCLIProcessArgv(argv);
	} catch (err) {
		console.error(err.message);
		return TPromise.as(null);
	}

	if (args.help) {
J
Joao Moreno 已提交
32
		console.log(buildHelpMessage(product.nameLong, product.applicationName, pkg.version));
J
Joao Moreno 已提交
33
	} else if (args.version) {
J
Joao Moreno 已提交
34
		console.log(`${ pkg.version } (${ product.commit })`);
J
Joao Moreno 已提交
35
	} else if (shouldSpawnCliProcess(args)) {
J
Joao Moreno 已提交
36
		const mainCli = new TPromise<IMainCli>(c => require(['vs/code/node/cliProcessMain'], c));
J
Joao Moreno 已提交
37
		return mainCli.then(cli => cli.main(args));
J
Joao Moreno 已提交
38
	} else {
39 40
		const env = assign({}, process.env, {
			// this will signal Code that it was spawned from this module
J
Joao Moreno 已提交
41 42
			'VSCODE_CLI': '1',
			'ELECTRON_NO_ATTACH_CONSOLE': '1'
43
		});
44
		delete env['ATOM_SHELL_INTERNAL_RUN_AS_NODE'];
J
Joao Moreno 已提交
45

46
		let options = {
D
Daniel Imms 已提交
47
			detached: true,
48 49
			env,
		};
J
Joao Moreno 已提交
50
		if (!args.verbose) {
51 52 53
			options['stdio'] = 'ignore';
		}

J
Joao Moreno 已提交
54
		const child = spawn(process.execPath, argv.slice(2), options);
55

J
Joao Moreno 已提交
56
		if (args.verbose) {
57 58 59
			child.stdout.on('data', (data) => console.log(data.toString('utf8').trim()));
			child.stderr.on('data', (data) => console.log(data.toString('utf8').trim()));
		}
60

J
Joao Moreno 已提交
61
		if (args.wait || args.verbose) {
62
			return new TPromise<void>(c => child.once('exit', () => c(null)));
63
		}
J
Joao Moreno 已提交
64 65
	}

J
Joao Moreno 已提交
66
	return TPromise.as(null);
J
Joao Moreno 已提交
67 68
}

J
Joao Moreno 已提交
69
main(process.argv)
J
Joao Moreno 已提交
70 71 72 73 74
	.then(() => process.exit(0))
	.then(null, err => {
		console.error(err.stack ? err.stack : err);
		process.exit(1);
	});