all files / lib/ runner.js

100% Statements 30/30
100% Branches 6/6
100% Functions 6/6
100% Lines 29/29
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70                                                                                  
const async  = require('async');
const child  = require('child_process');
const colors = require('colors');
const fs     = require('fs');
const mkdirp = require('mkdirp');
const p      = require('path');
const util   = require('util');
 
/**
 * Execute a single command.
 *
 * @param {Object} command: the command to execute
 * @param {Object} opts:
 *   - cwd: base directory where the commands should be executed from
 *   - quiet: don't display command output if quiet
 *   - task: Bob task name, used to create output directory
 *   - type: Bob task type name, used to create output directory
 *   - dir: report directory where process output will be written into a file
 * @param {Function} cb: standard cb(err, result) callback
 */
function exec(command, opts, cb) {
 
  console.log('%s | %s', command.meta.task.cyan, command.exec);
 
  var logFile = p.join(opts.logDir, util.format('%s.log', command.meta.type));
  var cproc   = child.exec(command.exec, opts, cb);
  var wstream = fs.createWriteStream(logFile);
 
  cproc.stdout.on('data', function (data) {
    if (!opts.quiet) {
      process.stdout.write(data);
    }
    wstream.write(data);
  });
 
  cproc.stderr.on('data', function (data) {
    if (!opts.quiet) {
      process.stderr.write(data);
    }
    wstream.write(data);
  });
}
 
/**
 * Execute multiple commands in series.
 *
 * @param {Array} commands: an array of commands, each command contains:
 *   - exec: executable shell command line
 *   - meta: command metadata, language and type
 * @param {Object} opts:
 *   - logDir: directory where log files will be written to
 *   - quiet: don't display command output if quiet is set
 * @param {Function} cb: standard cb(err, result) callback
 */
function execSeries(commands, opts, cb) {
 
  function _exec(command, cb) {
    opts.logDir = opts.logDir.replace(/\{lang\}/g, command.meta.language);
    mkdirp(opts.logDir, function (err) {
      if (err) { cb(err); } else {
        exec(command, opts, cb);
      }
    });
  }
  async.eachSeries(commands, _exec, cb);
}
 
exports.exec = exec;
exports.execSeries = execSeries;