diff --git a/lib/modules/datasource/go/__fixtures__/go-kit.list.txt b/lib/modules/datasource/go/__fixtures__/go-kit.list.txt index 0a6a741aa3fac61e0628d173290dd1cfc638b0b9..1603f3f25f0bc4cbfcccb7e328a56f01848440e7 100644 --- a/lib/modules/datasource/go/__fixtures__/go-kit.list.txt +++ b/lib/modules/datasource/go/__fixtures__/go-kit.list.txt @@ -1,4 +1,4 @@ -v0.7.0 +v0.7.0 2345-01-01T12:34:56Z v0.3.0 v0.8.0 v0.6.0 @@ -7,4 +7,4 @@ v0.5.0 v0.9.0 v0.4.0 v0.1.0 -v0.2.0 +v0.2.0 foobar diff --git a/lib/modules/datasource/go/releases-goproxy.spec.ts b/lib/modules/datasource/go/releases-goproxy.spec.ts index 05b732865847651e3ffbd292a973dd37d86507f7..e2007264916a7ebdbac15672da1e4ce7901947d2 100644 --- a/lib/modules/datasource/go/releases-goproxy.spec.ts +++ b/lib/modules/datasource/go/releases-goproxy.spec.ts @@ -316,9 +316,10 @@ describe('modules/datasource/go/releases-goproxy', () => { httpMock .scope(`${baseUrl}/github.com/google/btree`) .get('/@v/list') - .reply(200, 'v1.0.0\nv1.0.1\n') - .get('/@v/v1.0.0.info') - .reply(200, { Version: 'v1.0.0', Time: '2018-08-13T15:31:12Z' }) + .reply( + 200, + ['v1.0.0 2018-08-13T15:31:12Z', 'v1.0.1', ' \n'].join('\n') + ) .get('/@v/v1.0.1.info') .reply(200, { Version: 'v1.0.1', Time: '2019-10-16T16:15:28Z' }); diff --git a/lib/modules/datasource/go/releases-goproxy.ts b/lib/modules/datasource/go/releases-goproxy.ts index 89bcbe95d04fd99d27f29fa96a8b85c3988ab343..405bcb801aabf0785ccb7849a4670cc1ef2aa4cb 100644 --- a/lib/modules/datasource/go/releases-goproxy.ts +++ b/lib/modules/datasource/go/releases-goproxy.ts @@ -1,9 +1,10 @@ import is from '@sindresorhus/is'; +import { DateTime } from 'luxon'; import moo from 'moo'; import { logger } from '../../../logger'; import { cache } from '../../../util/cache/package/decorator'; import * as p from '../../../util/promises'; -import { regEx } from '../../../util/regex'; +import { newlineRegex, regEx } from '../../../util/regex'; import { Datasource } from '../datasource'; import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; import { BaseGoDatasource } from './base'; @@ -51,8 +52,14 @@ export class GoProxyDatasource extends Datasource { break; } - const versions = await this.listVersions(url, packageName); - const queue = versions.map((version) => async (): Promise<Release> => { + const releasesIndex = await this.listVersions(url, packageName); + const releases = await p.map(releasesIndex, async (versionInfo) => { + const { version, releaseTimestamp } = versionInfo; + + if (releaseTimestamp) { + return { version, releaseTimestamp }; + } + try { return await this.versionInfo(url, packageName, version); } catch (err) { @@ -60,7 +67,6 @@ export class GoProxyDatasource extends Datasource { return { version }; } }); - const releases = await p.all(queue); if (releases.length) { const datasource = await BaseGoDatasource.getDatasource(packageName); const sourceUrl = getSourceUrl(datasource); @@ -198,13 +204,18 @@ export class GoProxyDatasource extends Datasource { return input.replace(regEx(/([A-Z])/g), (x) => `!${x.toLowerCase()}`); } - async listVersions(baseUrl: string, packageName: string): Promise<string[]> { + 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(regEx(/\s+/)) - .filter(Boolean) - .filter((x) => x.indexOf('+') === -1); + .split(newlineRegex) + .filter(is.nonEmptyStringAndNotWhitespace) + .map((str) => { + const [version, releaseTimestamp] = str.split(regEx(/\s+/)); + return DateTime.fromISO(releaseTimestamp).isValid + ? { version, releaseTimestamp } + : { version }; + }); } async versionInfo(