From f16f88d6bba316f20d13c380fece4dbe6b2f6208 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Thu, 5 Nov 2015 12:28:00 +0000 Subject: [PATCH] add concurrency to bootstrap script --- package.json | 4 +- scripts/bootstrap.js | 95 +++++++++++++++++++++++++++----------------- 2 files changed, 61 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index bf070327f0..b90ea45b5f 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "private": true, "license": "MIT", "devDependencies": { + "async": "^1.5.0", "babel": "5.8.21", "babel-eslint": "^4.0.6", "babel-plugin-flow-comments": "^1.0.9", @@ -22,12 +23,13 @@ "istanbul": "^0.3.5", "lodash": "^3.10.0", "matcha": "^0.6.0", + "mkdirp": "^0.5.1", "mocha": "2.2.0", "mocha-fixtures": "^2.0.0", "output-file-sync": "^1.1.1", "path-exists": "^1.0.0", "readline-sync": "^1.2.19", - "rimraf": "^2.4.1", + "rimraf": "^2.4.3", "semver": "^5.0.0", "shelljs": "^0.5.1", "through2": "^2.0.0", diff --git a/scripts/bootstrap.js b/scripts/bootstrap.js index 632ad7600c..54a0354fe2 100755 --- a/scripts/bootstrap.js +++ b/scripts/bootstrap.js @@ -1,10 +1,13 @@ require("shelljs/global"); -var path = require("path"); -var fs = require("fs"); +var mkdirp = require("mkdirp"); +var rimraf = require("rimraf"); +var child = require("child_process"); +var async = require("async"); +var path = require("path"); +var fs = require("fs"); var CURRENT_VERSION = fs.readFileSync(__dirname + "/../VERSION", "utf8").trim(); -var OFFLINE = !!process.env.OFFLINE; // uninstall global babel install try { @@ -28,47 +31,65 @@ ls("packages/*").forEach(function (loc) { }); }); -// create links -packages.forEach(function (root) { - console.log(root.name); +async.parallelLimit(packages.map(function (root) { + return function (done) { + console.log(root.name); - var nodeModulesLoc = "packages/" + root.folder + "/node_modules"; - mkdir("-p", nodeModulesLoc); + var tasks = []; + var nodeModulesLoc = process.cwd() + "/packages/" + root.folder + "/node_modules"; - packages.forEach(function (sub) { - var ver = false; - if (root.pkg.dependencies) ver = root.pkg.dependencies[sub.name]; - if (root.pkg.devDependencies && !ver) ver = root.pkg.devDependencies[sub.name]; - if (!ver) return; + tasks.push(function (done) { + mkdirp(nodeModulesLoc, done); + }); - // ensure that this is referring to a local package - if (ver[0] !== "^" || ver[1] !== CURRENT_VERSION[0]) return; + tasks.push(function (done) { + async.each(packages, function (sub, done) { + var ver = false; + if (root.pkg.dependencies) ver = root.pkg.dependencies[sub.name]; + if (root.pkg.devDependencies && !ver) ver = root.pkg.devDependencies[sub.name]; + if (!ver) return done(); - var linkSrc = "packages/" + sub.folder; - var linkDest = nodeModulesLoc + "/" + sub.name; + // ensure that this is referring to a local package + if (ver[0] !== "^" || ver[1] !== CURRENT_VERSION[0]) return done(); - console.log("Linking", linkSrc, "to", linkDest); - if (fs.existsSync(linkDest)) fs.unlinkSync(linkDest); - ln("-s", linkSrc, linkDest); - }); + var linkSrc = process.cwd() + "/packages/" + sub.folder; + var linkDest = nodeModulesLoc + "/" + sub.name; - cd("packages/" + root.folder); + console.log("Linking", linkSrc, "to", linkDest); - // check whether or not we have any dependencies in our package.json that aren't in node_modules - var shouldRunInstall = false; - var pkg = require(process.cwd() + "/package.json"); - var deps = Object.keys(pkg.dependencies || {}).concat(Object.keys(pkg.devDependencies || {})); - deps.forEach(function (depName) { - if (!fs.existsSync(process.cwd() + "/node_modules/" + depName)) { - console.log("Not installed", depName); - shouldRunInstall = true; - } - }); - if (shouldRunInstall && !OFFLINE) exec("npm install"); + rimraf(linkDest, function (err) { + if (err) return done(err); - if (!OFFLINE) exec("npm link"); + fs.mkdir(linkDest, function (err) { + if (err) return done(err); - cd("../.."); + fs.writeFile(linkDest + "/index.js", 'module.exports = require("' + linkSrc + '");', done); + }); + }); + }, done); + }); + + tasks.push(function (done) { + child.exec("npm install", { + cwd: process.cwd() + "/packages/" + root.folder + }, function (err, stdout, stderr) { + if (err != null) { + done(stderr); + } else { + stdout = stdout.trim(); + if (stdout) console.log(stdout); + done(); + } + }); + }); + + async.series(tasks, done); + }; +}), 4, function (err) { + if (err) { + console.error(err); + process.exit(1); + } else { + process.exit(); + } }); - -if (!OFFLINE) exec("make build");