diff --git a/lib/modules/datasource/go/releases-goproxy.spec.ts b/lib/modules/datasource/go/releases-goproxy.spec.ts index b7c1138d6428a47806db3e2c5903aac987997959..708c8e39ab41b2c8b597569f5e289f0fe815ca40 100644 --- a/lib/modules/datasource/go/releases-goproxy.spec.ts +++ b/lib/modules/datasource/go/releases-goproxy.spec.ts @@ -343,7 +343,7 @@ describe('modules/datasource/go/releases-goproxy', () => { 200, codeBlock` v1.0.0 2018-08-13T15:31:12Z - v1.0.1 + v1.0.1 \n v1.28.1-20230721020619-4464c06fa399.4 `, ) @@ -360,12 +360,18 @@ describe('modules/datasource/go/releases-goproxy', () => { expect(res).toEqual({ releases: [ - { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, - { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, { - newDigest: '4464c06fa399', - releaseTimestamp: '20230721020619', + version: 'v1.0.0', + releaseTimestamp: '2018-08-13T15:31:12Z', + }, + { + version: 'v1.0.1', + releaseTimestamp: '2019-10-16T16:15:28Z', + }, + { version: 'v1.28.1-20230721020619-4464c06fa399.4', + releaseTimestamp: '2023-07-21T02:06:19Z', + newDigest: '4464c06fa399', }, ], sourceUrl: 'https://github.com/google/btree', diff --git a/lib/modules/datasource/go/releases-goproxy.ts b/lib/modules/datasource/go/releases-goproxy.ts index db6db3d94b27e03ebb52f57396bdda8b2c511241..fc98b95b23a71487c4e66b03f703654c39031ee0 100644 --- a/lib/modules/datasource/go/releases-goproxy.ts +++ b/lib/modules/datasource/go/releases-goproxy.ts @@ -3,6 +3,7 @@ import { DateTime } from 'luxon'; import moo from 'moo'; import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; +import { filterMap } from '../../../util/filter-map'; import { HttpError } from '../../../util/http'; import * as p from '../../../util/promises'; import { newlineRegex, regEx } from '../../../util/regex'; @@ -18,8 +19,11 @@ const parsedGoproxy: Record<string, GoproxyItem[]> = {}; const modRegex = regEx(/^(?<baseMod>.*?)(?:[./]v(?<majorVersion>\d+))?$/); -const pversionRegexp = regEx( - /v\d+\.\d+\.\d+-(?:"\w+\.)?(?:0\.)?(?<releaseTimestamp>\d{14})-(?<digest>[a-f0-9]{12})/, +/** + * @see https://go.dev/ref/mod#pseudo-versions + */ +const pseudoVersionRegex = regEx( + /v\d+\.\d+\.\d+-(?:\w+\.)?(?:0\.)?(?<timestamp>\d{14})-(?<digest>[a-f0-9]{12})/i, ); export class GoProxyDatasource extends Datasource { @@ -211,29 +215,38 @@ export class GoProxyDatasource extends Datasource { async listVersions(baseUrl: string, packageName: string): Promise<Release[]> { const url = `${baseUrl}/${this.encodeCase(packageName)}/@v/list`; const { body } = await this.http.get(url); - return body - .split(newlineRegex) - .filter(is.nonEmptyStringAndNotWhitespace) - .map((str) => { - let version: string | undefined; - let newDigest: string | undefined; - let releaseTimestamp: string | undefined; - [version, releaseTimestamp] = str.split(regEx(/\s+/)); - - if (!DateTime.fromISO(releaseTimestamp).isValid) { - version = str; - releaseTimestamp = undefined; - } - const digestMatch = pversionRegexp.exec(version); + return filterMap(body.split(newlineRegex), (str) => { + if (!is.nonEmptyStringAndNotWhitespace(str)) { + return null; + } + + const [version, releaseTimestamp] = str.trim().split(regEx(/\s+/)); + const release: Release = { version }; + + if (releaseTimestamp) { + release.releaseTimestamp = releaseTimestamp; + } - if (!releaseTimestamp && digestMatch?.groups?.releaseTimestamp) { - releaseTimestamp = digestMatch.groups.releaseTimestamp; + const pseudoVersionMatch = version.match(pseudoVersionRegex)?.groups; + if (pseudoVersionMatch) { + const { digest: newDigest, timestamp } = pseudoVersionMatch; + + if (newDigest) { + release.newDigest = newDigest; } - if (digestMatch?.groups?.digest) { - newDigest = digestMatch.groups.digest; + + const pseudoVersionReleaseTimestamp = DateTime.fromFormat( + timestamp, + 'yyyyMMddHHmmss', + { zone: 'UTC' }, + ).toISO({ suppressMilliseconds: true }); + if (pseudoVersionReleaseTimestamp) { + release.releaseTimestamp = pseudoVersionReleaseTimestamp; } - return { version, newDigest, releaseTimestamp }; - }); + } + + return release; + }); } async versionInfo(