diff options
Diffstat (limited to 'node_modules/spawn-sync/lib/spawn-sync.js')
| -rw-r--r-- | node_modules/spawn-sync/lib/spawn-sync.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/node_modules/spawn-sync/lib/spawn-sync.js b/node_modules/spawn-sync/lib/spawn-sync.js new file mode 100644 index 0000000..5dbc530 --- /dev/null +++ b/node_modules/spawn-sync/lib/spawn-sync.js @@ -0,0 +1,89 @@ +'use strict'; + +var path = require('path'); +var fs = require('fs'); +var tmpdir = require('os').tmpdir || require('os-shim').tmpdir; +var cp = require('child_process'); +var sleep; +var JSON = require('./json-buffer'); +try { + sleep = require('try-thread-sleep'); +} catch (ex) { + console.warn('Native thread-sleep not available.'); + console.warn('This will result in much slower performance, but it will still work.'); + console.warn('You should re-install spawn-sync or upgrade to the lastest version of node if possible.'); + console.warn('Check ' + path.resolve(__dirname, '../error.log') + ' for more details'); + sleep = function () {}; +} + +var temp = path.normalize(path.join(tmpdir(), 'spawn-sync')); + +function randomFileName(name) { + function randomHash(count) { + if (count === 1) + return parseInt(16*Math.random(), 10).toString(16); + else { + var hash = ''; + for (var i=0; i<count; i++) + hash += randomHash(1); + return hash; + } + } + + return temp + '_' + name + '_' + String(process.pid) + randomHash(20); +} +function unlink(filename) { + try { + fs.unlinkSync(filename); + } catch (ex) { + if (ex.code !== 'ENOENT') throw ex; + } +} +function tryUnlink(filename) { + // doesn't matter too much if we fail to delete temp files + try { + fs.unlinkSync(filename); + } catch(e) {} +} + +function invoke(cmd) { + // location to keep flag for busy waiting fallback + var finished = randomFileName("finished"); + unlink(finished); + if (process.platform === 'win32') { + cmd = cmd + '& echo "finished" > ' + finished; + } else { + cmd = cmd + '; echo "finished" > ' + finished; + } + cp.exec(cmd); + + while (!fs.existsSync(finished)) { + // busy wait + sleep(200); + } + + tryUnlink(finished); + + return 0; +} + +module.exports = spawnSyncFallback; +function spawnSyncFallback(cmd, commandArgs, options) { + var args = []; + for (var i = 0; i < arguments.length; i++) { + args.push(arguments[i]); + } + + // node.js script to run the command + var worker = path.normalize(__dirname + '/worker.js'); + // location to store arguments + var input = randomFileName('input'); + var output = randomFileName('output'); + unlink(output); + + fs.writeFileSync(input, JSON.stringify(args)); + invoke('"' + process.execPath + '" "' + worker + '" "' + input + '" "' + output + '"'); + var res = JSON.parse(fs.readFileSync(output, 'utf8')); + tryUnlink(input);tryUnlink(output); + return res; +} |