npm: Upgrade to 1.3.17
[platform/upstream/nodejs.git] / deps / npm / lib / version.js
1 // npm version <newver>
2
3 module.exports = version
4
5 var exec = require("child_process").execFile
6   , semver = require("semver")
7   , path = require("path")
8   , fs = require("graceful-fs")
9   , chain = require("slide").chain
10   , log = require("npmlog")
11   , which = require("which")
12   , npm = require("./npm.js")
13
14 version.usage = "npm version [<newversion> | major | minor | patch]\n"
15               + "\n(run in package dir)\n"
16               + "'npm -v' or 'npm --version' to print npm version "
17               + "("+npm.version+")\n"
18               + "'npm view <pkg> version' to view a package's "
19               + "published version\n"
20               + "'npm ls' to inspect current package/dependency versions"
21
22 function version (args, silent, cb_) {
23   if (typeof cb_ !== "function") cb_ = silent, silent = false
24   if (args.length > 1) return cb_(version.usage)
25   fs.readFile(path.join(process.cwd(), "package.json"), function (er, data) {
26     if (!args.length) {
27       var v = {}
28       Object.keys(process.versions).forEach(function (k) {
29         v[k] = process.versions[k]
30       })
31       v.npm = npm.version
32       try {
33         data = JSON.parse(data.toString())
34       } catch (er) {
35         data = null
36       }
37       if (data && data.name && data.version) {
38         v[data.name] = data.version
39       }
40       console.log(v)
41       return cb_()
42     }
43
44     if (er) {
45       log.error("version", "No package.json found")
46       return cb_(er)
47     }
48
49     try {
50       data = JSON.parse(data)
51     } catch (er) {
52       log.error("version", "Bad package.json data")
53       return cb_(er)
54     }
55
56                 var newVer = semver.valid(args[0])
57                 if (!newVer) newVer = semver.inc(data.version, args[0])
58                 if (!newVer) return cb_(version.usage)
59     if (data.version === newVer) return cb_(new Error("Version not changed"))
60     data.version = newVer
61
62     fs.stat(path.join(process.cwd(), ".git"), function (er, s) {
63       function cb (er) {
64         if (!er && !silent) console.log("v" + newVer)
65         cb_(er)
66       }
67
68       var tags = npm.config.get('git-tag-version')
69       var doGit = !er && s.isDirectory() && tags
70       if (!doGit) return write(data, cb)
71       else checkGit(data, cb)
72     })
73   })
74 }
75
76 function checkGit (data, cb) {
77   var git = npm.config.get("git")
78   var args = [ "status", "--porcelain" ]
79   var env = process.env
80
81   // check for git
82   which(git, function (err) {
83     if (err) {
84       err.code = "ENOGIT"
85       return cb(err)
86     }
87
88     gitFound()
89   })
90
91   function gitFound () {
92     exec(git, args, {env: env}, function (er, stdout, stderr) {
93       var lines = stdout.trim().split("\n").filter(function (line) {
94         return line.trim() && !line.match(/^\?\? /)
95       }).map(function (line) {
96         return line.trim()
97       })
98       if (lines.length) return cb(new Error(
99         "Git working directory not clean.\n"+lines.join("\n")))
100       write(data, function (er) {
101         if (er) return cb(er)
102         var message = npm.config.get("message").replace(/%s/g, data.version)
103           , sign = npm.config.get("sign-git-tag")
104           , flag = sign ? "-sm" : "-am"
105         chain
106           ( [ [ exec, git, [ "add", "package.json" ], {env: process.env} ]
107             , [ exec, git, [ "commit", "-m", message ], {env: process.env} ]
108             , [ exec, git, [ "tag", "v" + data.version, flag, message ]
109               , {env: process.env} ] ]
110           , cb )
111       })
112     })
113   }
114 }
115
116 function write (data, cb) {
117   fs.writeFile( path.join(process.cwd(), "package.json")
118               , new Buffer(JSON.stringify(data, null, 2) + "\n")
119               , cb )
120 }