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