diff options
Diffstat (limited to 'deps/npm/lib/version.js')
-rw-r--r-- | deps/npm/lib/version.js | 215 |
1 files changed, 133 insertions, 82 deletions
diff --git a/deps/npm/lib/version.js b/deps/npm/lib/version.js index a15e2c391c..930708676e 100644 --- a/deps/npm/lib/version.js +++ b/deps/npm/lib/version.js @@ -2,16 +2,15 @@ module.exports = version -var exec = require("child_process").execFile - , semver = require("semver") +var semver = require("semver") , path = require("path") , fs = require("graceful-fs") , writeFileAtomic = require("write-file-atomic") , chain = require("slide").chain , log = require("npmlog") - , which = require("which") , npm = require("./npm.js") , git = require("./utils/git.js") + , assert = require("assert") version.usage = "npm version [<newversion> | major | minor | patch | prerelease | preminor | premajor ]\n" + "\n(run in package dir)\n" @@ -24,104 +23,156 @@ version.usage = "npm version [<newversion> | major | minor | patch | prerelease function version (args, silent, cb_) { if (typeof cb_ !== "function") cb_ = silent, silent = false if (args.length > 1) return cb_(version.usage) - fs.readFile(path.join(npm.localPrefix, "package.json"), function (er, data) { - if (!args.length) { - var v = {} - Object.keys(process.versions).forEach(function (k) { - v[k] = process.versions[k] - }) - v.npm = npm.version - try { - data = JSON.parse(data.toString()) - } catch (er) { - data = null - } - if (data && data.name && data.version) { - v[data.name] = data.version - } - if (npm.config.get("json")) { - v = JSON.stringify(v, null, 2) - } - console.log(v) - return cb_() + + var packagePath = path.join(npm.localPrefix, "package.json") + fs.readFile(packagePath, function (er, data) { + function cb (er) { + if (!er && !silent) console.log("v" + data.version) + cb_(er) + } + + if (data) data = data.toString() + try { + data = JSON.parse(data) + } + catch (er) { + log.error("version", "Bad package.json data", data) + return cb_(er) } + if (!args.length && data) return dump(data.name, data.version, cb_) + if (er) { log.error("version", "No package.json found") return cb_(er) } + var newVersion = semver.valid(args[0]) + if (!newVersion) newVersion = semver.inc(data.version, args[0]) + if (!newVersion) return cb_(version.usage) + if (data.version === newVersion) return cb_(new Error("Version not changed")) + data.version = newVersion + + checkGit(function (er, hasGit) { + if (er) return cb_(er) + + write(data, "package.json", function (er) { + if (er) return cb_(er) + + updateShrinkwrap(newVersion, function (er, hasShrinkwrap) { + if (er || !hasGit) return cb(er) + + commit(data.version, hasShrinkwrap, cb) + }) + }) + }) + }) +} + +function updateShrinkwrap (newVersion, cb) { + fs.readFile(path.join(npm.localPrefix, "npm-shrinkwrap.json"), function (er, data) { + if (er && er.code === "ENOENT") return cb(null, false) + try { + data = data.toString() data = JSON.parse(data) - } catch (er) { - log.error("version", "Bad package.json data") - return cb_(er) + } + catch (er) { + log.error("version", "Bad npm-shrinkwrap.json data") + return cb(er) } - var newVer = semver.valid(args[0]) - if (!newVer) newVer = semver.inc(data.version, args[0]) - if (!newVer) return cb_(version.usage) - if (data.version === newVer) return cb_(new Error("Version not changed")) - data.version = newVer - - fs.stat(path.join(npm.localPrefix, ".git"), function (er, s) { - function cb (er) { - if (!er && !silent) console.log("v" + newVer) - cb_(er) + data.version = newVersion + write(data, "npm-shrinkwrap.json", function (er) { + if (er) { + log.error("version", "Bad npm-shrinkwrap.json data") + return cb(er) } - - var tags = npm.config.get('git-tag-version') - var doGit = !er && s.isDirectory() && tags - if (!doGit) return write(data, cb) - else checkGit(data, cb) + cb(null, true) }) }) } -function checkGit (data, cb) { - var args = [ "status", "--porcelain" ] - var options = {env: process.env} - - // check for git - git.whichAndExec(args, options, function (er, stdout) { - if (er && er.code === "ENOGIT") { - log.warn( - "version", - "This is a Git checkout, but the git command was not found.", - "npm could not create a Git tag for this release!" - ) - return write(data, cb) +function dump (name, version, cb) { + assert(typeof name === "string", "package name must be passed to version dump") + assert(typeof version === "string", "package version must be passed to version dump") + + var v = {} + + if (name) v[name] = version + v.npm = npm.version + Object.keys(process.versions).forEach(function (k) { + v[k] = process.versions[k] + }) + + if (npm.config.get("json")) v = JSON.stringify(v, null, 2) + + console.log(v) + cb() +} + +function checkGit (cb) { + fs.stat(path.join(npm.localPrefix, ".git"), function (er, s) { + var doGit = !er && s.isDirectory() && npm.config.get("git-tag-version") + if (!doGit) { + if (er) log.verbose("version", "error checking for .git", er) + log.verbose("version", "not tagging in git") + return cb(null, false) } - var lines = stdout.trim().split("\n").filter(function (line) { - return line.trim() && !line.match(/^\?\? /) - }).map(function (line) { - return line.trim() - }) - if (lines.length) return cb(new Error( - "Git working directory not clean.\n"+lines.join("\n"))) - write(data, function (er) { - if (er) return cb(er) - var message = npm.config.get("message").replace(/%s/g, data.version) - , sign = npm.config.get("sign-git-tag") - , flag = sign ? "-sm" : "-am" - chain - ( [ git.chainableExec([ "add", "package.json" ], {env: process.env}) - , git.chainableExec([ "commit", "-m", message ], {env: process.env}) - , sign && function (cb) { - npm.spinner.stop() - cb() - } - - , git.chainableExec([ "tag", "v" + data.version, flag, message ] - , {env: process.env}) ] - , cb ) - }) + // check for git + git.whichAndExec( + [ "status", "--porcelain" ], + { env : process.env }, + function (er, stdout) { + if (er && er.code === "ENOGIT") { + log.warn( + "version", + "This is a Git checkout, but the git command was not found.", + "npm could not create a Git tag for this release!" + ) + return cb(null, false) + } + + var lines = stdout.trim().split("\n").filter(function (line) { + return line.trim() && !line.match(/^\?\? /) + }).map(function (line) { + return line.trim() + }) + if (lines.length) return cb(new Error( + "Git working directory not clean.\n"+lines.join("\n") + )) + + cb(null, true) + } + ) }) } -function write (data, cb) { - writeFileAtomic( path.join(npm.localPrefix, "package.json") - , new Buffer(JSON.stringify(data, null, 2) + "\n") - , cb ) +function commit (version, hasShrinkwrap, cb) { + var options = { env : process.env } + var message = npm.config.get("message").replace(/%s/g, version) + var sign = npm.config.get("sign-git-tag") + var flag = sign ? "-sm" : "-am" + chain( + [ + git.chainableExec([ "add", "package.json" ], options), + hasShrinkwrap && git.chainableExec([ "add", "npm-shrinkwrap.json" ] , options), + git.chainableExec([ "commit", "-m", message ], options), + git.chainableExec([ "tag", "v" + version, flag, message ], options) + ], + cb + ) +} + +function write (data, file, cb) { + assert(data && typeof data === "object", "must pass data to version write") + assert(typeof file === "string", "must pass filename to write to version write") + + log.verbose("version.write", "data", data, "to", file) + writeFileAtomic( + path.join(npm.localPrefix, file), + new Buffer(JSON.stringify(data, null, 2) + "\n"), + cb + ) } |