From b39fecbdc26eda47c8b1c252024a6afa3e456623 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20B=C3=B6nnemann?= Date: Mon, 2 Feb 2015 17:39:34 +0100 Subject: [PATCH] fix(restart): correctly prevent double `npm publish` run --- bin/semantic-release | 10 ++++++++-- package.json | 2 +- src/restart.js | 16 +++++++++++++++- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/bin/semantic-release b/bin/semantic-release index ea84a8a4..99c2fcb8 100755 --- a/bin/semantic-release +++ b/bin/semantic-release @@ -43,7 +43,14 @@ if (~argv._.indexOf('pre')) { } console.log('Publishing v' + result) - if (publish) require('../src/restart')() + if (publish) require('../src/restart')(function (err) { + if (err) { + console.log('Something went wrong.') + throw err + } + + process.exit(1) + }) }) }) } @@ -59,7 +66,6 @@ if (~argv._.indexOf('post')) { // see src/restart.js if (~npmArgv.indexOf('--semantic-release-rerun')) { console.log('Everything is alright :) npm will now print an error message that you can safely ignore.') - process.exit(1) } }) }) diff --git a/package.json b/package.json index 6536ee3f..51f40474 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "semantic-release", "description": "semantic semver compliant package publishing", - "version": "0.0.3", + "version": "0.0.5", "author": "Stephan Bönnemann ", "bin": "./bin/semantic-release", "bugs": { diff --git a/src/restart.js b/src/restart.js index bb746f25..f542194f 100644 --- a/src/restart.js +++ b/src/restart.js @@ -2,7 +2,7 @@ var spawn = require('child_process').spawn -module.exports = function () { +var exports = module.exports = function (cb) { // npm loads package.json data before running the `prepublish` hook // changing the version on `prepublish` has no effect // see https://github.com/npm/npm/issues/7118 @@ -10,7 +10,21 @@ module.exports = function () { // the package.json is then loaded again and the correct version will be published var child = spawn('npm', ['publish', '--semantic-release-rerun']) + var handler = exports.handleCloseAndExit.bind(null, cb) child.stdout.pipe(process.stdout) child.stderr.pipe(process.stderr) + + child.on('close', handler) + child.on('exit', handler) + child.on('error', cb) +} + +exports.handleCloseAndExit = function (cb, code, signal) { + if (code === 0) return cb(null) + cb({ + code: code, + signal: signal, + message: 'npm publish failed' + }) }