1 var fs = require('graceful-fs')
2 var path = require('path')
4 var mkdirp = require('mkdirp')
5 var osenv = require('osenv')
6 var rimraf = require('rimraf')
7 var test = require('tap').test
9 var common = require('../common-tap.js')
10 var npm = require('../../')
11 var pkg = path.resolve(__dirname, 'version-lifecycle')
12 var cache = path.resolve(pkg, 'cache')
13 var npmrc = path.resolve(pkg, './.npmrc')
14 var configContents = 'sign-git-tag=false\n'
16 test('npm version <semver> with failing preversion lifecycle script', function (t) {
18 fs.writeFileSync(path.resolve(pkg, 'package.json'), JSON.stringify({
20 name: 'version-lifecycle',
22 description: 'Test for npm version if preversion script fails',
24 preversion: './fail.sh'
27 fs.writeFileSync(path.resolve(pkg, 'fail.sh'), 'exit 50', 'utf8')
28 fs.chmodSync(path.resolve(pkg, 'fail.sh'), 448)
29 npm.load({cache: cache, 'sign-git-tag': false, registry: common.registry}, function () {
30 var version = require('../../lib/version')
31 version(['patch'], function (err) {
33 t.ok(err.message.match(/Exit status 50/))
39 test('npm version <semver> with failing version lifecycle script', function (t) {
41 fs.writeFileSync(path.resolve(pkg, 'package.json'), JSON.stringify({
43 name: 'version-lifecycle',
45 description: 'Test for npm version if postversion script fails',
50 fs.writeFileSync(path.resolve(pkg, 'fail.sh'), 'exit 50', 'utf8')
51 fs.chmodSync(path.resolve(pkg, 'fail.sh'), 448)
52 npm.load({cache: cache, 'sign-git-tag': false, registry: common.registry}, function () {
53 var version = require('../../lib/version')
54 version(['patch'], function (err) {
56 t.ok(err.message.match(/Exit status 50/))
62 test('npm version <semver> with failing postversion lifecycle script', function (t) {
64 fs.writeFileSync(path.resolve(pkg, 'package.json'), JSON.stringify({
66 name: 'version-lifecycle',
68 description: 'Test for npm version if postversion script fails',
70 postversion: './fail.sh'
73 fs.writeFileSync(path.resolve(pkg, 'fail.sh'), 'exit 50', 'utf8')
74 fs.chmodSync(path.resolve(pkg, 'fail.sh'), 448)
75 npm.load({cache: cache, 'sign-git-tag': false, registry: common.registry}, function () {
76 var version = require('../../lib/version')
77 version(['patch'], function (err) {
79 t.ok(err.message.match(/Exit status 50/))
85 test('npm version <semver> execution order', function (t) {
87 fs.writeFileSync(path.resolve(pkg, 'package.json'), JSON.stringify({
89 name: 'version-lifecycle',
91 description: 'Test for npm version if postversion script fails',
93 preversion: './preversion.sh',
94 version: './version.sh',
95 postversion: './postversion.sh'
98 makeScript('preversion')
100 makeScript('postversion')
101 npm.load({cache: cache, 'sign-git-tag': false, registry: common.registry}, function () {
102 common.makeGitRepo({path: pkg}, function (err, git) {
103 t.ifError(err, 'git bootstrap ran without error')
105 var version = require('../../lib/version')
106 version(['patch'], function (err) {
107 t.ifError(err, 'version command complete')
109 t.equal('0.0.0', readPackage('preversion').version, 'preversion')
110 t.deepEqual(readStatus('preversion', t), {
111 'preversion-package.json': 'A'
114 t.equal('0.0.1', readPackage('version').version, 'version')
115 t.deepEqual(readStatus('version', t), {
117 'preversion-package.json': 'A',
118 'version-package.json': 'A'
121 t.equal('0.0.1', readPackage('postversion').version, 'postversion')
122 t.deepEqual(readStatus('postversion', t), {
123 'postversion-package.json': 'A'
131 test('cleanup', function (t) {
132 process.chdir(osenv.tmpdir())
139 mkdirp.sync(path.join(pkg, 'node_modules'))
141 fs.writeFileSync(npmrc, configContents, 'ascii')
145 function makeScript (lifecycle) {
147 'cp package.json ' + lifecycle + '-package.json',
148 'git add ' + lifecycle + '-package.json',
149 'git status --porcelain > ' + lifecycle + '-git.txt'
151 var scriptPath = path.join(pkg, lifecycle + '.sh')
152 fs.writeFileSync(scriptPath, contents, 'utf-8')
153 fs.chmodSync(scriptPath, 448)
156 function readPackage (lifecycle) {
157 return JSON.parse(fs.readFileSync(path.join(pkg, lifecycle + '-package.json'), 'utf-8'))
160 function readStatus (lifecycle, t) {
162 fs.readFileSync(path.join(pkg, lifecycle + '-git.txt'), 'utf-8')
165 .forEach(function (line) {
167 if (line && !line.match(/^\?\? /)) {
168 var parts = line.split(/\s+/)
169 t.equal(parts.length, 2, lifecycle + ' : git status has too many words : ' + line)
170 status[parts[1].trim()] = parts[0].trim()