Skip to content

Commit

Permalink
Merge pull request #9052 from CartoDB/grunt_prefligh
Browse files Browse the repository at this point in the history
added checks to run grunt
  • Loading branch information
Raul Ochoa authored Jul 21, 2016
2 parents 293b8d0 + 2e5f864 commit cc8ccca
Show file tree
Hide file tree
Showing 3 changed files with 107 additions and 1 deletion.
3 changes: 2 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
language: node_js
node_js:
- "4.1"
- "0.10"

before_install:
- git submodule update --init --recursive
Expand All @@ -9,6 +9,7 @@ install:
- npm install

before_script:
- npm install -g npm@2.14
- npm install -g grunt-cli

script:
Expand Down
56 changes: 56 additions & 0 deletions Gruntfile.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
var _ = require('underscore');
var timer = require("grunt-timer");
var jasmineCfg = require('./lib/build/tasks/jasmine.js');
var duplicatedDependencies = require('./lib/build/tasks/shrinkwrap-duplicated-dependencies.js');

var REQUIRED_NPM_VERSION = /2.14.[0-9]+/;
var REQUIRED_NODE_VERSION = /0.10.[0-9]+/;
var SHRINKWRAP_MODULES_TO_VALIDATE = [
'backbone',
'camshaft-reference',
'carto',
'cartodb.js',
'cartocolor',
'd3',
'jquery',
'leaflet',
'perfect-scrollbar',
'torque.js',
'turbo-carto'
];

/**
* CartoDB UI assets generation
Expand All @@ -10,6 +27,45 @@

if (timer) timer.init(grunt);

function preFlight(done) {
function checkVersion(cmd, versionRegExp, name, done) {
require("child_process").exec(cmd, function (error, stdout, stderr) {
var err = null;
if (error) {
err = 'failed to check version for ' + name;
} else {
if (!versionRegExp.test(stdout)) {
err = 'installed ' + name + ' version does not match with required one ' + versionRegExp.toString() + " installed: " + stdout;
}
}
if (err) {
grunt.log.fail(err);
}
done && done(err ? new Error(err): null);
});
}
checkVersion('npm -v', REQUIRED_NPM_VERSION, 'npm', done);
checkVersion('node -v', REQUIRED_NODE_VERSION, 'node', done);
}

preFlight(function (err) {
if (err) {
grunt.log.fail("############### /!\\ CAUTION /!\\ #################");
grunt.log.fail("PLEASE installed required versions to build CARTO:\n- npm: " + REQUIRED_NPM_VERSION + "\n- node: " + REQUIRED_NODE_VERSION);
grunt.log.fail("#################################################");
process.exit(1);
}
});

var duplicatedModules = duplicatedDependencies(require('./npm-shrinkwrap.json'), SHRINKWRAP_MODULES_TO_VALIDATE);
if (duplicatedModules.length > 0) {
grunt.log.fail("############### /!\\ CAUTION /!\\ #################");
grunt.log.fail("Duplicated dependencies found in npm-shrinkwrap.json file.");
grunt.log.fail(JSON.stringify(duplicatedModules, null, 4));
grunt.log.fail("#################################################");
process.exit(1);
}

var ROOT_ASSETS_DIR = './public/assets/';
var ASSETS_DIR = './public/assets/<%= pkg.version %>';

Expand Down
49 changes: 49 additions & 0 deletions lib/build/tasks/shrinkwrap-duplicated-dependencies.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
function alldeps (mod, deps, name, parentVersion) {
name = name || mod.name;
return Object.keys(mod.dependencies).reduce(function (all, dependency) {
if (!all.hasOwnProperty(dependency)) {
all[dependency] = {};
}

var version = mod.dependencies[dependency].version;
var resolved = mod.dependencies[dependency].resolved;
if (!all[dependency].hasOwnProperty(version)) {
all[dependency][resolved] = {};
}

all[dependency][resolved][name] = parentVersion || version;
if (mod.dependencies[dependency].dependencies) {
alldeps(mod.dependencies[dependency], all, dependency, version);
}
return all;
}, deps || {});
}

/**
* Checks all modules dependencies versions within a npm-shrinkwrap to not be
* duplicated from different parent dependencies.
*
* For instance if there are a couple of dependencies using a different version
* of backbone it will return backbone with its parent dependencies.
*/
function duplicated (shrinkwrap, modulesToValidate) {
shrinkwrap = shrinkwrap || require('./npm-shrinkwrap.json');
var all = alldeps(shrinkwrap);

modulesToValidate = modulesToValidate || Object.keys(all);

return modulesToValidate.reduce(function (duplicatedMods, mod) {
var modVersions = Object.keys(all[mod]);
if (modVersions.length > 1) {
var invalidMod = { name: mod, versions: [] };

modVersions.forEach(function (modVersion) {
invalidMod.versions.push({version: modVersion, from: all[mod][modVersion]});
});
duplicatedMods.push(invalidMod);
}
return duplicatedMods;
}, []);
}

module.exports = duplicated;

0 comments on commit cc8ccca

Please sign in to comment.