1 |
|
2 | module.exports = rebuild
|
3 |
|
4 | var readInstalled = require("read-installed")
|
5 | , semver = require("semver")
|
6 | , log = require("npmlog")
|
7 | , npm = require("./npm.js")
|
8 | , npa = require("npm-package-arg")
|
9 |
|
10 | rebuild.usage = "npm rebuild [<name>[@<version>] [name[@<version>] ...]]"
|
11 |
|
12 | rebuild.completion = require("./utils/completion/installed-deep.js")
|
13 |
|
14 | function rebuild (args, cb) {
|
15 | var opt = { depth: npm.config.get("depth"), dev: true }
|
16 | readInstalled(npm.prefix, opt, function (er, data) {
|
17 | log.info("readInstalled", typeof data)
|
18 | if (er) return cb(er)
|
19 | var set = filter(data, args)
|
20 | , folders = Object.keys(set).filter(function (f) {
|
21 | return f !== npm.prefix
|
22 | })
|
23 | if (!folders.length) return cb()
|
24 | log.silly("rebuild set", folders)
|
25 | cleanBuild(folders, set, cb)
|
26 | })
|
27 | }
|
28 |
|
29 | function cleanBuild (folders, set, cb) {
|
30 | npm.commands.build(folders, function (er) {
|
31 | if (er) return cb(er)
|
32 | console.log(folders.map(function (f) {
|
33 | return set[f] + " " + f
|
34 | }).join("\n"))
|
35 | cb()
|
36 | })
|
37 | }
|
38 |
|
39 | function filter (data, args, set, seen) {
|
40 | if (!set) set = {}
|
41 | if (!seen) seen = {}
|
42 | if (set.hasOwnProperty(data.path)) return set
|
43 | if (seen.hasOwnProperty(data.path)) return set
|
44 | seen[data.path] = true
|
45 | var pass
|
46 | if (!args.length) pass = true // rebuild everything
|
47 | else if (data.name && data._id) {
|
48 | for (var i = 0, l = args.length; i < l; i ++) {
|
49 | var arg = args[i]
|
50 | , nv = npa(arg)
|
51 | , n = nv.name
|
52 | , v = nv.rawSpec
|
53 | if (n !== data.name) continue
|
54 | if (!semver.satisfies(data.version, v, true)) continue
|
55 | pass = true
|
56 | break
|
57 | }
|
58 | }
|
59 | if (pass && data._id) {
|
60 | log.verbose("rebuild", "path, id", [data.path, data._id])
|
61 | set[data.path] = data._id
|
62 | }
|
63 | // need to also dive through kids, always.
|
64 | // since this isn't an install these won't get auto-built unless
|
65 | // they're not dependencies.
|
66 | Object.keys(data.dependencies || {}).forEach(function (d) {
|
67 |
|
68 | var dep = data.dependencies[d]
|
69 | if (typeof dep === "string") return
|
70 | filter(dep, args, set, seen)
|
71 | })
|
72 | return set
|
73 | }
|