1var fs = require('graceful-fs') 2var path = require('path') 3 4var mkdirp = require('mkdirp') 5var rimraf = require('rimraf') 6var test = require('tap').test 7 8var common = require('../common-tap.js') 9var npm = require('../../') 10var pkg = common.pkg 11var cache = common.cache 12var npmrc = path.resolve(pkg, './.npmrc') 13var configContents = 'sign-git-commit=false\nsign-git-tag=false\n' 14 15test('npm version <semver> with failing preversion lifecycle script', function (t) { 16 setup() 17 fs.writeFileSync(path.resolve(pkg, 'package.json'), JSON.stringify({ 18 author: 'Alex Wolfe', 19 name: 'version-lifecycle', 20 version: '0.0.0', 21 description: 'Test for npm version if preversion script fails', 22 scripts: { 23 preversion: 'node ./fail.js' 24 } 25 }), 'utf8') 26 fs.writeFileSync(path.resolve(pkg, 'fail.js'), 'process.exit(50)', 'utf8') 27 npm.load({ 28 cache: cache, 29 'sign-git-commit': false, 30 'sign-git-tag': false, 31 registry: common.registry 32 }, function () { 33 var version = require('../../lib/version') 34 version(['patch'], function (err) { 35 t.ok(err) 36 t.ok(err.message.match(/Exit status 50/)) 37 t.end() 38 }) 39 }) 40}) 41 42test('npm version <semver> with failing version lifecycle script', function (t) { 43 setup() 44 fs.writeFileSync(path.resolve(pkg, 'package.json'), JSON.stringify({ 45 author: 'Alex Wolfe', 46 name: 'version-lifecycle', 47 version: '0.0.0', 48 description: 'Test for npm version if postversion script fails', 49 scripts: { 50 version: 'node ./fail.js' 51 } 52 }), 'utf8') 53 fs.writeFileSync(path.resolve(pkg, 'fail.js'), 'process.exit(50)', 'utf8') 54 npm.load({ 55 cache: cache, 56 'sign-git-commit': false, 57 'sign-git-tag': false, 58 registry: common.registry 59 }, function () { 60 var version = require('../../lib/version') 61 version(['patch'], function (err) { 62 t.ok(err) 63 t.ok(err.message.match(/Exit status 50/)) 64 t.end() 65 }) 66 }) 67}) 68 69test('npm version <semver> with failing postversion lifecycle script', function (t) { 70 setup() 71 fs.writeFileSync(path.resolve(pkg, 'package.json'), JSON.stringify({ 72 author: 'Alex Wolfe', 73 name: 'version-lifecycle', 74 version: '0.0.0', 75 description: 'Test for npm version if postversion script fails', 76 scripts: { 77 postversion: 'node ./fail.js' 78 } 79 }), 'utf8') 80 fs.writeFileSync(path.resolve(pkg, 'fail.js'), 'process.exit(50)', 'utf8') 81 npm.load({ 82 cache: cache, 83 'sign-git-commit': false, 84 'sign-git-tag': false, 85 registry: common.registry 86 }, function () { 87 var version = require('../../lib/version') 88 version(['patch'], function (err) { 89 t.ok(err) 90 t.ok(err.message.match(/Exit status 50/)) 91 t.end() 92 }) 93 }) 94}) 95 96test('npm version <semver> execution order', function (t) { 97 setup() 98 fs.writeFileSync(path.resolve(pkg, 'package.json'), JSON.stringify({ 99 author: 'Alex Wolfe', 100 name: 'version-lifecycle', 101 version: '0.0.0', 102 description: 'Test for npm version if postversion script fails', 103 scripts: { 104 preversion: 'node ./preversion.js', 105 version: 'node ./version.js', 106 postversion: 'node ./postversion.js' 107 } 108 }), 'utf8') 109 makeScript('preversion') 110 makeScript('version') 111 makeScript('postversion') 112 npm.load({ 113 cache: cache, 114 'sign-git-commit': false, 115 'sign-git-tag': false, 116 registry: common.registry 117 }, function () { 118 common.makeGitRepo({path: pkg}, function (err, git) { 119 t.ifError(err, 'git bootstrap ran without error') 120 121 var version = require('../../lib/version') 122 version(['patch'], function (err) { 123 t.ifError(err, 'version command complete') 124 125 t.equal('0.0.0', readPackage('preversion').version, 'preversion') 126 t.deepEqual(readStatus('preversion', t), { 127 'preversion-package.json': 'A' 128 }) 129 130 t.equal('0.0.1', readPackage('version').version, 'version') 131 t.deepEqual(readStatus('version', t), { 132 'package.json': 'M', 133 'preversion-package.json': 'A', 134 'version-package.json': 'A' 135 }) 136 137 t.equal('0.0.1', readPackage('postversion').version, 'postversion') 138 t.deepEqual(readStatus('postversion', t), { 139 'postversion-package.json': 'A' 140 }) 141 t.end() 142 }) 143 }) 144 }) 145}) 146 147function setup () { 148 process.chdir(__dirname) 149 rimraf.sync(pkg) 150 mkdirp.sync(pkg) 151 mkdirp.sync(path.join(pkg, 'node_modules')) 152 fs.writeFileSync(npmrc, configContents, 'ascii') 153 process.chdir(pkg) 154} 155 156function makeScript (lifecycle) { 157 function contents (lifecycle) { 158 var fs = require('fs') 159 var exec = require('child_process').exec 160 fs.createReadStream('package.json') 161 .pipe(fs.createWriteStream(lifecycle + '-package.json')) 162 .on('close', function () { 163 exec( 164 'git add ' + lifecycle + '-package.json', 165 function () { 166 exec( 167 'git status --porcelain', 168 function (err, stdout) { 169 if (err) throw err 170 fs.writeFileSync(lifecycle + '-git.txt', stdout) 171 } 172 ) 173 } 174 ) 175 }) 176 } 177 var scriptPath = path.join(pkg, lifecycle + '.js') 178 fs.writeFileSync( 179 scriptPath, 180 '(' + contents.toString() + ')(\'' + lifecycle + '\')', 181 'utf-8') 182} 183 184function readPackage (lifecycle) { 185 return JSON.parse(fs.readFileSync(path.join(pkg, lifecycle + '-package.json'), 'utf-8')) 186} 187 188function readStatus (lifecycle, t) { 189 var status = {} 190 fs.readFileSync(path.join(pkg, lifecycle + '-git.txt'), 'utf-8') 191 .trim() 192 .split('\n') 193 .forEach(function (line) { 194 line = line.trim() 195 if (line && !line.match(/^\?\? /)) { 196 var parts = line.split(/\s+/) 197 t.equal(parts.length, 2, lifecycle + ' : git status has too many words : ' + line) 198 status[parts[1].trim()] = parts[0].trim() 199 } 200 }) 201 return status 202} 203