• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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