1 |
|
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 | 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 |
|
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 |
|
58 |
|
59 |
|
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 |
|
81 | function checkGit (data, cb) {
|
82 | var git = npm.config.get("git")
|
83 | var args = [ "status", "--porcelain" ]
|
84 | var env = process.env
|
85 |
|
86 |
|
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 |
|
121 | function write (data, cb) {
|
122 | fs.writeFile( path.join(process.cwd(), "package.json")
|
123 | , new Buffer(JSON.stringify(data, null, 2) + "\n")
|
124 | , cb )
|
125 | }
|