Comparing version 2.2.2 to 2.3.0
@@ -23,3 +23,16 @@ "use strict"; | ||
// Run the task | ||
task.execute(callback); | ||
var chalk = require("chalk"); | ||
var log = require("../lib/log"); | ||
log.info("builder-core:start:" + process.pid, "Started: " + chalk.gray(task)); | ||
task.execute(function (err) { | ||
if (err) { | ||
log.error("builder-core:end:" + process.pid, | ||
"Ended with error: " + chalk.gray(task) + " - " + chalk.red(err.message.split("\n")[0])); | ||
} else { | ||
log.info("builder-core:end:" + process.pid, "Ended normally: " + chalk.gray(task)); | ||
} | ||
callback(err); | ||
}); | ||
}; |
History | ||
======= | ||
## 2.3.0 | ||
* Switch to `tree-kill` to more emphatically kill off children process spawned | ||
within a single builder run. | ||
* Add `builder <action> --setup` flag to run a task before and during an action. | ||
[#51](https://github.com/FormidableLabs/builder/issues/51) | ||
## 2.2.2 | ||
@@ -5,0 +12,0 @@ |
@@ -27,2 +27,7 @@ "use strict"; | ||
}; | ||
var FLAG_SETUP = { | ||
desc: "Single task to run for the entirety of <action>.", | ||
types: [String], | ||
default: function (val) { return val || null; } | ||
}; | ||
@@ -41,3 +46,4 @@ // Option flags. | ||
run: { | ||
tries: FLAG_TRIES | ||
tries: FLAG_TRIES, | ||
setup: FLAG_SETUP | ||
}, | ||
@@ -47,2 +53,3 @@ | ||
tries: FLAG_TRIES, | ||
setup: FLAG_SETUP, | ||
queue: FLAG_QUEUE, | ||
@@ -54,2 +61,3 @@ buffer: FLAG_BUFFER | ||
tries: FLAG_TRIES, | ||
setup: FLAG_SETUP, | ||
queue: FLAG_QUEUE, | ||
@@ -56,0 +64,0 @@ buffer: FLAG_BUFFER, |
@@ -8,3 +8,4 @@ "use strict"; | ||
var chalk = require("chalk"); | ||
var log = require("../lib/log"); | ||
var log = require("./log"); | ||
var Tracker = require("./utils/tracker"); | ||
@@ -106,29 +107,20 @@ /** | ||
/** | ||
* Multi-process tracker. | ||
* Add and invoke a setup task if present in options. | ||
* | ||
* @returns {void} | ||
* @param {String} setup Setup task | ||
* @param {Object} shOpts Shell options | ||
* @returns {Object} Process object or `null`. | ||
*/ | ||
var Tracker = function Tracker() { | ||
this.procs = []; | ||
}; | ||
var addSetup = function (setup, shOpts) { | ||
if (!setup) { return null; } | ||
/** | ||
* Add process and track close. | ||
* | ||
* @param {Object} proc Child process object | ||
* @returns {Object} Child process object | ||
*/ | ||
Tracker.prototype.add = function (proc) { | ||
var self = this; | ||
var done = _.once(function (code) { | ||
var level = code === 0 ? "info" : "error"; | ||
log[level]("setup:end", "Setup command ended with code: " + code); | ||
}); | ||
// Track. | ||
self.procs.push(proc); | ||
log.info("setup:start", "Starting setup task: " + setup); | ||
var proc = run("builder run " + setup, shOpts, {}, done); | ||
proc.on("exit", done); | ||
// Remove from tracked list when closed. | ||
proc.on("close", function () { | ||
self.procs = self.procs.filter(function (obj) { | ||
return obj.pid !== proc.pid; | ||
}); | ||
}); | ||
return proc; | ||
@@ -138,10 +130,32 @@ }; | ||
/** | ||
* Terminate all open processes | ||
* Wrap callback with setup termination behavior. | ||
* | ||
* @returns {void} | ||
* - Create and invoke setup. | ||
* - Early termination on setup error. | ||
* - Ensure callback only called once. | ||
* | ||
* @param {Object} shOpts Shell options | ||
* @param {Object} opts Runner options | ||
* @param {Object} tracker Process tracker | ||
* @param {Function} callback Callback `(err)` | ||
* @returns {Function} Wrapped callback | ||
*/ | ||
Tracker.prototype.kill = function () { | ||
this.procs.forEach(function (proc) { | ||
proc.kill(); | ||
var createFinish = function (shOpts, opts, tracker, callback) { | ||
// Wrap callback | ||
var finish = _.once(function (err) { | ||
tracker.kill(function () { | ||
callback(err); | ||
}); | ||
}); | ||
// Add, invoke, and hook to final callback if setup dies early. | ||
var setup = tracker.add(addSetup(opts.setup, shOpts)); | ||
if (setup) { | ||
// If setup exit happens before normal termination, kill everything. | ||
setup.on("exit", function (code) { | ||
finish(new Error("Setup exited with code: " + code)); | ||
}); | ||
} | ||
return finish; | ||
}; | ||
@@ -163,3 +177,7 @@ | ||
run: function (cmd, shOpts, opts, callback) { | ||
return retry(cmd, shOpts, opts, callback); | ||
// Add + invoke setup (if any), bind tracker cleanup, and wrap callback. | ||
var tracker = new Tracker(); | ||
var finish = createFinish(shOpts, opts, tracker, callback); | ||
return retry(cmd, shOpts, opts, finish); | ||
}, | ||
@@ -177,6 +195,8 @@ | ||
concurrent: function (cmds, shOpts, opts, callback) { | ||
// Add + invoke setup (if any), bind tracker cleanup, and wrap callback. | ||
var tracker = new Tracker(); | ||
var queue = opts.queue; | ||
var finish = createFinish(shOpts, opts, tracker, callback); | ||
// Get mapper (queue vs. non-queue) | ||
var queue = opts.queue; | ||
var map = queue ? | ||
@@ -189,6 +209,3 @@ async.mapLimit.bind(async, cmds, queue) : | ||
retry(cmd, shOpts, _.extend({ tracker: tracker }, opts), cb); | ||
}, function (err) { | ||
tracker.kill(); | ||
callback(err); | ||
}); | ||
}, finish); | ||
}, | ||
@@ -206,7 +223,9 @@ | ||
envs: function (cmd, shOpts, opts, callback) { | ||
// Add + invoke setup (if any), bind tracker cleanup, and wrap callback. | ||
var tracker = new Tracker(); | ||
var finish = createFinish(shOpts, opts, tracker, callback); | ||
// Get mapper (queue vs. non-queue) | ||
var queue = opts.queue; | ||
var taskEnvs = opts._envs; | ||
// Get mapper (queue vs. non-queue) | ||
var map = queue ? | ||
@@ -225,7 +244,4 @@ async.mapLimit.bind(async, taskEnvs, queue) : | ||
retry(cmd, taskShOpts, taskOpts, cb); | ||
}, function (err) { | ||
tracker.kill(); | ||
callback(err); | ||
}); | ||
}, finish); | ||
} | ||
}; |
{ | ||
"name": "builder", | ||
"version": "2.2.2", | ||
"version": "2.3.0", | ||
"description": "An NPM-based task runner", | ||
@@ -32,3 +32,4 @@ "repository": { | ||
"lodash": "^3.10.1", | ||
"nopt": "^3.0.6" | ||
"nopt": "^3.0.6", | ||
"tree-kill": "^1.0.0" | ||
}, | ||
@@ -35,0 +36,0 @@ "devDependencies": { |
@@ -161,2 +161,3 @@ [![Travis Status][trav_img]][trav_site] | ||
* `--tries`: Number of times to attempt a task (default: `1`) | ||
* `--setup`: Single task to run for the entirety of <action>. | ||
@@ -177,2 +178,3 @@ ##### builder concurrent | ||
* `--tries`: Number of times to attempt a task (default: `1`) | ||
* `--setup`: Single task to run for the entirety of <action>. | ||
* `--queue`: Number of concurrent processes to run (default: unlimited - `0|null`) | ||
@@ -214,2 +216,3 @@ * `--[no-]buffer`: Buffer output until process end (default: `false`) | ||
* `--tries`: Number of times to attempt a task (default: `1`) | ||
* `--setup`: Single task to run for the entirety of <action>. | ||
* `--queue`: Number of concurrent processes to run (default: unlimited - `0|null`) | ||
@@ -216,0 +219,0 @@ * `--[no-]buffer`: Buffer output until process end (default: `false`) |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
49247
15
931
461
6
+ Addedtree-kill@^1.0.0
+ Addedtree-kill@1.2.2(transitive)