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
|