You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					74 lines
				
				1.8 KiB
			
		
		
			
		
	
	
					74 lines
				
				1.8 KiB
			| 
											3 years ago
										 | 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; | ||
|  |   } | ||
|  | 
 | ||
|  |   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; | ||
|  |     } | ||
|  |   } | ||
|  | }; |