UNPKG

1.78 kBJavaScriptView Raw
1// var spawn = require('child_process').spawn;
2var childProcess = require('child_process');
3var _ = require('lodash');
4var log = require('./log');
5
6// Execute a child process.
7module.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
60function fixChildProcessOut(msg) {
61 // Strip off any trailing linebreaks
62 // u001b[4mRunning "watch" task\u001b[24m
63
64 // Strip off unicode formatting codes
65 msg = msg.replace(/\u001b\[\d+m/g, "");
66 msg = msg.replace(/^>>/, "");
67 msg = msg.trim(msg);
68 return msg.trim(msg);
69}