1 |
|
2 | var childProcess = require('child_process');
|
3 | var _ = require('lodash');
|
4 | var log = require('./log');
|
5 |
|
6 |
|
7 | module.exports = function(cmd, args, options, callback) {
|
8 | if (_.isFunction(options)) {
|
9 | callback = options;
|
10 | options = {};
|
11 | }
|
12 |
|
13 | _.defaults(options, {
|
14 | waitForExit: true,
|
15 | cwd: process.cwd,
|
16 | inheritStdio: false
|
17 | });
|
18 |
|
19 | var spawnOptions = {
|
20 | cwd: options.cwd,
|
21 | stdio: options.inheritStdio ? 'inherit' : 'pipe'
|
22 | };
|
23 |
|
24 | log.debug("Spawning child process %s %s", cmd, args)
|
25 |
|
26 | var spawned;
|
27 | if (process.platform === "win32")
|
28 | spawned = childProcess.spawn(process.env.comspec || "cmd.exe", [ "/c", cmd ].concat(args), spawnOptions);
|
29 | else
|
30 | spawned = childProcess.spawn(cmd, args, spawnOptions);
|
31 |
|
32 | spawned.on('error', function(err) {
|
33 | return callback(err);
|
34 | });
|
35 |
|
36 | if (options.inheritStdio !== true) {
|
37 | spawned.stdout.on('data', function(data) {
|
38 | var message = fixChildProcessOut(data.toString());
|
39 | if (_.isEmpty(message) === false)
|
40 | log({process: cmd, message: message});
|
41 | });
|
42 |
|
43 | spawned.stderr.on('data', function(data) {
|
44 | log({process: cmd, status: 'ERR!', color:'bgRed', message: data.toString()});
|
45 | });
|
46 | }
|
47 |
|
48 | if (options.waitForExit === true) {
|
49 | spawned.on('exit', function(code, signal) {
|
50 | if (code !== 0)
|
51 | return callback(Error.create("Error returned from " + cmd, {code: code}));
|
52 |
|
53 | callback();
|
54 | });
|
55 | }
|
56 | else
|
57 | callback();
|
58 | };
|
59 |
|
60 | function fixChildProcessOut(msg) {
|
61 |
|
62 |
|
63 |
|
64 |
|
65 | msg = msg.replace(/\u001b\[\d+m/g, "");
|
66 | msg = msg.replace(/^>>/, "");
|
67 | msg = msg.trim(msg);
|
68 | return msg.trim(msg);
|
69 | }
|