diff --git a/lib/repo.js b/lib/repo.js index 7b415ee234289..ed0253859ccc8 100644 --- a/lib/repo.js +++ b/lib/repo.js @@ -36,7 +36,7 @@ const getRepo = async pkg => { } const info = hostedFromMani(mani) - const url = info ? info.browse() : unknownHostedUrl(rurl) + const url = info ? info.browse(mani.repository.directory) : unknownHostedUrl(rurl) if (!url) { throw Object.assign(new Error('no repository: could not get url'), { diff --git a/test/lib/repo.js b/test/lib/repo.js index a9cddc4eb26f4..fcc95f343890e 100644 --- a/test/lib/repo.js +++ b/test/lib/repo.js @@ -89,6 +89,14 @@ const pacote = { repository: { url: 'git+https://gothib.com/foo/unhostedgithttpsobj' } } + : spec === 'directory' ? { + repository: { + type: 'git', + url: 'git+https://github.com/foo/test-repo-with-directory.git', + directory: 'some/directory' + } + } + : spec === '.' ? { name: 'thispkg', version: '1.2.3', @@ -143,6 +151,7 @@ t.test('open repo urls', t => { unhostedgitsshobj: 'https://gothib.com/foo/unhostedgitsshobj', unhostedgithttpobj: 'http://gothib.com/foo/unhostedgithttpobj', unhostedgithttpsobj: 'https://gothib.com/foo/unhostedgithttpsobj', + directory: 'https://github.com/foo/test-repo-with-directory/tree/master/some/directory', '.': 'https://example.com/thispkg' } const keys = Object.keys(expect) diff --git a/test/tap/repo.js b/test/tap/repo.js index 3e97fdeaed228..75e1017270246 100644 --- a/test/tap/repo.js +++ b/test/tap/repo.js @@ -5,17 +5,16 @@ var test = require('tap').test var rimraf = require('rimraf') var fs = require('fs') var path = require('path') -var fakeBrowser = path.join(common.pkg, '_script.sh') -var outFile = path.join(common.pkg, '_output') -var opts = { cwd: common.pkg } -var mkdirp = require('mkdirp') +var fakeBrowser = path.join(__dirname, '_script.sh') +var outFile = path.join(__dirname, '/_output') + +var opts = { cwd: __dirname } common.pendIfWindows('This is trickier to convert without opening new shells') test('setup', function (t) { - mkdirp.sync(common.pkg) var s = '#!/usr/bin/env bash\n' + - 'echo "$@" > ' + JSON.stringify(common.pkg) + '/_output\n' + 'echo "$@" > ' + JSON.stringify(__dirname) + '/_output\n' fs.writeFileSync(fakeBrowser, s, 'ascii') fs.chmodSync(fakeBrowser, '0755') t.pass('made script') @@ -41,41 +40,6 @@ test('npm repo underscore', function (t) { }) }) -test('npm repo underscore --json', function (t) { - mr({ port: common.port }, function (er, s) { - common.npm([ - 'repo', 'underscore', - '--json', - '--registry=' + common.registry, - '--loglevel=silent', - '--no-browser' - ], opts, function (err, code, stdout, stderr) { - t.ifError(err, 'repo command ran without error') - t.equal(code, 0, 'exit ok') - t.matchSnapshot(stdout, 'should print json result') - s.close() - t.end() - }) - }) -}) - -test('npm repo underscore --no-browser', function (t) { - mr({ port: common.port }, function (er, s) { - common.npm([ - 'repo', 'underscore', - '--no-browser', - '--registry=' + common.registry, - '--loglevel=silent' - ], opts, function (err, code, stdout, stderr) { - t.ifError(err, 'repo command ran without error') - t.equal(code, 0, 'exit ok') - t.matchSnapshot(stdout, 'should print alternative msg') - s.close() - t.end() - }) - }) -}) - test('npm repo optimist - github (https://)', function (t) { mr({ port: common.port }, function (er, s) { common.npm([ @@ -168,6 +132,79 @@ test('npm repo test-repo-url-ssh - non-github (ssh://)', function (t) { }) }) +/* ----- Test by new mock registry: BEGIN ----- */ + +const Tacks = require('tacks') +const mockTar = require('../util/mock-tarball.js') + +const { Dir, File } = Tacks +const testDir = path.join(__dirname, path.basename(__filename, '.js')) + +let server +test('setup mocked registry', t => { + common.fakeRegistry.compat({}, (err, s) => { + t.ifError(err, 'registry mocked successfully') + server = s + t.end() + }) +}) + +test('npm repo test-repo-with-directory', t => { + const fixture = new Tacks(Dir({ + 'package.json': File({}) + })) + fixture.create(testDir) + const packument = { + name: 'test-repo-with-directory', + 'dist-tags': { latest: '1.2.3' }, + versions: { + '1.2.3': { + name: 'test-repo-with-directory', + version: '1.2.3', + dist: { + tarball: `${server.registry}/test-repo-with-directory/-/test-repo-with-directory-1.2.3.tgz` + }, + repository: { + type: 'git', + url: 'git+https://github.com/foo/test-repo-with-directory.git', + directory: 'some/directory' + } + } + } + } + server.get('/test-repo-with-directory').reply(200, packument) + return mockTar({ + 'package.json': JSON.stringify({ + name: 'test-repo-with-directory', + version: '1.2.3' + }) + }).then(tarball => { + server.get('/test-repo-with-directory/-/test-repo-with-directory-1.2.3.tgz').reply(200, tarball) + return common.npm([ + 'repo', 'test-repo-with-directory', + '--registry=' + server.registry, + '--loglevel=silent', + '--browser=' + fakeBrowser + ]) + }).then(([code, stdout, stderr]) => { + t.equal(code, 0) + t.comment(stdout) + t.comment(stderr) + + const res = fs.readFileSync(outFile, 'ascii') + t.equal(res, 'https://github.com/foo/test-repo-with-directory/tree/master/some/directory\n') + rimraf.sync(outFile) + }) +}) + +test('cleanup mocked registry', t => { + server.close() + rimraf.sync(testDir) + t.end() +}) + +/* ----- Test by new mock registry: END ----- */ + test('cleanup', function (t) { fs.unlinkSync(fakeBrowser) t.pass('cleaned up')