123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- 'use strict'
- const fs = require('graceful-fs')
- const childProcess = require('child_process')
- function startsWith (str, search, pos) {
- if (String.prototype.startsWith) {
- return str.startsWith(search, pos)
- }
- return str.substr(!pos || pos < 0 ? 0 : +pos, search.length) === search
- }
- function processExecSync (file, args, options) {
- var child, error, timeout, tmpdir, command
- 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 osTempBase = '/tmp'
- var os = determineOS()
- osTempBase = '/tmp'
- if (process.env.TMP) {
- osTempBase = process.env.TMP
- }
- if (osTempBase[osTempBase.length - 1] !== '/') {
- osTempBase += '/'
- }
- tmpdir = osTempBase + '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 = childProcess.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 determineOS () {
- 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 (startsWith(tmpVar, 'linux')) {
- os = 'linux'
- }
- if (startsWith(tmpVar, 'win')) {
- os = 'win'
- }
- return os
- }
- function unlinkFile (file) {
- fs.unlinkSync(file)
- }
- module.exports = processExecSync
|