diff --git a/lib/modules/datasource/maven/__fixtures__/metadata-snapshot-only.xml b/lib/modules/datasource/maven/__fixtures__/metadata-snapshot-only.xml new file mode 100644 index 0000000000000000000000000000000000000000..28dd5e42726d146ef2dcd702e09f5e44c7316edf --- /dev/null +++ b/lib/modules/datasource/maven/__fixtures__/metadata-snapshot-only.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<metadata> + <groupId>org.example</groupId> + <artifactId>package</artifactId> + <versioning> + <latest>1.0.3-SNAPSHOT</latest> + <release>1.0.3-SNAPSHOT</release> + <versions> + <version>1.0.3-SNAPSHOT</version> + </versions> + <lastUpdated>20210101000000</lastUpdated> + </versioning> +</metadata> diff --git a/lib/modules/datasource/maven/index.spec.ts b/lib/modules/datasource/maven/index.spec.ts index 578420cee3b818956064bc31993b588aaab8b63b..a20255759fb33fd3724d4863a26b4e6223d08196 100644 --- a/lib/modules/datasource/maven/index.spec.ts +++ b/lib/modules/datasource/maven/index.spec.ts @@ -83,9 +83,25 @@ function mockGenericPackage(opts: MockOpts = {}) { } if (pom) { - scope - .get(`/${packagePath}/${latest}/${artifact}-${latest}.pom`) - .reply(200, pom); + if (latest.endsWith('-SNAPSHOT')) { + const [major, minor, patch] = latest + .replace('-SNAPSHOT', '') + .split('.') + .map((x) => parseInt(x, 10)) + .map((x) => (x < 10 ? `0${x}` : `${x}`)); + scope + .get( + `/${packagePath}/${latest}/${artifact}-${latest.replace( + '-SNAPSHOT', + '' + )}-20200101.${major}${minor}${patch}-${parseInt(patch, 10)}.pom` + ) + .reply(200, pom); + } else { + scope + .get(`/${packagePath}/${latest}/${artifact}-${latest}.pom`) + .reply(200, pom); + } } if (jars) { @@ -189,6 +205,43 @@ describe('modules/datasource/maven/index', () => { expect(res).toMatchSnapshot(); }); + it('returns releases when only snapshot', async () => { + const meta = loadFixture('metadata-snapshot-version.xml'); + mockGenericPackage({ + meta: loadFixture('metadata-snapshot-only.xml'), + jars: null, + html: null, + latest: '1.0.3-SNAPSHOT', + snapshots: [ + { + version: '1.0.3-SNAPSHOT', + meta: meta, + jarStatus: 200, + }, + ], + }); + httpMock + .scope(baseUrl) + .get('/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml') + .reply(200, meta); + + const res = await get(); + + expect(res).toEqual({ + display: 'org.example:package', + group: 'org.example', + homepage: 'https://package.example.org/about', + name: 'package', + registryUrl: 'https://repo.maven.apache.org/maven2', + releases: [ + { + releaseTimestamp: '2020-01-01T01:00:03.000Z', + version: '1.0.3-SNAPSHOT', + }, + ], + }); + }); + it('returns html-based releases', async () => { process.env.RENOVATE_EXPERIMENTAL_NO_MAVEN_POM_CHECK = 'true'; diff --git a/lib/modules/datasource/maven/util.ts b/lib/modules/datasource/maven/util.ts index 2674ea095533c98286ccf0e2b71f8dd7ef261ae8..1a06e0436ca6d68f3f241eb3f9be51da0fc89ce9 100644 --- a/lib/modules/datasource/maven/util.ts +++ b/lib/modules/datasource/maven/util.ts @@ -384,7 +384,12 @@ export async function getDependencyInfo( recursionLimit = 5 ): Promise<Partial<ReleaseResult>> { const result: Partial<ReleaseResult> = {}; - const path = `${version}/${dependency.name}-${version}.pom`; + const path = await createUrlForDependencyPom( + http, + version, + dependency, + repoUrl + ); const pomUrl = getMavenUrl(dependency, repoUrl, path); const { xml: pomContent } = await downloadMavenXml(http, pomUrl);