diff --git a/lib/version.js b/lib/version.js index 80c068b914a..930708676ed 100644 --- a/lib/version.js +++ b/lib/version.js @@ -54,6 +54,8 @@ function version (args, silent, cb_) { data.version = newVersion checkGit(function (er, hasGit) { + if (er) return cb_(er) + write(data, "package.json", function (er) { if (er) return cb_(er) diff --git a/test/tap/version-git-not-clean.js b/test/tap/version-git-not-clean.js new file mode 100644 index 00000000000..3271fda8cab --- /dev/null +++ b/test/tap/version-git-not-clean.js @@ -0,0 +1,78 @@ +var common = require("../common-tap.js") +var test = require("tap").test +var npm = require("../../") +var osenv = require("osenv") +var path = require("path") +var fs = require("fs") +var rimraf = require("rimraf") +var mkdirp = require("mkdirp") +var which = require("which") +var spawn = require("child_process").spawn + +var pkg = path.resolve(__dirname, "version-git-not-clean") +var cache = path.resolve(pkg, "cache") + +test("npm version with working directory not clean", function (t) { + setup() + npm.load({ cache: cache, registry: common.registry}, function () { + which("git", function (err, git) { + t.ifError(err, "git found on system") + function gitInit(_cb) { + var child = spawn(git, ["init"]) + var out = "" + child.stdout.on("data", function (d) { + out += d.toString() + }) + child.on("exit", function () { + return _cb(out) + }) + } + function addPackageJSON(_cb) { + var data = JSON.stringify({ name: "blah", version: "0.1.2" }) + fs.writeFile("package.json", data, function() { + var child = spawn(git, ["add", "package.json"]) + child.on("exit", function () { + var child2 = spawn(git, ["commit", "package.json", "-m", "init"]) + var out = "" + child2.stdout.on("data", function (d) { + out += d.toString() + }) + child2.on("exit", function () { + return _cb(out) + }) + }) + }) + } + + gitInit(function() { + addPackageJSON(function() { + var data = JSON.stringify({ name: "blah", version: "0.1.3" }) + fs.writeFile("package.json", data, function() { + npm.commands.version(["patch"], function (err) { + if (!err) { + t.fail("should fail on non-clean working directory") + } else { + t.equal(err.message, "Git working directory not clean.\nM package.json") + } + t.end() + }) + }) + }) + }) + }) + }) +}) + +test("cleanup", function (t) { + // windows fix for locked files + process.chdir(osenv.tmpdir()) + + rimraf.sync(pkg) + t.end() +}) + +function setup() { + mkdirp.sync(pkg) + mkdirp.sync(cache) + process.chdir(pkg) +}