From a9a05c5d6c8987d9192b9f7f755d8f48db709eaf Mon Sep 17 00:00:00 2001 From: isaacs Date: Wed, 25 Aug 2010 02:58:05 -0700 Subject: Rework how exec works, and add pipe/spawn --- lib/utils/exec.js | 56 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/lib/utils/exec.js b/lib/utils/exec.js index 5ef070950..5bdc512f2 100644 --- a/lib/utils/exec.js +++ b/lib/utils/exec.js @@ -1,22 +1,19 @@ +module.exports = exec +exec.spawn = spawn +exec.pipe = pipe + var log = require("../utils/log") + , child_process = require("child_process") + , sys = require("sys") -module.exports = function exec (cmd, args, env, pipe, cb) { - if (!cb) cb = pipe, pipe = false +function exec (cmd, args, env, takeOver, cb) { + if (!cb) cb = takeOver, takeOver = true if (!cb) cb = env, env = process.env log.verbose(cmd+" "+args.map(JSON.stringify).join(" "), "exec") - var stdio = process.binding("stdio") - , fds = [ stdio.stdinFD || 0 - , stdio.stdoutFD || 1 - , stdio.stderrFD || 2 - ] - , cp = require("child_process").spawn( cmd - , args - , env - , pipe ? null : fds - ) - , stdout = "" + var stdout = "" , stderr = "" + , cp = spawn(cmd, args, env, takeOver) cp.stdout && cp.stdout.on("data", function (chunk) { if (chunk) stdout += chunk }) @@ -29,3 +26,36 @@ module.exports = function exec (cmd, args, env, pipe, cb) { }) return cp } + +function logger (d) { if (d) process.binding("stdio").writeError(d+"") } +function pipe (cp1, cp2, cb) { + sys.pump(cp1.stdout, cp2.stdin) + if (log.level <= log.LEVEL.silly) { + cp1.stderr.on("data", logger) + cp2.stderr.on("data", logger) + } + cp1.on("exit", function (code) { + if (!code) return log.verbose(cp2.name || "", "success") + cp2.kill() + cb(new Error( "Failed "+(cp1.name || "")+"\nexited with "+code)) + }) + cp2.on("exit", function (code) { + if (!code) return log.verbose(cp1.name || "", "success", cb) + cb(new Error( "Failed "+(cp2.name || "")+"\nexited with "+code)) + }) +} + +function spawn (c, a, env, takeOver) { + var stdio = process.binding("stdio") + , fds = [ stdio.stdinFD || 0 + , stdio.stdoutFD || 1 + , stdio.stderrFD || 2 + ] + , cp = child_process.spawn( c + , a + , env + , takeOver ? fds : null + ) + cp.name = c +" "+ a.map(JSON.stringify).join(" ") + return cp +} -- cgit v1.2.3