cli.ts 2.4 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';
B
Benjamin Pasero 已提交
9
import { parseCLIProcessArgv, buildHelpMessage, ParsedArgs } from 'vs/platform/environment/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
Johannes Rieken 已提交
34
		console.log(`${pkg.version}\n${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
		});
B
Benjamin Pasero 已提交
44

B
Benjamin Pasero 已提交
45
		delete env['ELECTRON_RUN_AS_NODE'];
J
Joao Moreno 已提交
46

B
Benjamin Pasero 已提交
47 48 49 50 51
		if (args.verbose) {
			env['ELECTRON_ENABLE_LOGGING'] = '1';
		}

		const options = {
D
Daniel Imms 已提交
52
			detached: true,
53 54
			env,
		};
B
Benjamin Pasero 已提交
55

J
Joao Moreno 已提交
56
		if (!args.verbose) {
57 58 59
			options['stdio'] = 'ignore';
		}

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

J
Joao Moreno 已提交
62
		if (args.verbose) {
63 64 65
			child.stdout.on('data', (data) => console.log(data.toString('utf8').trim()));
			child.stderr.on('data', (data) => console.log(data.toString('utf8').trim()));
		}
66

J
Joao Moreno 已提交
67
		if (args.wait || args.verbose) {
68
			return new TPromise<void>(c => child.once('exit', () => c(null)));
69
		}
J
Joao Moreno 已提交
70 71
	}

J
Joao Moreno 已提交
72
	return TPromise.as(null);
J
Joao Moreno 已提交
73 74
}

J
Joao Moreno 已提交
75
main(process.argv)
J
Joao Moreno 已提交
76 77 78 79 80
	.then(() => process.exit(0))
	.then(null, err => {
		console.error(err.stack ? err.stack : err);
		process.exit(1);
	});