UNPKG

3.74 kBJavaScriptView Raw
1// npm version <newver>
2
3module.exports = version
4
5var 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
14version.usage = "npm version [<newversion> | major | minor | micro]\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
22function 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
58 // adding "micro" as an alias for patch, because "patch" is ambiguous
59 // see https://github.com/mojombo/semver/issues/160
60 if (args[0] === 'micro') args[0] = 'patch'
61
62 if (!newVer) newVer = semver.inc(data.version, args[0])
63 if (!newVer) return cb_(version.usage)
64 if (data.version === newVer) return cb_(new Error("Version not changed"))
65 data.version = newVer
66
67 fs.stat(path.join(process.cwd(), ".git"), function (er, s) {
68 function cb (er) {
69 if (!er && !silent) console.log("v" + newVer)
70 cb_(er)
71 }
72
73 var tags = npm.config.get('git-tag-version')
74 var doGit = !er && s.isDirectory() && tags
75 if (!doGit) return write(data, cb)
76 else checkGit(data, cb)
77 })
78 })
79}
80
81function checkGit (data, cb) {
82 var git = npm.config.get("git")
83 var args = [ "status", "--porcelain" ]
84 var env = process.env
85
86 // check for git
87 which(git, function (err) {
88 if (err) {
89 err.code = "ENOGIT"
90 return cb(err)
91 }
92
93 gitFound()
94 })
95
96 function gitFound () {
97 exec(git, args, {env: env}, function (er, stdout, stderr) {
98 var lines = stdout.trim().split("\n").filter(function (line) {
99 return line.trim() && !line.match(/^\?\? /)
100 }).map(function (line) {
101 return line.trim()
102 })
103 if (lines.length) return cb(new Error(
104 "Git working directory not clean.\n"+lines.join("\n")))
105 write(data, function (er) {
106 if (er) return cb(er)
107 var message = npm.config.get("message").replace(/%s/g, data.version)
108 , sign = npm.config.get("sign-git-tag")
109 , flag = sign ? "-sm" : "-am"
110 chain
111 ( [ [ exec, git, [ "add", "package.json" ], {env: process.env} ]
112 , [ exec, git, [ "commit", "-m", message ], {env: process.env} ]
113 , [ exec, git, [ "tag", "v" + data.version, flag, message ]
114 , {env: process.env} ] ]
115 , cb )
116 })
117 })
118 }
119}
120
121function write (data, cb) {
122 fs.writeFile( path.join(process.cwd(), "package.json")
123 , new Buffer(JSON.stringify(data, null, 2) + "\n")
124 , cb )
125}