| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | 'use strict'var fs = require('graceful-fs')var child_process = require('child_process')if (!String.prototype.startsWith) {  String.prototype.startsWith = function(search, pos) {    return this.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search  }}function processExecSync(file, args, options) {  var child, error, timeout, tmpdir, command, quote  command = makeCommand(file, args)  /*    this function emulates child_process.execSync for legacy node <= 0.10.x    derived from https://github.com/gvarsanyi/sync-exec/blob/master/js/sync-exec.js  */  options = options || {}  // init timeout  timeout = Date.now() + options.timeout  // init tmpdir  var os_temp_base = '/tmp'  var os = determine_os()  os_temp_base = '/tmp'  if (process.env.TMP) {    os_temp_base = process.env.TMP  }  if (os_temp_base[os_temp_base.length - 1] !== '/') {    os_temp_base += '/'  }  tmpdir = os_temp_base + 'processExecSync.' + Date.now() + Math.random()  fs.mkdirSync(tmpdir)  // init command  if (os === 'linux') {    command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +      '/stderr); echo $? > ' + tmpdir + '/status'  } else {    command = '(' + command + ' > ' + tmpdir + '/stdout 2> ' + tmpdir +      '/stderr) | echo %errorlevel% > ' + tmpdir + '/status | exit'  }  // init child  child = child_process.exec(command, options)  var maxTry = 100000 // increases the test time by 6 seconds on win-2016-node-0.10  var tryCount = 0  while (tryCount < maxTry) {    try {      var x = fs.readFileSync(tmpdir + '/status')      if (x.toString() === '0') {        break      }    } catch (ignore) {}    tryCount++    if (Date.now() > timeout) {      error = child      break    }  }  ['stdout', 'stderr', 'status'].forEach(function (file) {    child[file] = fs.readFileSync(tmpdir + '/' + file, options.encoding)    setTimeout(unlinkFile, 500, tmpdir + '/' + file)  })  child.status = Number(child.status)  if (child.status !== 0) {    error = child  }  try {    fs.rmdirSync(tmpdir)  } catch (ignore) {}  if (error) {    throw error  }  return child.stdout}function makeCommand(file, args) {  var command, quote  command = file  if (args.length > 0) {    for(var i in args) {      command = command + ' '      if (args[i][0] === '-') {        command = command + args[i]      } else {        if (!quote) {          command = command + '\"'          quote = true        }        command = command + args[i]        if (quote) {          if (args.length === (parseInt(i) + 1)) {            command = command + '\"'          }        }      }    }  }  return command}function determine_os() {  var os = ''  var tmpVar = ''  if (process.env.OSTYPE) {    tmpVar = process.env.OSTYPE  } else  if (process.env.OS) {    tmpVar = process.env.OS  } else {    //default is linux    tmpVar = 'linux'  }  if (tmpVar.startsWith('linux')) {    os = 'linux'  }  if (tmpVar.startsWith('win')) {    os = 'win'  }  return os}function unlinkFile(file) {  fs.unlinkSync(file)}module.exports = processExecSync
 |