Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorForrest L Norvell <forrest@npmjs.com>2014-12-05 10:27:21 +0300
committerForrest L Norvell <forrest@npmjs.com>2015-01-23 16:51:03 +0300
commitdc51810e08c0f104259146c9c035d255de4f7d1d (patch)
tree2dba8e8ef9d2af439459b0a72ea85d32bff26a96 /lib
parentb5b0e3cde946529e2c86d58cd491f54d7f69c6d3 (diff)
add 'npm dist-tag {add,del,list}'
Diffstat (limited to 'lib')
-rw-r--r--lib/dist-tag.js151
-rw-r--r--lib/npm.js2
-rw-r--r--lib/owner.js10
-rw-r--r--lib/utils/read-local-package.js12
4 files changed, 166 insertions, 9 deletions
diff --git a/lib/dist-tag.js b/lib/dist-tag.js
new file mode 100644
index 000000000..48b40202f
--- /dev/null
+++ b/lib/dist-tag.js
@@ -0,0 +1,151 @@
+module.exports = distTag
+
+var log = require("npmlog")
+var npa = require("npm-package-arg")
+var semver = require("semver")
+
+var npm = require("./npm.js")
+var mapToRegistry = require("./utils/map-to-registry.js")
+var readLocalPkg = require("./utils/read-local-package.js")
+
+distTag.usage = "npm dist-tag add <pkg>@<version> [<tag>]"
+ + "\nnpm dist-tag rm <pkg> <tag>"
+ + "\nnpm dist-tag ls [<pkg>]"
+
+distTag.completion = function (opts, cb) {
+ var argv = opts.conf.argv.remain
+ if (argv.length === 2) {
+ return cb(null, ["add", "rm", "ls"])
+ }
+
+ switch (argv[2]) {
+ default:
+ return cb()
+ }
+}
+
+function distTag (args, cb) {
+ var cmd = args.shift()
+ switch (cmd) {
+ case "add": case "a": case "set": case "s":
+ return add(args[0], args[1], cb)
+ case "rm": case "r": case "del": case "d": case "remove":
+ return remove(args[1], args[0], cb)
+ case "ls": case "l": case "sl": case "list":
+ return list(args[0], cb)
+ default:
+ return cb("Usage:\n"+distTag.usage)
+ }
+}
+
+function add (spec, tag, cb) {
+ var thing = npa(spec || "")
+ var pkg = thing.name
+ var version = thing.rawSpec
+ var t = (tag || npm.config.get("tag")).trim()
+
+ log.verbose("dist-tag add", t, "to", pkg+"@"+version)
+
+ if (!pkg || !version || !t) return cb("Usage:\n"+distTag.usage)
+
+ if (semver.validRange(t)) {
+ var er = new Error("Tag name must not be a valid SemVer range: " + t)
+ return cb(er)
+ }
+
+ fetchTags(pkg, function (er, tags) {
+ if (er) return cb(er)
+
+ if (tags[t] === version) {
+ log.warn("dist-tag add", t, "is already set to version", version)
+ return cb()
+ }
+ tags[t] = version
+
+ mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
+ var params = {
+ package : pkg,
+ distTag : t,
+ version : version,
+ auth : auth
+ }
+
+ npm.registry.distTags.add(base, params, function (er) {
+ if (er) return cb(er)
+
+ console.log("+"+t+": "+pkg+"@"+version)
+ cb()
+ })
+ })
+ })
+}
+
+function remove (tag, pkg, cb) {
+ log.verbose("dist-tag del", tag, "from", pkg)
+
+ fetchTags(pkg, function (er, tags) {
+ if (er) return cb(er)
+
+ if (!tags[tag]) {
+ log.info("dist-tag del", tag, "is not a dist-tag on", pkg)
+ return cb(new Error(tag+" is not a dist-tag on "+pkg))
+ }
+
+ var version = tags[tag]
+ delete tags[tag]
+
+ mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
+ var params = {
+ package : pkg,
+ distTag : tag,
+ auth : auth
+ }
+
+ npm.registry.distTags.rm(base, params, function (er) {
+ if (er) return cb(er)
+
+ console.log("-"+tag+": "+pkg+"@"+version)
+ cb()
+ })
+ })
+ })
+}
+
+function list (pkg, cb) {
+ if (!pkg) return readLocalPkg(function (er, pkg) {
+ if (er) return cb(er)
+ if (!pkg) return cb(distTag.usage)
+ list(pkg, cb)
+ })
+
+ fetchTags(pkg, function (er, tags) {
+ if (er) {
+ log.error("dist-tag ls", "Couldn't get dist-tag data for", pkg)
+ return cb(er)
+ }
+ var msg = Object.keys(tags).map(function (k) {
+ return k+": "+tags[k]
+ }).sort().join("\n")
+ console.log(msg)
+ cb(er, tags)
+ })
+}
+
+function fetchTags (pkg, cb) {
+ mapToRegistry(pkg, npm.config, function (er, uri, auth, base) {
+ if (er) return cb(er)
+
+ var params = {
+ package : pkg,
+ auth : auth
+ }
+ npm.registry.distTags.fetch(base, params, function (er, tags) {
+ if (er) return cb(er)
+ if (!tags || !Object.keys(tags).length) {
+ return cb(new Error("No dist-tags found for " + pkg))
+ }
+
+ cb(null, tags)
+ })
+ })
+}
diff --git a/lib/npm.js b/lib/npm.js
index 28c57712c..8077e8ac9 100644
--- a/lib/npm.js
+++ b/lib/npm.js
@@ -67,6 +67,7 @@ var commandCache = {}
, "isntall" : "install"
, "up" : "update"
, "c" : "config"
+ , "dist-tags" : "dist-tag"
, "info" : "view"
, "show" : "view"
, "find" : "search"
@@ -132,6 +133,7 @@ var commandCache = {}
, "prefix"
, "bin"
, "whoami"
+ , "dist-tag"
, "test"
, "stop"
diff --git a/lib/owner.js b/lib/owner.js
index 7b3450833..3d33a932a 100644
--- a/lib/owner.js
+++ b/lib/owner.js
@@ -6,8 +6,8 @@ owner.usage = "npm owner add <username> <pkg>"
var npm = require("./npm.js")
, log = require("npmlog")
- , readJson = require("read-package-json")
, mapToRegistry = require("./utils/map-to-registry.js")
+ , readLocalPkg = require("./utils/read-local-package.js")
owner.completion = function (opts, cb) {
var argv = opts.conf.argv.remain
@@ -252,14 +252,6 @@ function mutate (pkg, user, mutation, cb) {
}
}
-function readLocalPkg (cb) {
- if (npm.config.get("global")) return cb()
- var path = require("path")
- readJson(path.resolve(npm.prefix, "package.json"), function (er, d) {
- return cb(er, d && d.name)
- })
-}
-
function unknown (action, cb) {
cb("Usage: \n" + owner.usage)
}
diff --git a/lib/utils/read-local-package.js b/lib/utils/read-local-package.js
new file mode 100644
index 000000000..ca6d61321
--- /dev/null
+++ b/lib/utils/read-local-package.js
@@ -0,0 +1,12 @@
+exports = module.exports = readLocalPkg
+
+var npm = require("../npm.js")
+ , readJson = require("read-package-json")
+
+function readLocalPkg (cb) {
+ if (npm.config.get("global")) return cb()
+ var path = require("path")
+ readJson(path.resolve(npm.prefix, "package.json"), function (er, d) {
+ return cb(er, d && d.name)
+ })
+}