|
|
@@ -0,0 +1,69 @@ |
|
|
|
const { spawn, spawnSync } = require('child_process'); |
|
|
|
const fs = require('fs') |
|
|
|
|
|
|
|
function nodeShellExec() { |
|
|
|
|
|
|
|
var args = Array.from(arguments); |
|
|
|
var opts = args[2] = args[2] || {} |
|
|
|
opts.title ? null : opts.title = `${args[0]} ${args[1] }` |
|
|
|
const child = spawn(...arguments); |
|
|
|
|
|
|
|
var p = new Promise(function(resolve, reject){ |
|
|
|
if(!opts.detached) { |
|
|
|
var messages = []; // PB : TODO -- Explore stream for Task level aggregation to prevent interleaved messages from multiple tasks... |
|
|
|
var success = true; |
|
|
|
|
|
|
|
if(opts.stdio !== 'ignore') { |
|
|
|
child.stdout.setEncoding('utf8'); |
|
|
|
child.stderr.setEncoding('utf8'); |
|
|
|
child.stdout.on('data', (chunk) => { chunk.trim() === '' ? null : messages.push(chunk); /* console.log('d: ' + chunk) */ }); |
|
|
|
child.on('error', (chunk) => { success = false; messages.push(chunk); /* console.error('e: ' + chunk) */ } ); |
|
|
|
child.stderr.on('data', (chunk) => { |
|
|
|
if(messages.join('').indexOf('fatal: not a git repository') > -1) opts.haserrors = true; |
|
|
|
messages.push(chunk); |
|
|
|
// console.error('stderr e: ' + chunk) |
|
|
|
}); |
|
|
|
} |
|
|
|
child.on('close', (code) => { |
|
|
|
if(+code !== 0 || opts.haserrors) success = false; |
|
|
|
if(opts.stdio !== 'ignore') { |
|
|
|
var logEntry = { result: `${opts.title} exited with code ${code}`, messages } |
|
|
|
logEntry.success = success; |
|
|
|
|
|
|
|
if(opts.runas){ |
|
|
|
// success ? logEntry.success = true : null; |
|
|
|
fs.writeFileSync('run.log', ', ' + JSON.stringify(logEntry), {'flag':'a+'} ) |
|
|
|
} |
|
|
|
else { |
|
|
|
// console.log( messages.join('') ) |
|
|
|
process.stdout.write( messages.join('') ) |
|
|
|
} |
|
|
|
} |
|
|
|
if(code !== 0 || opts.haserrors) return reject(logEntry) |
|
|
|
resolve(logEntry) |
|
|
|
}); |
|
|
|
} |
|
|
|
else { |
|
|
|
child.unref() |
|
|
|
resolve(true); |
|
|
|
} |
|
|
|
}); |
|
|
|
p.process = child; |
|
|
|
return p; |
|
|
|
} |
|
|
|
|
|
|
|
const readline = require("readline"); |
|
|
|
|
|
|
|
var cli = { |
|
|
|
nodeShellExec |
|
|
|
, get prompt() { |
|
|
|
const clii = readline.createInterface({ |
|
|
|
input: process.stdin, |
|
|
|
output: process.stdout |
|
|
|
}); |
|
|
|
// clii.on("close", function() { }); |
|
|
|
return clii |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
module.exports = cli |