Merge remote-tracking branch 'upstream/v0.10'
[platform/upstream/nodejs.git] / deps / npm / lib / bugs.js
1
2 module.exports = bugs
3
4 bugs.usage = "npm bugs <pkgname>"
5
6 var npm = require("./npm.js")
7   , registry = npm.registry
8   , log = require("npmlog")
9   , opener = require("opener")
10   , path = require("path")
11   , readJson = require("read-package-json")
12   , fs = require("fs")
13
14 bugs.completion = function (opts, cb) {
15   if (opts.conf.argv.remain.length > 2) return cb()
16   registry.get("/-/short", 60000, function (er, list) {
17     return cb(null, list || [])
18   })
19 }
20
21 function bugs (args, cb) {
22   var n = args.length && args[0].split("@").shift() || '.'
23   fs.stat(n, function (er, s) {
24     if (er && er.code === "ENOENT") return callRegistry(n, cb)
25     else if (er) return cb (er)
26     if (!s.isDirectory()) return callRegistry(n, cb)
27     readJson(path.resolve(n, "package.json"), function(er, d) {
28       if (er) return cb(err)
29       getUrlAndOpen(d, cb)
30     })
31   })
32 }
33
34 function getUrlAndOpen (d, cb) {
35   var bugs = d.bugs
36     , repo = d.repository || d.repositories
37     , url
38   if (bugs) {
39     url = (typeof url === "string") ? bugs : bugs.url
40   } else if (repo) {
41     if (Array.isArray(repo)) repo = repo.shift()
42     if (repo.hasOwnProperty("url")) repo = repo.url
43     log.verbose("repository", repo)
44     if (bugs && bugs.match(/^(https?:\/\/|git(:\/\/|@))github.com/)) {
45       url = bugs.replace(/^git(@|:\/\/)/, "https://")
46                 .replace(/^https?:\/\/github.com:/, "https://github.com/")
47                 .replace(/\.git$/, '')+"/issues"
48     }
49   }
50   if (!url) {
51     url = "https://npmjs.org/package/" + d.name
52   }
53   opener(url, { command: npm.config.get("browser") }, cb)
54 }
55
56 function callRegistry (n, cb) {
57   registry.get(n + "/latest", 3600, function (er, d) {
58     if (er) return cb(er)
59     getUrlAndOpen (d, cb)
60   })
61 }