diff --git a/__tests__/package-request.js b/__tests__/package-request.js index 814ceede92..7b9afae1e9 100644 --- a/__tests__/package-request.js +++ b/__tests__/package-request.js @@ -32,7 +32,7 @@ async function prepareRequest(pattern: string, version: string, resolved: string return {request, reporter}; } -test('Produce valid remote type for a git private dep', async () => { +test('Produce valid remote type for a git-over-ssh dep', async () => { const {request, reporter} = await prepareRequest( 'private-dep@github:yarnpkg/private-dep#1.0.0', '1.0.0', @@ -45,6 +45,32 @@ test('Produce valid remote type for a git private dep', async () => { await reporter.close(); }); +test('Produce valid remote type for a git-over-https dep', async () => { + const {request, reporter} = await prepareRequest( + 'public-dep@yarnpkg/public-dep#1.0.0', + '1.0.0', + 'git+https://github.com/yarnpkg/public-dep#1fde368', + ); + + expect(request.getLocked('git')._remote.type).toBe('git'); + expect(request.getLocked('tarball')._remote.type).toBe('git'); + + await reporter.close(); +}); + +test('Produce valid remote type for a git public dep', async () => { + const {request, reporter} = await prepareRequest( + 'public-dep@yarnpkg/public-dep#1fde368', + '1.0.0', + 'https://codeload.github.com/yarnpkg/public-dep/tar.gz/1fde368', + ); + + expect(request.getLocked('git')._remote.type).toBe('git'); + expect(request.getLocked('tarball')._remote.type).toBe('tarball'); + + await reporter.close(); +}); + test('Check parentNames flowing in the request', async () => { const {request: parentRequest, reporter: parentReporter} = await prepareRequest( 'parent@1.0.0', @@ -63,16 +89,3 @@ test('Check parentNames flowing in the request', async () => { await parentReporter.close(); await childReporter.close(); }); - -test('Produce valid remote type for a git public dep', async () => { - const {request, reporter} = await prepareRequest( - 'public-dep@yarnpkg/public-dep#1fde368', - '1.0.0', - 'https://codeload.github.com/yarnpkg/public-dep/tar.gz/1fde368', - ); - - expect(request.getLocked('git')._remote.type).toBe('git'); - expect(request.getLocked('tarball')._remote.type).toBe('tarball'); - - await reporter.close(); -}); diff --git a/src/package-request.js b/src/package-request.js index 3f15ba354e..25a1bbd0ac 100644 --- a/src/package-request.js +++ b/src/package-request.js @@ -60,8 +60,9 @@ export default class PackageRequest { if (shrunk && shrunk.resolved) { const resolvedParts = versionUtil.explodeHashedUrl(shrunk.resolved); - // If it's a private git url set remote to 'git'. - const preferredRemoteType = resolvedParts.url.startsWith('git+ssh://') ? 'git' : remoteType; + + // Detect Git protocols (git://HOST/PATH or git+PROTOCOL://HOST/PATH) + const preferredRemoteType = /^git(\+[a-z0-9]+)?:\/\//.test(resolvedParts.url) ? 'git' : remoteType; return { name: shrunk.name,