diff --git a/lib/datasource/go/common.ts b/lib/datasource/go/common.ts index 35cdfb8f4e790efff91e99f5b69c27d722650fed..da37acbf595c56fed05185603a6c7117ea4c8ce2 100644 --- a/lib/datasource/go/common.ts +++ b/lib/datasource/go/common.ts @@ -1,5 +1,11 @@ import { Http } from '../../util/http'; import { BitBucketTagsDatasource } from '../bitbucket-tags'; +import { getSourceUrl as githubSourceUrl } from '../github-releases/common'; +import { id as githubDatasource } from '../github-tags'; +import { id as gitlabDatasource } from '../gitlab-tags'; +import { getSourceUrl as gitlabSourceUrl } from '../gitlab-tags/util'; + +import type { DataSource } from './types'; export const id = 'go'; @@ -11,3 +17,24 @@ export enum GoproxyFallback { WhenNotFoundOrGone = ',', Always = '|', } + +export function getSourceUrl(dataSource?: DataSource): string | undefined { + if (dataSource) { + const { datasource, registryUrl, lookupName } = dataSource; + + if (datasource === githubDatasource) { + return githubSourceUrl(lookupName, registryUrl); + } + + if (datasource === gitlabDatasource) { + return gitlabSourceUrl(lookupName, registryUrl); + } + + if (datasource === bitbucket.id) { + return BitBucketTagsDatasource.getSourceUrl(lookupName, registryUrl); + } + } + + // istanbul ignore next + return undefined; +} diff --git a/lib/datasource/go/releases-direct.ts b/lib/datasource/go/releases-direct.ts index 634cf141426f8b9bae5ce4579795cb15ab9598e8..dbe15b14cd0201dc67a61da812f30446080ce19d 100644 --- a/lib/datasource/go/releases-direct.ts +++ b/lib/datasource/go/releases-direct.ts @@ -3,7 +3,7 @@ import { regEx } from '../../util/regex'; import * as github from '../github-tags'; import * as gitlab from '../gitlab-tags'; import type { GetReleasesConfig, ReleaseResult } from '../types'; -import { bitbucket } from './common'; +import { bitbucket, getSourceUrl } from './common'; import { getDatasource } from './get-datasource'; /** @@ -59,6 +59,8 @@ export async function getReleases( return null; } + const sourceUrl = getSourceUrl(source); + /** * github.com/org/mod/submodule should be tagged as submodule/va.b.c * and that tag should be used instead of just va.b.c, although for compatibility @@ -91,7 +93,7 @@ export async function getReleases( (source.datasource === gitlab.id && submodReleases.length) ) { return { - sourceUrl: res.sourceUrl, + sourceUrl, releases: submodReleases, }; } @@ -103,5 +105,5 @@ export async function getReleases( ); } - return res; + return { ...res, sourceUrl }; } diff --git a/lib/datasource/go/releases-goproxy.spec.ts b/lib/datasource/go/releases-goproxy.spec.ts index 9361be5a0955eda38c270ed1db4550bf6523d38d..4d85ca647bdf9bcbba1bfdef552a2ce15d6c0201 100644 --- a/lib/datasource/go/releases-goproxy.spec.ts +++ b/lib/datasource/go/releases-goproxy.spec.ts @@ -179,10 +179,13 @@ describe('datasource/go/releases-goproxy', () => { const res = await getReleases({ lookupName: 'github.com/google/btree' }); expect(httpMock.getTrace()).toMatchSnapshot(); - expect(res?.releases).toMatchObject([ - { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, - { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, - ]); + expect(res).toEqual({ + releases: [ + { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, + { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, + ], + sourceUrl: 'https://github.com/google/btree', + }); }); it('handles timestamp fetch errors', async () => { @@ -199,10 +202,10 @@ describe('datasource/go/releases-goproxy', () => { const res = await getReleases({ lookupName: 'github.com/google/btree' }); expect(httpMock.getTrace()).toMatchSnapshot(); - expect(res?.releases).toMatchObject([ - { version: 'v1.0.0' }, - { version: 'v1.0.1' }, - ]); + expect(res).toEqual({ + releases: [{ version: 'v1.0.0' }, { version: 'v1.0.1' }], + sourceUrl: 'https://github.com/google/btree', + }); }); it('handles pipe fallback', async () => { @@ -224,10 +227,13 @@ describe('datasource/go/releases-goproxy', () => { const res = await getReleases({ lookupName: 'github.com/google/btree' }); expect(httpMock.getTrace()).toMatchSnapshot(); - expect(res?.releases).toMatchObject([ - { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, - { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, - ]); + expect(res).toEqual({ + releases: [ + { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, + { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, + ], + sourceUrl: 'https://github.com/google/btree', + }); }); it('handles comma fallback', async () => { @@ -258,10 +264,13 @@ describe('datasource/go/releases-goproxy', () => { const res = await getReleases({ lookupName: 'github.com/google/btree' }); expect(httpMock.getTrace()).toMatchSnapshot(); - expect(res?.releases).toMatchObject([ - { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, - { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, - ]); + expect(res).toEqual({ + releases: [ + { releaseTimestamp: '2018-08-13T15:31:12Z', version: 'v1.0.0' }, + { releaseTimestamp: '2019-10-16T16:15:28Z', version: 'v1.0.1' }, + ], + sourceUrl: 'https://github.com/google/btree', + }); }); it('short-circuits for errors other than 404 or 410', async () => { diff --git a/lib/datasource/go/releases-goproxy.ts b/lib/datasource/go/releases-goproxy.ts index d1baae1996a275670297e51f1d693e7477228b88..5acb7a080b5b0aaefc86582b6f2eb0000de1a7cf 100644 --- a/lib/datasource/go/releases-goproxy.ts +++ b/lib/datasource/go/releases-goproxy.ts @@ -5,7 +5,8 @@ import { logger } from '../../logger'; import * as packageCache from '../../util/cache/package'; import { regEx } from '../../util/regex'; import type { GetReleasesConfig, Release, ReleaseResult } from '../types'; -import { GoproxyFallback, http } from './common'; +import { GoproxyFallback, getSourceUrl, http } from './common'; +import { getDatasource } from './get-datasource'; import * as direct from './releases-direct'; import type { GoproxyItem, VersionInfo } from './types'; @@ -202,7 +203,9 @@ export async function getReleases( }); const releases = await pAll(queue, { concurrency: 5 }); if (releases.length) { - result = { releases }; + const datasource = await getDatasource(lookupName); + const sourceUrl = getSourceUrl(datasource); + result = { releases, sourceUrl }; break; } } catch (err) {