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;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								};
							 |