Comparing version 0.0.1 to 0.1.3
# Changelog | ||
### 0.1.3 - 2014-02-10 | ||
- Added the ability to override the value of repo (multikrepo.json) | ||
### 0.1.2 - 2014-02-10 | ||
- Add filter in cli options (run grunt task in dependency/dependencies) | ||
- Remove base functions from Multigrunt.js to Gruntfile.js | ||
- Bugfix | ||
### 0.0.1 - 2014-01-31 | ||
- Initial version |
@@ -0,4 +1,18 @@ | ||
var L = require('mout').lang; | ||
var chalk = require('chalk'); | ||
var cli = require('../util/cli'); | ||
function help() { | ||
var options = cli.options; | ||
var name; | ||
if (options.argv.remain.length > 0){ | ||
name = options.argv.remain[0]; | ||
} | ||
if (name && L.isFunction(help[name])) { | ||
return help[name](); | ||
} | ||
var message = [ | ||
@@ -8,11 +22,16 @@ '', | ||
'', | ||
' ' + chalk.cyan('mk') + ' <command>', | ||
' ' + chalk.cyan('mk') + ' [--version] <command> [--help]', | ||
'', | ||
'Commands:', | ||
'', | ||
' help Display help information about Multik', | ||
' install Install dependencies', | ||
' grunt Run the task of Grunt', | ||
' status Show the status of dependencies', | ||
' update Update dependencies', | ||
'', | ||
'Options:', | ||
'', | ||
' --help Display help information about Multik', | ||
' --filter Apply filter for dependencies', | ||
'See \'mk help <command>\' for more information on a specific command. ' | ||
]; | ||
@@ -25,2 +44,24 @@ | ||
help.grunt = function () { | ||
var message = [ | ||
'', | ||
'Usage:', | ||
'', | ||
' ' + chalk.cyan('mk-grunt') + ' [options] [task [task ...]]', | ||
'', | ||
'Options:', | ||
'', | ||
' --help Display help information about Multik', | ||
' --local Run a local grant depending', | ||
' --filter Apply filter for dependencies', | ||
' --general Execution only general grunt', | ||
'' | ||
]; | ||
message.forEach(function (str) { | ||
console.log(str); | ||
}); | ||
}; | ||
module.exports = help; |
@@ -5,3 +5,4 @@ module.exports = { | ||
update: require('./update'), | ||
grunt: require('./grunt'), | ||
status: require('./status') | ||
}; |
var Project = require('../core/Project'); | ||
function status() { | ||
var project = new Project(); | ||
function status(options) { | ||
var project = new Project(options); | ||
project.status(); | ||
@@ -6,0 +6,0 @@ }; |
@@ -0,1 +1,3 @@ | ||
'use strict'; | ||
var fs = require('fs'); | ||
@@ -6,5 +8,10 @@ var path = require('path'); | ||
var async = require('async'); | ||
var resolve = require('resolve').sync; | ||
var exec = require('child_process').exec; | ||
var cli = require('../util/cli'); | ||
var Dependency = function (config, options) { | ||
this.name = options.name; | ||
this.group = options.group; | ||
this._config = config; | ||
@@ -85,4 +92,4 @@ this._options = options; | ||
this.analyse(function(err){ | ||
if (err){ | ||
this.analyse(function (err) { | ||
if (err) { | ||
return callback(err); | ||
@@ -92,3 +99,3 @@ } | ||
if (__self._isInstalled) { | ||
__self._log(options.version, 'Already installed', 'green') | ||
__self._log(options.version, 'Already installed', 'green'); | ||
return callback(null); | ||
@@ -99,15 +106,39 @@ } | ||
__self._shell("git", ['clone', options.repo, '-b', options.version, destinationPath, '--progress'], { | ||
cwd: options.cwd | ||
}, function (err, stdout, stderr) { | ||
if (err) { | ||
__self._log(options.version, 'Error in installation', 'green') | ||
console.error(stderr); | ||
} else { | ||
__self._log(options.version, 'Installation is complete', 'green') | ||
async.series([ | ||
function (asyncCallback) { | ||
__self._shell("git", ['clone', options.repo, '-b', options.version, destinationPath, '--progress'], { | ||
cwd: options.cwd | ||
}, function (err, stdout, stderr) { | ||
if (err) { | ||
__self._log(options.version, 'Installation error', 'red'); | ||
console.log(stderr); | ||
} | ||
asyncCallback(err); | ||
}); | ||
}, | ||
function (asyncCallback) { | ||
var packageJsonFile = path.join(destinationPath, 'package.json'); | ||
fs.exists(packageJsonFile, function (exists) { | ||
if (!exists) { | ||
return asyncCallback(null); | ||
} | ||
__self._shell("npm", ['install'], { | ||
cwd: destinationPath | ||
}, function (err, stdout, stderr) { | ||
if (err) { | ||
__self._log(options.version, 'Error in npm install', 'red'); | ||
console.log(stderr); | ||
} | ||
asyncCallback(err); | ||
}); | ||
}); | ||
} | ||
], function (err) { | ||
if (!err) { | ||
__self._log(options.version, 'Installation is complete', 'green'); | ||
} | ||
if (callback) { | ||
callback(err); | ||
} | ||
return callback(err); | ||
}); | ||
@@ -124,4 +155,4 @@ }); | ||
this.analyse(function(err){ | ||
if (err){ | ||
this.analyse(function (err) { | ||
if (err) { | ||
return callback(err); | ||
@@ -137,3 +168,3 @@ } | ||
if (__self._isLocalChanged){ | ||
if (__self._isLocalChanged) { | ||
__self._log(localBranch, 'There are local changes', 'red'); | ||
@@ -150,3 +181,3 @@ return callback(null); | ||
}, function (err, stdout, stderr) { | ||
if (err){ | ||
if (err) { | ||
console.log(stderr); | ||
@@ -161,3 +192,3 @@ } | ||
}, function (err, stdout, stderr) { | ||
if (err){ | ||
if (err) { | ||
console.log(stderr); | ||
@@ -172,3 +203,3 @@ } | ||
}, function (err, stdout, stderr) { | ||
if (err){ | ||
if (err) { | ||
console.log(stderr); | ||
@@ -198,4 +229,4 @@ } | ||
this.analyse(function(err){ | ||
if (err){ | ||
this.analyse(function (err) { | ||
if (err) { | ||
return callback(err); | ||
@@ -205,3 +236,3 @@ } | ||
if (!__self._isInstalled) { | ||
__self._log(options.version, 'Not installed', 'red') | ||
__self._log(options.version, 'Not installed', 'red'); | ||
return callback(null); | ||
@@ -223,4 +254,85 @@ } | ||
Dependency.prototype.grunt = function (callback) { | ||
callback = callback || function () { | ||
}; | ||
var options = this._options; | ||
var cliOptions = cli.options; | ||
var __self = this; | ||
this.analyse(function (err) { | ||
if (err) { | ||
return callback(err); | ||
} | ||
if (!__self._isInstalled) { | ||
__self._log(options.version, 'Not installed', 'red'); | ||
return callback(null); | ||
} | ||
var destinationPath = __self._destinationPath; | ||
var tasks = cliOptions.argv.remain; | ||
if (cliOptions.argv.remain[0] === 'grunt') { | ||
tasks = cliOptions.argv.remain.slice(1); | ||
} | ||
// Local Grunt | ||
if (cliOptions.local) { | ||
__self._shell("grunt", tasks, { | ||
cwd: destinationPath | ||
}, function (err, stdout, stderr) { | ||
if (err) { | ||
__self._log(options.version, 'Grunt error', 'red'); | ||
console.log(stdout); | ||
} else { | ||
__self._log(options.version, 'Grunt ok', 'green'); | ||
console.log(stdout); | ||
} | ||
callback(err); | ||
}); | ||
} else { | ||
var basedir = process.cwd(); | ||
var gruntpath; | ||
try { | ||
gruntpath = resolve('grunt', {basedir: basedir}); | ||
} catch (ex) { | ||
} | ||
// No grunt install found! | ||
if (!gruntpath) { | ||
__self._log(options.version, 'Grunt not found', 'red'); | ||
return callback(null); | ||
} | ||
var grunt = require(gruntpath); | ||
grunt.multik = { | ||
currentDependency: { | ||
name: __self.name, | ||
group: __self.group, | ||
directory: destinationPath | ||
} | ||
}; | ||
// TODO: hack (only hardcore) | ||
grunt.util.oldDependExit = grunt.util.exit; | ||
grunt.util.exit = function(exitCode, streams) { | ||
grunt.multik = null; | ||
grunt.util.exit = grunt.util.oldDependExit; | ||
if (exitCode === 0) { | ||
__self._log(options.version, 'Grunt ok', 'green'); | ||
return callback(null); | ||
} | ||
__self._log(options.version, 'Grunt error', 'red'); | ||
grunt.util.oldDependExit(exitCode, streams); | ||
}; | ||
grunt.cli({force: true}); | ||
} | ||
}); | ||
}; | ||
Dependency.prototype._log = function (branch, message, color) { | ||
var options = this._options; | ||
var config = this._config; | ||
@@ -234,3 +346,3 @@ var destinationPath = this._destinationPath; | ||
var padBranch = mout.string.rpad(branch, 15, ' ') | ||
var padBranch = mout.string.rpad(branch, 15, ' '); | ||
@@ -237,0 +349,0 @@ if (branch === 'master') { |
@@ -0,4 +1,9 @@ | ||
'use strict'; | ||
var path = require('path'); | ||
var async = require('async'); | ||
var resolve = require('resolve').sync; | ||
var mout = require('mout'); | ||
var undersore = require('underscore'); | ||
var L = mout.lang; | ||
var defaultConfig = require('../config'); | ||
@@ -8,5 +13,11 @@ var multikJson = require('../util/multikJson'); | ||
var Project = function (config) { | ||
var Project = function (options, config) { | ||
this._options = mout.object.mixIn({}, options || { | ||
filter: null | ||
}); | ||
this._config = mout.object.mixIn({}, config || defaultConfig); | ||
this._jsonFile = path.join(this._config.cwd, 'multik.json'); | ||
this._multikJsonFile = path.join(this._config.cwd, 'multik.json'); | ||
this._multikRepoJsonFile = path.join(this._config.cwd, 'multikrepo.json'); | ||
this._multikRepoGlobalJsonFile = path.join(this._config.cwd, '..', 'multikrepo.json'); | ||
}; | ||
@@ -29,8 +40,9 @@ | ||
}); | ||
}) | ||
}); | ||
async.parallelLimit(stack, 5, function (err) { | ||
// TODO: If parralell limit > 2, then error in git clone | ||
async.parallelLimit(stack, 1, function (err) { | ||
callback(err, dependencies); | ||
}); | ||
}) | ||
}); | ||
}; | ||
@@ -53,3 +65,3 @@ | ||
}); | ||
}) | ||
}); | ||
@@ -59,3 +71,3 @@ async.parallelLimit(stack, 5, function (err) { | ||
}); | ||
}) | ||
}); | ||
}; | ||
@@ -78,3 +90,3 @@ | ||
}); | ||
}) | ||
}); | ||
@@ -84,6 +96,71 @@ async.parallelLimit(stack, 5, function (err) { | ||
}); | ||
}) | ||
}); | ||
}; | ||
Project.prototype.grunt = function (callback) { | ||
callback = callback || function () { | ||
}; | ||
var options = this._options; | ||
this._analyse(function (err, dependencies) { | ||
if (err) { | ||
return callback(err); | ||
} | ||
var stack = []; | ||
if (!options.general) { | ||
mout.array.forEach(dependencies, function(dependency) { | ||
stack.push(function(stackCallback) { | ||
dependency.grunt(stackCallback); | ||
}); | ||
}); | ||
} | ||
// execute general grunt | ||
if (!options.filter) { | ||
// necessary to optimize (make grant launch a separate function) | ||
stack.push(function(stackCallback) { | ||
var basedir = process.cwd(); | ||
var gruntpath; | ||
try { | ||
gruntpath = resolve('grunt', {basedir: basedir}); | ||
} catch (ex) { | ||
} | ||
// No grunt install found! | ||
if (!gruntpath) { | ||
console.error('Grunt not found'); | ||
return stackCallback(new Error('Grunt error')); | ||
} | ||
var grunt = require(gruntpath); | ||
// TODO: hack (only hardcore) | ||
var oldGruntExit = grunt.util.exit; | ||
grunt.util.exit = function(exitCode, streams) { | ||
grunt.util.exit = oldGruntExit; | ||
if (exitCode === 0) { | ||
console.log('General grunt ok'); | ||
return stackCallback(null); | ||
} | ||
console.error('General grunt error'); | ||
oldGruntExit(exitCode, streams); | ||
}; | ||
console.log('Run general grunt'); | ||
grunt.cli({force: true}); | ||
}); | ||
} | ||
async.series(stack, function (err) { | ||
callback(err, dependencies); | ||
}); | ||
}); | ||
}; | ||
// ----------------------- | ||
Project.prototype._analyse = function (callback) { | ||
@@ -94,3 +171,3 @@ var __self = this; | ||
function (asyncCallback) { | ||
__self._readMultikJson(asyncCallback) | ||
__self._readMultikJson(asyncCallback); | ||
}, | ||
@@ -112,14 +189,51 @@ function (asyncCallback) { | ||
var jsonFile = this._jsonFile; | ||
var jsonFile = this._multikJsonFile; | ||
var jsonRepoFile = this._multikRepoJsonFile; | ||
var jsonRepoGlobalFile = this._multikRepoGlobalJsonFile; | ||
var __self = this; | ||
multikJson.read(jsonFile, function (err, json) { | ||
if (err) { | ||
console.error('Syntax error in JSON file: ' + err.file); | ||
return callback(err); | ||
} | ||
__self._json = json; | ||
var overrideRepo = {}; | ||
return callback(null); | ||
var stack = []; | ||
stack.push (function(stackCallback){ | ||
multikJson.read(jsonFile, function (err, json) { | ||
if (err) { | ||
console.error('File not found or syntax error in JSON file: ' + err.file); | ||
return stackCallback(err); | ||
} | ||
__self._json = json; | ||
return stackCallback(null); | ||
}); | ||
}); | ||
stack.push (function(stackCallback){ | ||
multikJson.read(jsonRepoGlobalFile, function (err, json) { | ||
if (err) { | ||
return stackCallback(null); | ||
} | ||
overrideRepo = json; | ||
return stackCallback(null); | ||
}); | ||
}); | ||
stack.push (function(stackCallback){ | ||
multikJson.read(jsonRepoFile, function (err, json) { | ||
if (err) { | ||
return stackCallback(null); | ||
} | ||
__self._jsonOverrideRepo = undersore.extend(overrideRepo, json);; | ||
return stackCallback(null); | ||
}); | ||
}); | ||
async.series(stack, function (err) { | ||
callback(err); | ||
}); | ||
}; | ||
@@ -133,7 +247,14 @@ | ||
var config = this._config; | ||
var options = this._options; | ||
var json = this._json; | ||
var jsonOverrideRepo = this._jsonOverrideRepo; | ||
var groups = json.groups || {}; | ||
var dependencies = []; | ||
var stack = []; | ||
var dependencyId; | ||
var filter; | ||
if (L.isString(options.filter)) { | ||
filter = mout.string.trim(options.filter); | ||
} | ||
for (dependencyId in json.dependencies) { | ||
@@ -155,3 +276,24 @@ var dependOptions = json.dependencies[dependencyId]; | ||
if (dependOptions.repo | ||
&& jsonOverrideRepo[dependOptions.name] | ||
&& jsonOverrideRepo[dependOptions.name].repo){ | ||
dependOptions.repo = jsonOverrideRepo[dependOptions.name].repo; | ||
} | ||
var dependency = new Dependency(config, dependOptions); | ||
if (filter) { | ||
// mk-grunt --filter=@<dependGroup> | ||
if (filter.indexOf('@') > -1) { | ||
var group = filter.slice(1); | ||
if (dependency.group !== group) { | ||
continue; | ||
} | ||
} | ||
// mk-grunt --filter=<dependName> | ||
else if (filter !== dependency.name) { | ||
continue; | ||
} | ||
} | ||
dependencies.push(dependency); | ||
@@ -158,0 +300,0 @@ } |
@@ -10,4 +10,2 @@ /* | ||
var possibleJsons = ['multik.json', '.multik.json']; | ||
function read(file, options, callback) { | ||
@@ -25,13 +23,2 @@ if (typeof options === 'function') { | ||
// It's a directory, so we find the json inside it | ||
if (stat.isDirectory()) { | ||
return find(file, function (err, file) { | ||
if (err) { | ||
return callback(err); | ||
} | ||
read(file, options, callback); | ||
}); | ||
} | ||
// Otherwise read it | ||
@@ -111,30 +98,2 @@ fs.readFile(file, function (err, contents) { | ||
function find(folder, files, callback) { | ||
var err; | ||
var file; | ||
if (typeof files === 'function') { | ||
callback = files; | ||
files = possibleJsons; | ||
} | ||
if (!files.length) { | ||
err = createError('None of ' + possibleJsons.join(', ') + ' were found in ' + folder, 'ENOENT'); | ||
return callback(err); | ||
} | ||
file = path.resolve(path.join(folder, files[0])); | ||
fs.exists(file, function (exists) { | ||
if (!exists) { | ||
return find(folder, files.slice(1), callback); | ||
} | ||
if (files[0] !== 'component.json') { | ||
return callback(null, file); | ||
} | ||
callback(null, file); | ||
}); | ||
} | ||
module.exports = read; | ||
@@ -145,2 +104,1 @@ module.exports.read = read; | ||
module.exports.normalize = normalize; | ||
module.exports.find = find; |
@@ -5,6 +5,7 @@ { | ||
"author": "Alexander Kuzmin <roosit@abricos.org>", | ||
"version": "0.0.1", | ||
"version": "0.1.3", | ||
"license": "MIT", | ||
"bin": { | ||
"mk": "./bin/mk" | ||
"mk": "./bin/mk", | ||
"mk-grunt": "./bin/mk" | ||
}, | ||
@@ -18,7 +19,7 @@ "repository": { | ||
"build", | ||
"web", | ||
"tool", | ||
"cli", | ||
"scaffold", | ||
"git" | ||
"git", | ||
"clone", | ||
"update" | ||
], | ||
@@ -35,4 +36,7 @@ "dependencies": { | ||
"async": "~0.2.10", | ||
"deep-extend": "~0.2.6" | ||
"deep-extend": "~0.2.6", | ||
"grunt": "~0.4.2", | ||
"underscore": "^1.7.0", | ||
"resolve": "~0.6.1" | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
34120
22
882
13
8
+ Addedgrunt@~0.4.2
+ Addedresolve@~0.6.1
+ Addedunderscore@^1.7.0
+ Addedargparse@0.1.16(transitive)
+ Addedasync@0.1.22(transitive)
+ Addedcoffee-script@1.3.3(transitive)
+ Addedcolors@0.6.2(transitive)
+ Addeddateformat@1.0.2-1.2.3(transitive)
+ Addedesprima@1.0.4(transitive)
+ Addedeventemitter2@0.4.14(transitive)
+ Addedexit@0.1.2(transitive)
+ Addedfindup-sync@0.1.3(transitive)
+ Addedgetobject@0.1.0(transitive)
+ Addedglob@3.1.213.2.11(transitive)
+ Addedgraceful-fs@1.2.3(transitive)
+ Addedgrunt@0.4.5(transitive)
+ Addedgrunt-legacy-log@0.1.3(transitive)
+ Addedgrunt-legacy-log-utils@0.1.1(transitive)
+ Addedgrunt-legacy-util@0.2.0(transitive)
+ Addedhooker@0.2.3(transitive)
+ Addediconv-lite@0.2.11(transitive)
+ Addedinherits@1.0.22.0.4(transitive)
+ Addedjs-yaml@2.0.5(transitive)
+ Addedlodash@0.9.22.4.2(transitive)
+ Addedlru-cache@2.7.3(transitive)
+ Addedminimatch@0.2.140.3.0(transitive)
+ Addednopt@1.0.10(transitive)
+ Addedresolve@0.6.3(transitive)
+ Addedrimraf@2.2.8(transitive)
+ Addedsigmund@1.0.1(transitive)
+ Addedunderscore@1.13.71.7.0(transitive)
+ Addedunderscore.string@2.2.12.3.32.4.0(transitive)
+ Addedwhich@1.0.9(transitive)