100 lines
2.4 KiB
JavaScript
100 lines
2.4 KiB
JavaScript
|
#!/usr/bin/env node
|
||
|
|
||
|
/*
|
||
|
Copyright (c) 2012, Yahoo! Inc. All rights reserved.
|
||
|
Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.
|
||
|
*/
|
||
|
|
||
|
|
||
|
var async = require('async'),
|
||
|
Command = require('./command'),
|
||
|
inputError = require('./util/input-error'),
|
||
|
exitProcess = process.exit; //hold a reference to original process.exit so that we are not affected even when a test changes it
|
||
|
|
||
|
require('./register-plugins');
|
||
|
|
||
|
function findCommandPosition(args) {
|
||
|
var i;
|
||
|
|
||
|
for (i = 0; i < args.length; i += 1) {
|
||
|
if (args[i].charAt(0) !== '-') {
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
function exit(ex, code) {
|
||
|
// flush output for Node.js Windows pipe bug
|
||
|
// https://github.com/joyent/node/issues/6247 is just one bug example
|
||
|
// https://github.com/visionmedia/mocha/issues/333 has a good discussion
|
||
|
var streams = [process.stdout, process.stderr];
|
||
|
async.forEach(streams, function (stream, done) {
|
||
|
// submit a write request and wait until it's written
|
||
|
stream.write('', done);
|
||
|
}, function () {
|
||
|
if (ex) {
|
||
|
if (typeof ex === 'string') {
|
||
|
console.error(ex);
|
||
|
exitProcess(1);
|
||
|
} else {
|
||
|
throw ex; // turn it into an uncaught exception
|
||
|
}
|
||
|
} else {
|
||
|
exitProcess(code);
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
|
||
|
function errHandler (ex) {
|
||
|
if (!ex) { return; }
|
||
|
if (!ex.inputError) {
|
||
|
// exit with exception stack trace
|
||
|
exit(ex);
|
||
|
} else {
|
||
|
//don't print nasty traces but still exit(1)
|
||
|
console.error(ex.message);
|
||
|
console.error('Try "istanbul help" for usage');
|
||
|
exit(null, 1);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function runCommand(args, callback) {
|
||
|
var pos = findCommandPosition(args),
|
||
|
command,
|
||
|
commandArgs,
|
||
|
commandObject;
|
||
|
|
||
|
if (pos < 0) {
|
||
|
return callback(inputError.create('Need a command to run'));
|
||
|
}
|
||
|
|
||
|
commandArgs = args.slice(0, pos);
|
||
|
command = args[pos];
|
||
|
commandArgs.push.apply(commandArgs, args.slice(pos + 1));
|
||
|
|
||
|
try {
|
||
|
commandObject = Command.create(command);
|
||
|
} catch (ex) {
|
||
|
errHandler(inputError.create(ex.message));
|
||
|
return;
|
||
|
}
|
||
|
commandObject.run(commandArgs, errHandler);
|
||
|
}
|
||
|
|
||
|
function runToCompletion(args) {
|
||
|
runCommand(args, errHandler);
|
||
|
}
|
||
|
|
||
|
/* istanbul ignore if: untestable */
|
||
|
if (require.main === module) {
|
||
|
var args = Array.prototype.slice.call(process.argv, 2);
|
||
|
runToCompletion(args);
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
runToCompletion: runToCompletion
|
||
|
};
|
||
|
|