1 | module.exports = distTag
|
2 |
|
3 | var log = require("npmlog")
|
4 | var npa = require("npm-package-arg")
|
5 | var semver = require("semver")
|
6 |
|
7 | var npm = require("./npm.js")
|
8 | var mapToRegistry = require("./utils/map-to-registry.js")
|
9 | var readLocalPkg = require("./utils/read-local-package.js")
|
10 |
|
11 | distTag.usage = "npm dist-tag add <pkg>@<version> [<tag>]"
|
12 | + "\nnpm dist-tag rm <pkg> <tag>"
|
13 | + "\nnpm dist-tag ls [<pkg>]"
|
14 |
|
15 | distTag.completion = function (opts, cb) {
|
16 | var argv = opts.conf.argv.remain
|
17 | if (argv.length === 2) {
|
18 | return cb(null, ["add", "rm", "ls"])
|
19 | }
|
20 |
|
21 | switch (argv[2]) {
|
22 | default:
|
23 | return cb()
|
24 | }
|
25 | }
|
26 |
|
27 | function distTag (args, cb) {
|
28 | var cmd = args.shift()
|
29 | switch (cmd) {
|
30 | case "add": case "a": case "set": case "s":
|
31 | return add(args[0], args[1], cb)
|
32 | case "rm": case "r": case "del": case "d": case "remove":
|
33 | return remove(args[1], args[0], cb)
|
34 | case "ls": case "l": case "sl": case "list":
|
35 | return list(args[0], cb)
|
36 | default:
|
37 | return cb("Usage:\n"+distTag.usage)
|
38 | }
|
39 | }
|
40 |
|
41 | function add (spec, tag, cb) {
|
42 | var thing = npa(spec || "")
|
43 | var pkg = thing.name
|
44 | var version = thing.rawSpec
|
45 | var t = (tag || npm.config.get("tag")).trim()
|
46 |
|
47 | log.verbose("dist-tag add", t, "to", pkg+"@"+version)
|
48 |
|
49 | if (!pkg || !version || !t) return cb("Usage:\n"+distTag.usage)
|
50 |
|
51 | if (semver.validRange(t)) {
|
52 | var er = new Error("Tag name must not be a valid SemVer range: " + t)
|
53 | return cb(er)
|
54 | }
|
55 |
|
56 | fetchTags(pkg, function (er, tags) {
|
57 | if (er) return cb(er)
|
58 |
|
59 | if (tags[t] === version) {
|
60 | log.warn("dist-tag add", t, "is already set to version", version)
|
61 | return cb()
|
62 | }
|
63 | tags[t] = version
|
64 |
|
65 | mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
|
66 | var params = {
|
67 | package : pkg,
|
68 | distTag : t,
|
69 | version : version,
|
70 | auth : auth
|
71 | }
|
72 |
|
73 | npm.registry.distTags.add(base, params, function (er) {
|
74 | if (er) return cb(er)
|
75 |
|
76 | console.log("+"+t+": "+pkg+"@"+version)
|
77 | cb()
|
78 | })
|
79 | })
|
80 | })
|
81 | }
|
82 |
|
83 | function remove (tag, pkg, cb) {
|
84 | log.verbose("dist-tag del", tag, "from", pkg)
|
85 |
|
86 | fetchTags(pkg, function (er, tags) {
|
87 | if (er) return cb(er)
|
88 |
|
89 | if (!tags[tag]) {
|
90 | log.info("dist-tag del", tag, "is not a dist-tag on", pkg)
|
91 | return cb(new Error(tag+" is not a dist-tag on "+pkg))
|
92 | }
|
93 |
|
94 | var version = tags[tag]
|
95 | delete tags[tag]
|
96 |
|
97 | mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
|
98 | var params = {
|
99 | package : pkg,
|
100 | distTag : tag,
|
101 | auth : auth
|
102 | }
|
103 |
|
104 | npm.registry.distTags.rm(base, params, function (er) {
|
105 | if (er) return cb(er)
|
106 |
|
107 | console.log("-"+tag+": "+pkg+"@"+version)
|
108 | cb()
|
109 | })
|
110 | })
|
111 | })
|
112 | }
|
113 |
|
114 | function list (pkg, cb) {
|
115 | if (!pkg) return readLocalPkg(function (er, pkg) {
|
116 | if (er) return cb(er)
|
117 | if (!pkg) return cb(distTag.usage)
|
118 | list(pkg, cb)
|
119 | })
|
120 |
|
121 | fetchTags(pkg, function (er, tags) {
|
122 | if (er) {
|
123 | log.error("dist-tag ls", "Couldn't get dist-tag data for", pkg)
|
124 | return cb(er)
|
125 | }
|
126 | var msg = Object.keys(tags).map(function (k) {
|
127 | return k+": "+tags[k]
|
128 | }).sort().join("\n")
|
129 | console.log(msg)
|
130 | cb(er, tags)
|
131 | })
|
132 | }
|
133 |
|
134 | function fetchTags (pkg, cb) {
|
135 | mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
|
136 | if (er) return cb(er)
|
137 |
|
138 | var params = {
|
139 | package : pkg,
|
140 | auth : auth
|
141 | }
|
142 | npm.registry.distTags.fetch(base, params, function (er, tags) {
|
143 | if (er) return cb(er)
|
144 | if (!tags || !Object.keys(tags).length) {
|
145 | return cb(new Error("No dist-tags found for " + pkg))
|
146 | }
|
147 |
|
148 | cb(null, tags)
|
149 | })
|
150 | })
|
151 | }
|