| // npm submodule <pkg> |
| // Check the package contents for a git repository url. |
| // If there is one, then create a git submodule in the node_modules folder. |
| |
| module.exports = submodule |
| |
| var npm = require("./npm.js") |
| , exec = require("child_process").execFile |
| , cache = require("./cache.js") |
| , asyncMap = require("slide").asyncMap |
| , chain = require("slide").chain |
| , which = require("which") |
| |
| submodule.usage = "npm submodule <pkg>" |
| |
| submodule.completion = require("./docs.js").completion |
| |
| function submodule (args, cb) { |
| if (npm.config.get("global")) { |
| return cb(new Error("Cannot use submodule command in global mode.")) |
| } |
| |
| if (args.length === 0) return cb(submodule.usage) |
| |
| asyncMap(args, function (arg, cb) { |
| cache.add(arg, cb) |
| }, function (er, pkgs) { |
| if (er) return cb(er) |
| chain(pkgs.map(function (pkg) { return function (cb) { |
| submodule_(pkg, cb) |
| }}), cb) |
| }) |
| |
| } |
| |
| function submodule_ (pkg, cb) { |
| if (!pkg.repository |
| || pkg.repository.type !== "git" |
| || !pkg.repository.url) { |
| return cb(new Error(pkg._id + ": No git repository listed")) |
| } |
| |
| // prefer https:// github urls |
| pkg.repository.url = pkg.repository.url |
| .replace(/^(git:\/\/)?(git@)?github.com[:\/]/, "https://github.com/") |
| |
| // first get the list of submodules, and update if it's already there. |
| getSubmodules(function (er, modules) { |
| if (er) return cb(er) |
| // if there's already a submodule, then just update it. |
| if (modules.indexOf(pkg.name) !== -1) { |
| return updateSubmodule(pkg.name, cb) |
| } |
| addSubmodule(pkg.name, pkg.repository.url, cb) |
| }) |
| } |
| |
| function updateSubmodule (name, cb) { |
| var git = npm.config.get("git") |
| var args = [ "submodule", "update", "--init", "node_modules/", name ] |
| |
| // check for git |
| which(git, function (err) { |
| if (err) { |
| err.code = "ENOGIT" |
| return cb(err) |
| } |
| |
| exec(git, args, cb) |
| }) |
| } |
| |
| function addSubmodule (name, url, cb) { |
| var git = npm.config.get("git") |
| var args = [ "submodule", "add", url, "node_modules/", name ] |
| |
| // check for git |
| which(git, function (err) { |
| if (err) { |
| err.code = "ENOGIT" |
| return cb(err) |
| } |
| |
| exec(git, args, function (er) { |
| if (er) return cb(er) |
| updateSubmodule(name, cb) |
| }) |
| }) |
| } |
| |
| |
| var getSubmodules = function getSubmodules (cb) { |
| var git = npm.config.get("git") |
| var args = [ "submodule", "status" ] |
| |
| // check for git |
| which(git, function (err) { |
| if (err) { |
| err.code = "ENOGIT" |
| return cb(err) |
| } |
| exec(git, args, function (er, stdout, stderr) { |
| if (er) return cb(er) |
| res = stdout.trim().split(/\n/).map(function (line) { |
| return line.trim().split(/\s+/)[1] |
| }).filter(function (line) { |
| // only care about submodules in the node_modules folder. |
| return line && line.match(/^node_modules\//) |
| }).map(function (line) { |
| return line.replace(/^node_modules\//g, "") |
| }) |
| |
| // memoize. |
| getSubmodules = function (cb) { return cb(null, res) } |
| |
| cb(null, res) |
| }) |
| }) |
| } |