diff --git a/lib/datasource/maven.js b/lib/datasource/maven.js index 5cac133bbcf0327dbf651295344fa9b864ec2afb..683143bc8b4ae2643b436b0604bb10355981c232 100644 --- a/lib/datasource/maven.js +++ b/lib/datasource/maven.js @@ -2,20 +2,23 @@ const got = require('got'); const url = require('url'); const fs = require('fs-extra'); const { XmlDocument } = require('xmldoc'); +const is = require('@sindresorhus/is'); module.exports = { getPkgReleases, }; // eslint-disable-next-line no-unused-vars -async function getPkgReleases(purl, config) { +async function getPkgReleases(purl) { const versions = []; const dependency = getDependencyParts(purl); - const repositories = getRepositories(purl); - if (repositories.length < 1) { + if (!is.nonEmptyArray(purl.repositoryUrls)) { logger.error(`No repositories defined for ${dependency.display}`); return null; } + const repositories = purl.repositoryUrls.map(repository => + repository.replace(/\/?$/, '/') + ); logger.debug( `Found ${repositories.length} repositories for ${dependency.display}` ); @@ -56,18 +59,6 @@ function getDependencyParts(purl) { }; } -function getRepositories(purl) { - if (!purl.qualifiers || !purl.qualifiers.repository_url) { - return []; - } - return purl.qualifiers.repository_url.split(',').map(repoUrl => { - if (!repoUrl.endsWith('/')) { - return repoUrl + '/'; - } - return repoUrl; - }); -} - async function downloadMavenMetadata(dependency, repoUrl) { const pkgUrl = new url.URL( `${dependency.dependencyUrl}/maven-metadata.xml`, diff --git a/lib/util/purl.js b/lib/util/purl.js index 10c16376a163d09796fdcaccb50843edf4af761c..2127ef6ace46d9e7a6150bdb036837d52d334e3f 100644 --- a/lib/util/purl.js +++ b/lib/util/purl.js @@ -45,6 +45,10 @@ function parse(input) { res.lookupType = res.qualifiers.lookupType; delete res.qualifiers.lookupType; } + if (res.qualifiers.repository_url) { + res.repositoryUrls = res.qualifiers.repository_url.split(','); + delete res.qualifiers.repository_url; + } } else { res.qualifiers = {}; } diff --git a/test/datasource/maven.spec.js b/test/datasource/maven.spec.js index e6dfb40e9e3ebb84f37f76f58bf16c8532563eb4..18595b70d75b879bfa629e51ad1a026e8936cc84 100644 --- a/test/datasource/maven.spec.js +++ b/test/datasource/maven.spec.js @@ -45,7 +45,7 @@ describe('datasource/maven', () => { expect(releases).toBeNull(); }); - it('should return all versions of a specific library', async () => { + it('should simply return all versions of a specific library', async () => { const releases = await datasource.getPkgReleases({ ...config, purl: @@ -150,7 +150,7 @@ describe('datasource/maven', () => { .get('/maven2/mysql/mysql-connector-java/maven-metadata.xml') .reply(200, invalidMavenMetadata); const releases = await datasource.getPkgReleases({ - config, + ...config, purl: 'pkg:maven/mysql/mysql-connector-java?repository_url=http://central.maven.org/maven2/,http://invalid_metadata_repo/maven2/', }); @@ -159,7 +159,7 @@ describe('datasource/maven', () => { it('should return all versions of a specific library if a repository does not end with /', async () => { const releases = await datasource.getPkgReleases({ - config, + ...config, purl: 'pkg:maven/mysql/mysql-connector-java?repository_url=http://central.maven.org/maven2', }); diff --git a/test/util/__snapshots__/purl.spec.js.snap b/test/util/__snapshots__/purl.spec.js.snap index b6c0af7e7fb5219eb41c5d4d69e3df9a72d26c6b..ceb89d7a6a03bd51cdd613a1886346fc39cd3055 100644 --- a/test/util/__snapshots__/purl.spec.js.snap +++ b/test/util/__snapshots__/purl.spec.js.snap @@ -58,6 +58,17 @@ Object { } `; +exports[`util/purl parse() parses repository_url qualifier 1`] = ` +Object { + "datasource": "maven", + "lookupName": "org.apache.xmlgraphics/batik-anim", + "qualifiers": Object {}, + "repositoryUrls": Array [ + "repo.spring.io/release", + ], +} +`; + exports[`util/purl parse() parses simple npm 1`] = ` Object { "datasource": "npm", diff --git a/test/util/purl.spec.js b/test/util/purl.spec.js index c0b1d13e9407133d4a168ac23096093f2f803129..68d947ab698736a5810698d1a6831f213c71a646 100644 --- a/test/util/purl.spec.js +++ b/test/util/purl.spec.js @@ -29,5 +29,12 @@ describe('util/purl', () => { it('parses github with lookupType', () => { expect(parse('pkg:github/abc/def?lookupType=releases')).toMatchSnapshot(); }); + it('parses repository_url qualifier', () => { + expect( + parse( + 'pkg:maven/org.apache.xmlgraphics/batik-anim@1.9.1?repository_url=repo.spring.io/release' + ) + ).toMatchSnapshot(); + }); }); });