| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 | // grunt-exec// ==========// * GitHub: https://github.com/jharding/grunt-exec// * Copyright (c) 2012 Jake Harding// * Licensed under the MIT license.module.exports = function(grunt) {  var cp = require('child_process')    , f = require('util').format    , util = grunt.util    , log = grunt.log    , verbose = grunt.verbose;  grunt.registerMultiTask('exec', 'Execute shell commands.', function() {    var data = this.data      , o = {          stdout: data.stdout !== undefined ? data.stdout : true        , stderr: data.stderr !== undefined ? data.stderr : true        }      , command      , childProcess      , args = [].slice.call(arguments, 0)      , done = this.async();    // allow for command to be specified in either    // 'command' or 'cmd' property    command = data.command || data.cmd;    if (!command) {      log.error('Missing command property.');      return done(false);    }    if (util._.isFunction(command)) {      command = command.apply(grunt, args);    }    if (!util._.isString(command)) {      log.error('Command property must be a string.');      return done(false);    }    verbose.subhead(command);    childProcess = cp.exec(command);    o.stdout && childProcess.stdout.on('data', function (d) { log.write(d); });    o.stderr && childProcess.stderr.on('data', function (d) { log.error(d); });    childProcess.on('exit', function(code) {      if (code > 0) {        log.error(f('Exited with code: %d.', code));        return done(false);      }      verbose.ok(f('Exited with code: %d.', code));      done();    });  });};
 |