1- var Promise = require ( 'bluebird' )
2- , path = require ( 'path' )
3- , async = require ( 'async' )
4- , fs = require ( 'fs' )
5- , spawn = require ( 'child_process' ) . spawn
6- , os = require ( 'os' )
7- , isWin = / ^ w i n 3 2 / . test ( os . platform ( ) ) ;
1+ var Promise = require ( 'bluebird' )
2+ , path = require ( 'path' )
3+ , async = require ( 'async' )
4+ , fs = require ( 'fs' )
5+ , spawn = require ( 'child_process' ) . spawn
6+ , readline = require ( 'readline' )
7+ , os = require ( 'os' )
8+ , isWin = / ^ w i n 3 2 / . test ( os . platform ( ) ) ;
89
910/**
1011 * Mimmicks a small grunt-cli utility
@@ -107,31 +108,65 @@ var readTasks = exports.readTasks = function(pathSrc, silence) {
107108 * @return {Promise } Returns a promise from bluebird
108109 * @api private
109110 */
110- function runTask ( projectFolder , cmd ) {
111+ exports . runTask = function runTask ( projectFolder , command ) {
112+ var args = [ ] . slice . call ( arguments , 1 ) ;
113+
111114 return new Promise ( function ( resolve , reject ) {
112- var env = process . env
113- , paths = process . env . NODE_PATH ? [ process . env . NODE_PATH ] : [ ] ;
115+ var cmd = ! isWin ? 'grunt' : 'grunt.cmd'
116+ , env = process . env
117+ , opts = { env : env , cwd : projectFolder }
118+ , paths = process . env . NODE_PATH ? [ process . env . NODE_PATH ] : [ ] ;
119+
120+ // Pass the --verbose call down to grunt as well
121+ if ( ! ! program . verbose ) {
122+ args . push ( '--verbose' ) ;
123+
124+ var logMsg = 'Spawning posix child process to run ' + lib . colors . lightGreen ( cmd + ' ' + args . join ( ' ' ) ) + '...' ;
125+ lib . utils . info ( logMsg ) . running ( logMsg ) ;
126+ }
114127
115128 paths . push ( path . resolve ( path . join ( projectFolder , 'lib' ) ) + path . sep ) ;
116129 paths . push ( path . resolve ( path . join ( projectFolder , 'modules' ) ) + path . sep ) ;
117130
118- env . NODE_PATH = paths . join ( os . platform ( ) === 'win32' ? ';' : ':' ) ;
131+ env . NODE_PATH = paths . join ( ! ! isWin ? ';' : ':' ) ;
119132
120- spawn ( ! isWin ? 'grunt' : 'grunt.cmd' , [ cmd ] , { cwd : projectFolder , env : env , stdio : 'inherit' } )
121- . on ( 'close' , function ( code ) {
122- if ( code !== 0 ) {
123- return reject ( ) ;
124- }
133+ var posixProc = spawn ( cmd , args , opts )
134+ , exitHdlr = process . kill . bind ( process , posixProc )
135+ , error = '' ;
125136
126- if ( cmd . indexOf ( 'prompt' ) ) {
127- lib . utils . progress ( ) ;
128- lib . utils . startBar ( function ( ) {
129- resolve ( ) ;
130- } ) ;
131- } else {
137+ process . on ( 'SIGTERM' , exitHdlr ) ;
138+
139+ if ( ! ! program . verbose || process . mainModule . filename . match ( 'build' ) ) {
140+ readline
141+ . createInterface ( {
142+ input : posixProc . stdout ,
143+ terminal : false
144+ } )
145+ . on ( 'line' , function ( line ) {
146+ console . log ( ' ' + line ) ;
147+ } ) ;
148+ }
149+
150+ posixProc . on ( 'error' , function ( err ) {
151+ error += err ;
152+ } ) ;
153+
154+ posixProc . on ( 'close' , function ( code ) {
155+ process . removeListener ( 'SIGTERM' , exitHdlr ) ;
156+
157+ if ( code !== 0 || ! ! error ) {
158+ return reject ( error ) ;
159+ }
160+
161+ if ( command . indexOf ( 'prompt' ) ) {
162+ lib . utils . progress ( ) ;
163+ lib . utils . startBar ( function ( ) {
132164 resolve ( ) ;
133- }
134- } ) ;
165+ } ) ;
166+ } else {
167+ resolve ( ) ;
168+ }
169+ } ) ;
135170 } ) ;
136171}
137172
@@ -152,7 +187,7 @@ function runDBMigrations(projectFolder) {
152187 paths . push ( path . resolve ( path . join ( projectFolder , 'lib' ) ) + path . sep ) ;
153188 paths . push ( path . resolve ( path . join ( projectFolder , 'modules' ) ) + path . sep ) ;
154189
155- env . NODE_PATH = paths . join ( os . platform ( ) === 'win32' ? ';' : ':' ) ;
190+ env . NODE_PATH = paths . join ( ! ! isWin ? ';' : ':' ) ;
156191
157192 // check for NODE_ENV json config file if it doesn't exist then revert to local
158193 if ( ! fs . existsSync ( path . join ( projectFolder , 'config' , env . NOD_ENV + '.json' ) ) ) {
@@ -198,8 +233,13 @@ function runDBMigrations(projectFolder) {
198233 */
199234exports . runTasks = function ( projectFolder , modulePath ) {
200235 return new Promise ( function ( resolve , reject ) {
236+ var originalCwd = process . cwd ( ) ;
237+ process . chdir ( projectFolder ) ;
238+
201239 readTasks ( modulePath )
202240 . spread ( function ( tasks ) {
241+
242+ process . chdir ( originalCwd ) ;
203243
204244 if ( tasks . length ) {
205245 lib . utils . warn ( ' Running grunt tasks for module ' + modulePath . split ( path . sep ) . pop ( ) + '...' ) ;
0 commit comments