From 6e29f1283726772342303a656d84a8b290602aa6 Mon Sep 17 00:00:00 2001 From: David Monllao Date: Tue, 8 Sep 2015 15:07:57 +0800 Subject: [PATCH] MDL-50766 grunt: Check that there are yui modules before running shifter --- Gruntfile.js | 112 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 97 insertions(+), 15 deletions(-) diff --git a/Gruntfile.js b/Gruntfile.js index 6237dfaf2dde6..a3b699ea79f85 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -24,6 +24,7 @@ module.exports = function(grunt) { var path = require('path'), + fs = require('fs'), tasks = {}, cwd = process.env.PWD || process.cwd(); @@ -102,22 +103,103 @@ module.exports = function(grunt) { args.push('--lint-stderr'); } + var execShifter = function() { + + shifter = exec("node", args, { + cwd: cwd, + stdio: 'inherit', + env: process.env + }); + + // Tidy up after exec. + shifter.on('exit', function (code) { + if (code) { + grunt.fail.fatal('Shifter failed with code: ' + code); + } else { + grunt.log.ok('Shifter build complete.'); + done(); + } + }); + }; + // Actually run shifter. - shifter = exec("node", args, { - cwd: cwd, - stdio: 'inherit', - env: process.env - }); - - // Tidy up after exec. - shifter.on('exit', function (code) { - if (code) { - grunt.fail.fatal('Shifter failed with code: ' + code); - } else { - grunt.log.ok('Shifter build complete.'); - done(); - } - }); + if (!options.recursive) { + execShifter(); + } else { + // Check that there are yui modules otherwise shifter ends with exit code 1. + var found = false; + var hasYuiModules = function(directory, callback) { + fs.readdir(directory, function(err, files) { + if (err) { + return callback(err, null); + } + + // If we already found a match there is no need to continue scanning. + if (found === true) { + return; + } + + // We need to track the number of files to know when we return a result. + var pending = files.length; + + // We first check files, so if there is a match we don't need further + // async calls and we just return a true. + for (var i = 0; i < files.length; i++) { + if (files[i] === 'yui') { + return callback(null, true); + } + } + + // Iterate through subdirs if there were no matches. + files.forEach(function (file) { + + var p = path.join(directory, file); + stat = fs.statSync(p); + if (!stat.isDirectory()) { + pending--; + } else { + + // We defer the pending-1 until we scan the whole dir and subdirs. + hasYuiModules(p, function(err, result) { + if (err) { + return callback(err); + } + + if (result === true) { + // Once we get a true we notify the caller. + found = true; + return callback(null, true); + } + + pending--; + if (pending === 0) { + // Notify the caller that the whole dir has been scaned and there are no matches. + return callback(null, false); + } + }); + } + + // No subdirs here, otherwise the return would be deferred until all subdirs are scanned. + if (pending === 0) { + return callback(null, false); + } + }); + }); + }; + + hasYuiModules(cwd, function(err, result) { + if (err) { + grunt.fail.fatal(err.message); + } + + if (result === true) { + execShifter(); + } else { + grunt.log.ok('No YUI modules to build.'); + done(); + } + }); + } }; tasks.startup = function() {