From 730e511b3598c5fea416da680060c83ed2751a25 Mon Sep 17 00:00:00 2001 From: Fedor Indutny Date: Sun, 5 Jan 2014 01:50:54 +0400 Subject: [PATCH] child_process: better error reporting for exec Report path to executable and argv on error, stderr is not enough in many cases. fix #6796 --- lib/child_process.js | 19 ++++++++++++++----- test/simple/test-child-process-exec-error.js | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/child_process.js b/lib/child_process.js index bcbd08d6cb..8afd7b225c 100644 --- a/lib/child_process.js +++ b/lib/child_process.js @@ -664,7 +664,7 @@ exports.execFile = function(file /* args, options, callback */) { var exited = false; var timeoutId; - var ex; + var ex = null; function exithandler(code, signal) { if (exited) return; @@ -689,16 +689,25 @@ exports.execFile = function(file /* args, options, callback */) { } if (ex) { - callback(ex, stdout, stderr); + // Will be handled later } else if (code === 0 && signal === null) { callback(null, stdout, stderr); - } else { - ex = new Error('Command failed: ' + stderr); + return; + } + + var cmd = file; + if (args.length !== 0) + cmd += ' ' + args.join(' '); + + if (!ex) { + ex = new Error('Command failed: ' + cmd + '\n' + stderr); ex.killed = child.killed || killed; ex.code = code < 0 ? uv.errname(code) : code; ex.signal = signal; - callback(ex, stdout, stderr); } + + ex.cmd = cmd; + callback(ex, stdout, stderr); } function errorhandler(e) { diff --git a/test/simple/test-child-process-exec-error.js b/test/simple/test-child-process-exec-error.js index 2afe114434..afe1997643 100644 --- a/test/simple/test-child-process-exec-error.js +++ b/test/simple/test-child-process-exec-error.js @@ -28,6 +28,7 @@ function test(fun, code) { fun('does-not-exist', function(err) { assert.equal(err.code, code); + assert(/does\-not\-exist/.test(err.cmd)); errors++; });