1var fs = require('fs') 2var resolve = require('path').resolve 3 4var mkdirp = require('mkdirp') 5var test = require('tap').test 6 7var npm = require('../../lib/npm.js') 8var common = require('../common-tap.js') 9 10var pkg = resolve(common.pkg, 'package') 11var repo = resolve(common.pkg, 'repo') 12 13var daemon 14var daemonPID 15var git 16 17var pjParent = JSON.stringify({ 18 name: 'parent', 19 version: '1.2.3', 20 dependencies: { 21 'child': 'git://localhost:' + common.gitPort + '/child.git#master' 22 } 23}, null, 2) + '\n' 24 25var pjChild = JSON.stringify({ 26 name: 'child', 27 version: '1.0.3' 28}, null, 2) + '\n' 29 30test('setup', function (t) { 31 mkdirp.sync(pkg) 32 fs.writeFileSync(resolve(pkg, 'package.json'), pjParent) 33 setup(function (er, r) { 34 t.ifError(er, 'git started up successfully') 35 36 if (!er) { 37 daemon = r[r.length - 2] 38 daemonPID = r[r.length - 1] 39 } 40 41 t.end() 42 }) 43}) 44 45test('install from repo', function (t) { 46 process.chdir(pkg) 47 common.npm(['install'], {cwd: pkg, stdio: [0, 1, 2]}, function (er, code) { 48 if (er) throw er 49 t.is(code, 0, 'npm installed via git') 50 51 t.end() 52 }) 53}) 54 55test('shrinkwrap gets correct _from and _resolved (#7121)', function (t) { 56 common.npm( 57 [ 58 'shrinkwrap', 59 '--loglevel', 'error' 60 ], 61 { cwd: pkg, stdio: [0, 'pipe', 2] }, 62 function (er, code, stdout) { 63 if (er) throw er 64 t.is(code, 0, '`npm shrinkwrap` exited ok') 65 66 var shrinkwrap = require(resolve(pkg, 'npm-shrinkwrap.json')) 67 git.whichAndExec( 68 ['rev-list', '-n1', 'master'], 69 { cwd: repo, env: process.env }, 70 function (er, stdout, stderr) { 71 t.ifErr(er, 'git rev-list ran without error') 72 t.notOk(stderr, 'no error output') 73 var treeish = stdout.trim() 74 75 t.like(shrinkwrap, {dependencies: {child: {version: 'git://localhost:' + common.gitPort + '/child.git#' + treeish}}}, 76 'npm shrinkwrapped resolved correctly' 77 ) 78 79 t.end() 80 } 81 ) 82 } 83 ) 84}) 85 86test('clean', function (t) { 87 daemon.on('close', t.end) 88 process.kill(daemonPID) 89}) 90 91function setup (cb) { 92 mkdirp.sync(repo) 93 fs.writeFileSync(resolve(repo, 'package.json'), pjChild) 94 npm.load({ prefix: pkg, registry: common.registry, loglevel: 'silent' }, function () { 95 git = require('../../lib/utils/git.js') 96 97 function startDaemon (cb) { 98 // start git server 99 var d = git.spawn( 100 [ 101 'daemon', 102 '--verbose', 103 '--listen=localhost', 104 '--export-all', 105 '--base-path=.', 106 '--reuseaddr', 107 '--port=' + common.gitPort 108 ], 109 { 110 cwd: pkg, 111 env: process.env, 112 stdio: ['pipe', 'pipe', 'pipe'] 113 } 114 ) 115 d.stderr.on('data', childFinder) 116 117 function childFinder (c) { 118 var cpid = c.toString().match(/^\[(\d+)\]/) 119 if (cpid[1]) { 120 this.removeListener('data', childFinder) 121 cb(null, [d, cpid[1]]) 122 } 123 } 124 } 125 126 common.makeGitRepo({ 127 path: repo, 128 commands: [ 129 git.chainableExec( 130 ['clone', '--bare', repo, 'child.git'], 131 { cwd: pkg, env: process.env } 132 ), 133 startDaemon 134 ] 135 }, cb) 136 }) 137} 138