From f5db1cb56a4d737d5d5045849dbb88a1187e65c2 Mon Sep 17 00:00:00 2001 From: Ben Foster <bpfoster@gmail.com> Date: Sun, 10 Oct 2021 03:41:51 -0400 Subject: [PATCH] fix(datasource/maven): look for maven snapshot pom (#11327) --- .../clojure/__snapshots__/index.spec.ts.snap | 452 +++++++++++++++ lib/datasource/clojure/index.spec.ts | 71 +++ .../metadata-snapshot-version-invalid.xml | 12 + .../metadata-snapshot-version.xml | 11 + .../maven/__fixtures__/metadata.xml | 3 + .../maven/__snapshots__/index.spec.ts.snap | 525 ++++++++++++++++++ lib/datasource/maven/index.spec.ts | 79 +++ lib/datasource/maven/index.ts | 106 +++- 8 files changed, 1245 insertions(+), 14 deletions(-) create mode 100644 lib/datasource/maven/__fixtures__/metadata-snapshot-version-invalid.xml create mode 100644 lib/datasource/maven/__fixtures__/metadata-snapshot-version.xml diff --git a/lib/datasource/clojure/__snapshots__/index.spec.ts.snap b/lib/datasource/clojure/__snapshots__/index.spec.ts.snap index 1f8904dcf8..aed87d9332 100644 --- a/lib/datasource/clojure/__snapshots__/index.spec.ts.snap +++ b/lib/datasource/clojure/__snapshots__/index.spec.ts.snap @@ -11,6 +11,24 @@ Array [ "method": "GET", "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -38,6 +56,33 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -47,6 +92,15 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -98,6 +152,10 @@ Object { "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -153,6 +211,24 @@ Array [ "method": "GET", "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -180,6 +256,33 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -189,6 +292,15 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -212,6 +324,24 @@ Array [ "method": "GET", "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -239,6 +369,33 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -248,6 +405,15 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -266,6 +432,24 @@ Array [ "method": "GET", "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -293,6 +477,33 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -302,6 +513,15 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -320,6 +540,10 @@ Array [ "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -338,6 +562,24 @@ Array [ "method": "GET", "url": "http://clojars.org/repo/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "http://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "http://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -365,6 +607,33 @@ Array [ "method": "HEAD", "url": "http://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "http://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "http://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "http://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -374,6 +643,15 @@ Array [ "method": "HEAD", "url": "http://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "http://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -398,6 +676,10 @@ Object { "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -417,6 +699,24 @@ Array [ "method": "GET", "url": "https://custom.registry.renovatebot.com/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -444,6 +744,33 @@ Array [ "method": "HEAD", "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -453,6 +780,15 @@ Array [ "method": "HEAD", "url": "https://custom.registry.renovatebot.com/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -477,6 +813,10 @@ Object { "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -505,6 +845,24 @@ Array [ "method": "GET", "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -532,6 +890,33 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -541,6 +926,15 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -565,6 +959,10 @@ Object { "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -593,6 +991,24 @@ Array [ "method": "GET", "url": "https://clojars.org/repo/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -620,6 +1036,33 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -629,6 +1072,15 @@ Array [ "method": "HEAD", "url": "https://clojars.org/repo/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "clojars.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://clojars.org/repo/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", diff --git a/lib/datasource/clojure/index.spec.ts b/lib/datasource/clojure/index.spec.ts index 15196c461c..642829eb34 100644 --- a/lib/datasource/clojure/index.spec.ts +++ b/lib/datasource/clojure/index.spec.ts @@ -9,6 +9,12 @@ import { ClojureDatasource } from '.'; const baseUrl = 'https://clojars.org/repo'; const baseUrlCustom = 'https://custom.registry.renovatebot.com'; +interface SnapshotOpts { + version: string; + jarStatus?: number; + meta?: string; +} + interface MockOpts { dep?: string; base?: string; @@ -16,6 +22,7 @@ interface MockOpts { pom?: string | null; latest?: string; jars?: Record<string, number> | null; + snapshots?: SnapshotOpts[] | null; } function mockGenericPackage(opts: MockOpts = {}) { @@ -41,6 +48,29 @@ function mockGenericPackage(opts: MockOpts = {}) { '2.0.0': 200, } : opts.jars; + const snapshots = + opts.snapshots === undefined + ? [ + { + version: '1.0.3-SNAPSHOT', + meta: loadFixture( + 'metadata-snapshot-version.xml', + upath.join('..', 'maven') + ), + jarStatus: 200, + }, + { + version: '1.0.4-SNAPSHOT', + meta: loadFixture( + 'metadata-snapshot-version-invalid.xml', + upath.join('..', 'maven') + ), + }, + { + version: '1.0.5-SNAPSHOT', + }, + ] + : opts.snapshots; const scope = httpMock.scope(base); @@ -69,6 +99,45 @@ function mockGenericPackage(opts: MockOpts = {}) { .reply(status, '', { 'Last-Modified': timestamp }); }); } + + if (snapshots) { + snapshots.forEach((snapshot) => { + if (snapshot.meta) { + scope + .get(`/${packagePath}/${snapshot.version}/maven-metadata.xml`) + .reply(200, snapshot.meta); + } else { + scope + .get(`/${packagePath}/${snapshot.version}/maven-metadata.xml`) + .reply(404, ''); + } + + if (snapshot.jarStatus) { + const [major, minor, patch] = snapshot.version + .replace('-SNAPSHOT', '') + .split('.') + .map((x) => parseInt(x, 10)) + .map((x) => (x < 10 ? `0${x}` : `${x}`)); + const timestamp = `2020-01-01T${major}:${minor}:${patch}.000Z`; + scope + .head( + `/${packagePath}/${ + snapshot.version + }/${artifact}-${snapshot.version.replace( + '-SNAPSHOT', + '' + )}-20200101.${major}${minor}${patch}-${parseInt(patch, 10)}.pom` + ) + .reply(snapshot.jarStatus, '', { 'Last-Modified': timestamp }); + } else { + scope + .head( + `/${packagePath}/${snapshot.version}/${artifact}-${snapshot.version}.pom` + ) + .reply(404, ''); + } + }); + } } function get( depName = 'org.example:package', @@ -109,6 +178,7 @@ describe('datasource/clojure/index', () => { meta: loadFixture('metadata-extra.xml', upath.join('..', 'maven')), latest: '3.0.0', jars: { '3.0.0': 200 }, + snapshots: [], }); const { releases } = await get( @@ -119,6 +189,7 @@ describe('datasource/clojure/index', () => { expect(releases).toMatchObject([ { version: '1.0.0' }, + { version: '1.0.3-SNAPSHOT' }, { version: '2.0.0' }, { version: '3.0.0' }, ]); diff --git a/lib/datasource/maven/__fixtures__/metadata-snapshot-version-invalid.xml b/lib/datasource/maven/__fixtures__/metadata-snapshot-version-invalid.xml new file mode 100644 index 0000000000..9a0bb8e924 --- /dev/null +++ b/lib/datasource/maven/__fixtures__/metadata-snapshot-version-invalid.xml @@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="UTF-8"?><metadata> + <groupId>org.example</groupId> + <artifactId>package</artifactId> + <version>1.0.4-SNAPSHOT</version> + <versioning> + <snapshot> + <buildNumber>4</buildNumber> + <!-- Missing timestamp --> + </snapshot> + <lastUpdated>20130301200000</lastUpdated> + </versioning> +</metadata> diff --git a/lib/datasource/maven/__fixtures__/metadata-snapshot-version.xml b/lib/datasource/maven/__fixtures__/metadata-snapshot-version.xml new file mode 100644 index 0000000000..e91402d64e --- /dev/null +++ b/lib/datasource/maven/__fixtures__/metadata-snapshot-version.xml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="UTF-8"?><metadata> + <groupId>org.example</groupId> + <artifactId>package</artifactId> + <version>1.0.3-SNAPSHOT</version> + <versioning> + <snapshot> + <timestamp>20200101.010003</timestamp> + <buildNumber>3</buildNumber> + </snapshot> + </versioning> +</metadata> \ No newline at end of file diff --git a/lib/datasource/maven/__fixtures__/metadata.xml b/lib/datasource/maven/__fixtures__/metadata.xml index a355205eb2..aa8588fb84 100644 --- a/lib/datasource/maven/__fixtures__/metadata.xml +++ b/lib/datasource/maven/__fixtures__/metadata.xml @@ -9,6 +9,9 @@ <version>1.0.0</version> <version>1.0.1</version> <version>1.0.2</version> + <version>1.0.3-SNAPSHOT</version> + <version>1.0.4-SNAPSHOT</version> + <version>1.0.5-SNAPSHOT</version> <version>2.0.0</version> </versions> <lastUpdated>20210101000000</lastUpdated> diff --git a/lib/datasource/maven/__snapshots__/index.spec.ts.snap b/lib/datasource/maven/__snapshots__/index.spec.ts.snap index e3fda6990f..799a466c03 100644 --- a/lib/datasource/maven/__snapshots__/index.spec.ts.snap +++ b/lib/datasource/maven/__snapshots__/index.spec.ts.snap @@ -11,6 +11,24 @@ Array [ "method": "GET", "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -38,6 +56,33 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -47,6 +92,15 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -101,6 +155,10 @@ Object { "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -156,6 +214,24 @@ Array [ "method": "GET", "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -183,6 +259,33 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -192,6 +295,15 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -575,6 +687,24 @@ Array [ "method": "GET", "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -602,6 +732,33 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -611,6 +768,15 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -629,6 +795,24 @@ Array [ "method": "GET", "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -656,6 +840,33 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -665,6 +876,15 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -683,6 +903,10 @@ Array [ "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -701,6 +925,24 @@ Array [ "method": "GET", "url": "http://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -728,6 +970,33 @@ Array [ "method": "HEAD", "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -737,6 +1006,15 @@ Array [ "method": "HEAD", "url": "http://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "http://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -766,6 +1044,15 @@ Object { Object { "version": "1.0.2", }, + Object { + "version": "1.0.3-SNAPSHOT", + }, + Object { + "version": "1.0.4-SNAPSHOT", + }, + Object { + "version": "1.0.5-SNAPSHOT", + }, Object { "version": "2.0.0", }, @@ -842,6 +1129,10 @@ Object { "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -861,6 +1152,24 @@ Array [ "method": "GET", "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -888,6 +1197,33 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -897,6 +1233,15 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -921,6 +1266,10 @@ Object { "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -941,6 +1290,26 @@ Array [ "method": "GET", "url": "https://custom.registry.renovatebot.com/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "authorization": "Bearer 123test", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "authorization": "Bearer 123test", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -971,6 +1340,36 @@ Array [ "method": "HEAD", "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "authorization": "Bearer 123test", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "authorization": "Bearer 123test", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "authorization": "Bearer 123test", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -981,6 +1380,16 @@ Array [ "method": "HEAD", "url": "https://custom.registry.renovatebot.com/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "authorization": "Bearer 123test", + "host": "custom.registry.renovatebot.com", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://custom.registry.renovatebot.com/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -1006,6 +1415,10 @@ Object { "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -1034,6 +1447,24 @@ Array [ "method": "GET", "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -1061,6 +1492,33 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -1070,6 +1528,15 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -1094,6 +1561,10 @@ Object { "releaseTimestamp": "2020-01-01T01:00:00.000Z", "version": "1.0.0", }, + Object { + "releaseTimestamp": "2020-01-01T01:00:03.000Z", + "version": "1.0.3-SNAPSHOT", + }, Object { "releaseTimestamp": "2020-01-01T02:00:00.000Z", "version": "2.0.0", @@ -1122,6 +1593,24 @@ Array [ "method": "GET", "url": "https://repo.maven.apache.org/maven2/org/example/package/maven-metadata.xml", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/maven-metadata.xml", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -1149,6 +1638,33 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.2/package-1.0.2.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.3-SNAPSHOT/package-1.0.3-20200101.010003-3.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.4-SNAPSHOT/package-1.0.4-SNAPSHOT.pom", + }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "GET", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/maven-metadata.xml", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", @@ -1158,6 +1674,15 @@ Array [ "method": "HEAD", "url": "https://repo.maven.apache.org/maven2/org/example/package/2.0.0/package-2.0.0.pom", }, + Object { + "headers": Object { + "accept-encoding": "gzip, deflate, br", + "host": "repo.maven.apache.org", + "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)", + }, + "method": "HEAD", + "url": "https://repo.maven.apache.org/maven2/org/example/package/1.0.5-SNAPSHOT/package-1.0.5-SNAPSHOT.pom", + }, Object { "headers": Object { "accept-encoding": "gzip, deflate, br", diff --git a/lib/datasource/maven/index.spec.ts b/lib/datasource/maven/index.spec.ts index 6a73422dc9..5361a99e62 100644 --- a/lib/datasource/maven/index.spec.ts +++ b/lib/datasource/maven/index.spec.ts @@ -9,6 +9,12 @@ import { id as datasource } from '.'; const baseUrl = 'https://repo.maven.apache.org/maven2'; const baseUrlCustom = 'https://custom.registry.renovatebot.com'; +interface SnapshotOpts { + version: string; + jarStatus?: number; + meta?: string; +} + interface MockOpts { dep?: string; base?: string; @@ -16,6 +22,7 @@ interface MockOpts { pom?: string | null; latest?: string; jars?: Record<string, number> | null; + snapshots?: SnapshotOpts[] | null; } function mockGenericPackage(opts: MockOpts = {}) { @@ -37,6 +44,24 @@ function mockGenericPackage(opts: MockOpts = {}) { } : opts.jars; + const snapshots = + opts.snapshots === undefined + ? [ + { + version: '1.0.3-SNAPSHOT', + meta: loadFixture('metadata-snapshot-version.xml'), + jarStatus: 200, + }, + { + version: '1.0.4-SNAPSHOT', + meta: loadFixture('metadata-snapshot-version-invalid.xml'), + }, + { + version: '1.0.5-SNAPSHOT', + }, + ] + : opts.snapshots; + const scope = httpMock.scope(base); const [group, artifact] = dep.split(':'); @@ -55,6 +80,7 @@ function mockGenericPackage(opts: MockOpts = {}) { if (jars) { Object.entries(jars).forEach(([version, status]) => { const [major, minor, patch] = version + .replace('-SNAPSHOT', '') .split('.') .map((x) => parseInt(x, 10)) .map((x) => (x < 10 ? `0${x}` : `${x}`)); @@ -64,6 +90,45 @@ function mockGenericPackage(opts: MockOpts = {}) { .reply(status, '', { 'Last-Modified': timestamp }); }); } + + if (snapshots) { + snapshots.forEach((snapshot) => { + if (snapshot.meta) { + scope + .get(`/${packagePath}/${snapshot.version}/maven-metadata.xml`) + .reply(200, snapshot.meta); + } else { + scope + .get(`/${packagePath}/${snapshot.version}/maven-metadata.xml`) + .reply(404, ''); + } + + if (snapshot.jarStatus) { + const [major, minor, patch] = snapshot.version + .replace('-SNAPSHOT', '') + .split('.') + .map((x) => parseInt(x, 10)) + .map((x) => (x < 10 ? `0${x}` : `${x}`)); + const timestamp = `2020-01-01T${major}:${minor}:${patch}.000Z`; + scope + .head( + `/${packagePath}/${ + snapshot.version + }/${artifact}-${snapshot.version.replace( + '-SNAPSHOT', + '' + )}-20200101.${major}${minor}${patch}-${parseInt(patch, 10)}.pom` + ) + .reply(snapshot.jarStatus, '', { 'Last-Modified': timestamp }); + } else { + scope + .head( + `/${packagePath}/${snapshot.version}/${artifact}-${snapshot.version}.pom` + ) + .reply(404, ''); + } + }); + } } function get( @@ -126,6 +191,7 @@ describe('datasource/maven/index', () => { meta: loadFixture('metadata-extra.xml'), latest: '3.0.0', jars: { '3.0.0': 200 }, + snapshots: [], }); const { releases } = await get( @@ -136,6 +202,7 @@ describe('datasource/maven/index', () => { expect(releases).toMatchObject([ { version: '1.0.0' }, + { version: '1.0.3-SNAPSHOT' }, { version: '2.0.0' }, { version: '3.0.0' }, ]); @@ -313,6 +380,7 @@ describe('datasource/maven/index', () => { pom: loadFixture('parent-scm-homepage/pom.xml'), latest: '1.0.0', jars: null, + snapshots: [], }; it('should get source and homepage from parent', async () => { @@ -321,6 +389,7 @@ describe('datasource/maven/index', () => { pom: loadFixture('child-no-info/pom.xml'), latest: '2.0.0', jars: { '2.0.0': 200 }, + snapshots: [], }); mockGenericPackage(parentPackage); @@ -339,6 +408,7 @@ describe('datasource/maven/index', () => { pom: loadFixture('child-empty/pom.xml'), latest: '2.0.0', jars: { '2.0.0': 200 }, + snapshots: [], }); const res = await get(); @@ -361,6 +431,7 @@ describe('datasource/maven/index', () => { pom: parentPom, latest: '2.0.0', jars: null, + snapshots: [], }; const childMeta = loadFixture('child-parent-cycle/child.meta.xml'); @@ -371,12 +442,14 @@ describe('datasource/maven/index', () => { pom: childPom, latest: '2.0.0', jars: null, + snapshots: [], }; mockGenericPackage({ ...childPomMock, meta: childMeta, jars: { '2.0.0': 200 }, + snapshots: [], }); mockGenericPackage(parentPomMock); mockGenericPackage(childPomMock); @@ -398,6 +471,7 @@ describe('datasource/maven/index', () => { pom: loadFixture('child-scm/pom.xml'), latest: '2.0.0', jars: { '2.0.0': 200 }, + snapshots: [], }); mockGenericPackage(parentPackage); @@ -416,6 +490,7 @@ describe('datasource/maven/index', () => { pom: loadFixture('child-url/pom.xml'), latest: '2.0.0', jars: { '2.0.0': 200 }, + snapshots: [], }); mockGenericPackage(parentPackage); @@ -434,6 +509,7 @@ describe('datasource/maven/index', () => { pom: loadFixture('child-all-info/pom.xml'), latest: '2.0.0', jars: { '2.0.0': 200 }, + snapshots: [], }); const res = await get(); @@ -451,6 +527,7 @@ describe('datasource/maven/index', () => { pom: loadFixture('child-scm-gitatcolon/pom.xml'), latest: '2.0.0', jars: { '2.0.0': 200 }, + snapshots: [], }); const res = await get(); @@ -467,6 +544,7 @@ describe('datasource/maven/index', () => { pom: loadFixture('child-scm-gitatslash/pom.xml'), latest: '2.0.0', jars: { '2.0.0': 200 }, + snapshots: [], }); const res = await get(); @@ -482,6 +560,7 @@ describe('datasource/maven/index', () => { pom: loadFixture('child-scm-gitprotocol/pom.xml'), latest: '2.0.0', jars: { '2.0.0': 200 }, + snapshots: [], }); const res = await get(); diff --git a/lib/datasource/maven/index.ts b/lib/datasource/maven/index.ts index 20e6aef576..e5399bdd14 100644 --- a/lib/datasource/maven/index.ts +++ b/lib/datasource/maven/index.ts @@ -1,5 +1,4 @@ -import url from 'url'; -import pAll from 'p-all'; +import pMap from 'p-map'; import { XmlDocument } from 'xmldoc'; import { logger } from '../../logger'; import * as packageCache from '../../util/cache/package'; @@ -95,6 +94,81 @@ function isValidArtifactsInfo( return versions.every((v) => info[v] !== undefined); } +function isSnapshotVersion(version: string): boolean { + if (version.endsWith('-SNAPSHOT')) { + return true; + } + return false; +} + +function extractSnapshotVersion(metadata: XmlDocument): string | null { + // Parse the maven-metadata.xml for the snapshot version and determine + // the fixed version of the latest deployed snapshot. + // The metadata descriptor can be found at + // https://maven.apache.org/ref/3.3.3/maven-repository-metadata/repository-metadata.html + // + // Basically, we need to replace -SNAPSHOT with the artifact timestanp & build number, + // so for example 1.0.0-SNAPSHOT will become 1.0.0-<timestamp>-<buildNumber> + const version = metadata + .descendantWithPath('version') + ?.val?.replace('-SNAPSHOT', ''); + + const snapshot = metadata.descendantWithPath('versioning.snapshot'); + const timestamp = snapshot?.childNamed('timestamp')?.val; + const build = snapshot?.childNamed('buildNumber')?.val; + + // If we weren't able to parse out the required 3 version elements, + // return null because we can't determine the fixed version of the latest snapshot. + if (!version || !timestamp || !build) { + return null; + } + return `${version}-${timestamp}-${build}`; +} + +async function getSnapshotFullVersion( + version: string, + dependency: MavenDependency, + repoUrl: string +): Promise<string | null> { + // To determine what actual files are available for the snapshot, first we have to fetch and parse + // the metadata located at http://<repo>/<group>/<artifact>/<version-SNAPSHOT>/maven-metadata.xml + const metadataUrl = getMavenUrl( + dependency, + repoUrl, + `${version}/maven-metadata.xml` + ); + + const { xml: mavenMetadata } = await downloadMavenXml(metadataUrl); + if (!mavenMetadata) { + return null; + } + + return extractSnapshotVersion(mavenMetadata); +} + +async function createUrlForDependencyPom( + version: string, + dependency: MavenDependency, + repoUrl: string +): Promise<string> { + if (isSnapshotVersion(version)) { + // By default, Maven snapshots are deployed to the repository with fixed file names. + // Resolve the full, actual pom file name for the version. + const fullVersion = await getSnapshotFullVersion( + version, + dependency, + repoUrl + ); + + // If we were able to resolve the version, use that, otherwise fall back to using -SNAPSHOT + if (fullVersion !== null) { + return `${version}/${dependency.name}-${fullVersion}.pom`; + } + } + + return `${version}/${dependency.name}-${version}.pom`; +} + async function filterMissingArtifacts( dependency: MavenDependency, repoUrl: string, @@ -105,23 +179,26 @@ async function filterMissingArtifacts( let artifactsInfo: ArtifactsInfo | null = await packageCache.get<ArtifactsInfo>(cacheNamespace, cacheKey); + // If the cache contains any artifacts that we were previously unable to determine if they exist, + // retry the existence checks on them. if (!isValidArtifactsInfo(artifactsInfo, versions)) { - const queue = versions - .map((version): [string, url.URL | null] => { + // For each version, determine if there is a POM file available for it + const results: ArtifactInfoResult[] = await pMap( + versions, + async (version): Promise<ArtifactInfoResult | null> => { + // Create the URL that the POM file should be available at const artifactUrl = getMavenUrl( dependency, repoUrl, - `${version}/${dependency.name}-${version}.pom` + await createUrlForDependencyPom(version, dependency, repoUrl) ); - return [version, artifactUrl]; - }) - .filter(([_, artifactUrl]) => Boolean(artifactUrl)) - .map( - ([version, artifactUrl]) => - async (): Promise<ArtifactInfoResult> => - [version, await isHttpResourceExists(artifactUrl)] - ); - const results = await pAll(queue, { concurrency: 5 }); + + // Return an ArtifactInfoResult that maps the version to the result of the check if the POM file exists in the repo + return [version, await isHttpResourceExists(artifactUrl)]; + }, + { concurrency: 5 } + ); + artifactsInfo = results.reduce( (acc, [key, value]) => ({ ...acc, @@ -138,6 +215,7 @@ async function filterMissingArtifacts( await packageCache.set(cacheNamespace, cacheKey, artifactsInfo, cacheTTL); } + // Create releases for every version that exists in the repository return versions .filter((v) => artifactsInfo[v]) .map((version) => { -- GitLab