1 module.exports = distTag
3 var log = require("npmlog")
4 var npa = require("npm-package-arg")
5 var semver = require("semver")
7 var npm = require("./npm.js")
8 var mapToRegistry = require("./utils/map-to-registry.js")
9 var readLocalPkg = require("./utils/read-local-package.js")
11 distTag.usage = "npm dist-tag add <pkg>@<version> [<tag>]"
12 + "\nnpm dist-tag rm <pkg> <tag>"
13 + "\nnpm dist-tag ls [<pkg>]"
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"])
27 function distTag (args, cb) {
28 var cmd = args.shift()
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)
37 return cb("Usage:\n"+distTag.usage)
41 function add (spec, tag, cb) {
42 var thing = npa(spec || "")
44 var version = thing.rawSpec
45 var t = (tag || npm.config.get("tag")).trim()
47 log.verbose("dist-tag add", t, "to", pkg+"@"+version)
49 if (!pkg || !version || !t) return cb("Usage:\n"+distTag.usage)
51 if (semver.validRange(t)) {
52 var er = new Error("Tag name must not be a valid SemVer range: " + t)
56 fetchTags(pkg, function (er, tags) {
59 if (tags[t] === version) {
60 log.warn("dist-tag add", t, "is already set to version", version)
65 mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
73 npm.registry.distTags.add(base, params, function (er) {
76 console.log("+"+t+": "+pkg+"@"+version)
83 function remove (tag, pkg, cb) {
84 log.verbose("dist-tag del", tag, "from", pkg)
86 fetchTags(pkg, function (er, tags) {
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))
94 var version = tags[tag]
97 mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
104 npm.registry.distTags.rm(base, params, function (er) {
105 if (er) return cb(er)
107 console.log("-"+tag+": "+pkg+"@"+version)
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)
121 fetchTags(pkg, function (er, tags) {
123 log.error("dist-tag ls", "Couldn't get dist-tag data for", pkg)
126 var msg = Object.keys(tags).map(function (k) {
127 return k+": "+tags[k]
134 function fetchTags (pkg, cb) {
135 mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
136 if (er) return cb(er)
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))