Spaces:
Sleeping
Sleeping
const path = require('path'); | |
const utils = require('./utils'); | |
const merge = utils.merge; | |
const bus = utils.bus; | |
const spawn = require('child_process').spawn; | |
module.exports = function spawnCommand(command, config, eventArgs) { | |
var stdio = ['pipe', 'pipe', 'pipe']; | |
if (config.options.stdout) { | |
stdio = ['pipe', process.stdout, process.stderr]; | |
} | |
const env = merge(process.env, { FILENAME: eventArgs[0] }); | |
var sh = 'sh'; | |
var shFlag = '-c'; | |
var spawnOptions = { | |
env: merge(config.options.execOptions.env, env), | |
stdio: stdio, | |
}; | |
if (!Array.isArray(command)) { | |
command = [command]; | |
} | |
if (utils.isWindows) { | |
// if the exec includes a forward slash, reverse it for windows compat | |
// but *only* apply to the first command, and none of the arguments. | |
// ref #1251 and #1236 | |
command = command.map(executable => { | |
if (executable.indexOf('/') === -1) { | |
return executable; | |
} | |
return executable.split(' ').map((e, i) => { | |
if (i === 0) { | |
return path.normalize(e); | |
} | |
return e; | |
}).join(' '); | |
}); | |
// taken from npm's cli: https://git.io/vNFD4 | |
sh = process.env.comspec || 'cmd'; | |
shFlag = '/d /s /c'; | |
spawnOptions.windowsVerbatimArguments = true; | |
spawnOptions.windowsHide = true; | |
} | |
const args = command.join(' '); | |
const child = spawn(sh, [shFlag, args], spawnOptions); | |
if (config.required) { | |
var emit = { | |
stdout: function (data) { | |
bus.emit('stdout', data); | |
}, | |
stderr: function (data) { | |
bus.emit('stderr', data); | |
}, | |
}; | |
// now work out what to bind to... | |
if (config.options.stdout) { | |
child.on('stdout', emit.stdout).on('stderr', emit.stderr); | |
} else { | |
child.stdout.on('data', emit.stdout); | |
child.stderr.on('data', emit.stderr); | |
bus.stdout = child.stdout; | |
bus.stderr = child.stderr; | |
} | |
} | |
}; | |