-
Notifications
You must be signed in to change notification settings - Fork 1.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
test: formatting and minor fixes for execFileSync replacement
PR-URL: #1521 Reviewed-By: Jon Moss <me@jonathanmoss.me> Reviewed-By: Richard Lau <riclau@uk.ibm.com>
- Loading branch information
Showing
3 changed files
with
140 additions
and
143 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
'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 |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters