| @@ -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 | |||