From ffa1d0401d49089350259b52cd7d5a19d0939c85 Mon Sep 17 00:00:00 2001 From: Manuel Blechschmidt Date: Tue, 2 Jan 2024 14:55:17 +0000 Subject: [PATCH 1/9] fix(gitlab): Fixes splitting of go package name if path in url is used e.g. https://example.com/gitlab --- lib/modules/datasource/go/base.spec.ts | 27 ++++++++++++++++++++++++++ lib/modules/datasource/go/base.ts | 25 +++++++++++++++++++++--- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/lib/modules/datasource/go/base.spec.ts b/lib/modules/datasource/go/base.spec.ts index 4ef0db7ab6a83f..b90c2feacb873b 100644 --- a/lib/modules/datasource/go/base.spec.ts +++ b/lib/modules/datasource/go/base.spec.ts @@ -2,6 +2,7 @@ import { mockDeep } from 'jest-mock-extended'; import { Fixtures } from '../../../../test/fixtures'; import * as httpMock from '../../../../test/http-mock'; import { mocked } from '../../../../test/util'; +import { GlobalConfig } from '../../../config/global'; import * as _hostRules from '../../../util/host-rules'; import { GitTagsDatasource } from '../git-tags'; import { GithubTagsDatasource } from '../github-tags'; @@ -394,6 +395,32 @@ describe('modules/datasource/go/base', () => { expect(res).toBeNull(); }); + + it('it correctly splits a URL where the endpoint is contained', async () => { + hostRules.hostType.mockReturnValue('gitlab'); + + GlobalConfig.set({ endpoint: 'https://example.com/gitlab/api/v4/' }); + + const meta = + ''; + httpMock + .scope('https://example.com') + .get('/gitlab/my-project/my-repo.git?go-get=1') + .reply(200, meta); + + const res = await BaseGoDatasource.getDatasource( + 'example.com/gitlab/my-project/my-repo.git', + ); + + GlobalConfig.reset(); + hostRules.hostType.mockReturnValue(''); + + expect(res).toEqual({ + datasource: GitlabTagsDatasource.id, + packageName: 'my-project/my-repo', + registryUrl: 'https://example.com/gitlab/', + }); + }); }); }); }); diff --git a/lib/modules/datasource/go/base.ts b/lib/modules/datasource/go/base.ts index 876f8745eb7c3b..f45b530f06b143 100644 --- a/lib/modules/datasource/go/base.ts +++ b/lib/modules/datasource/go/base.ts @@ -1,5 +1,6 @@ // TODO: types (#22198) import URL from 'node:url'; +import { GlobalConfig } from '../../../config/global'; import { logger } from '../../../logger'; import { detectPlatform } from '../../../util/common'; import * as hostRules from '../../../util/host-rules'; @@ -154,17 +155,35 @@ export class BaseGoDatasource { const parsedUrl = URL.parse(goSourceUrl); // TODO: `parsedUrl.pathname` can be undefined - const packageName = trimLeadingSlash(`${parsedUrl.pathname}`); + let packageName = trimLeadingSlash(`${parsedUrl.pathname}`); - const registryUrl = `${parsedUrl.protocol}//${parsedUrl.host}`; + const endpoint = GlobalConfig.get('endpoint'); + + const endpointPrefix = endpoint?.match('https://[^/]*/(.*)api/v4/?'); + + if (endpointPrefix) { + packageName = packageName.replace(endpointPrefix[1], ''); + } + + const registryUrl = + endpoint?.replaceAll('api/v4/', '') ?? + `${parsedUrl.protocol}//${parsedUrl.host}`; // a .git path indicates a concrete git repository, which can be different from metadata returned by gitlab const vcsIndicatedModule = BaseGoDatasource.gitVcsRegexp.exec(goModule); if (vcsIndicatedModule?.groups?.module) { + if (endpointPrefix) { + packageName = vcsIndicatedModule.groups?.module.replace( + endpointPrefix[1], + '', + ); + } else { + packageName = vcsIndicatedModule.groups?.module; + } return { datasource: GitlabTagsDatasource.id, registryUrl, - packageName: vcsIndicatedModule.groups?.module, + packageName, }; } From ab18cfbda6cba8421f5cefabfbfc468a4a2c4c62 Mon Sep 17 00:00:00 2001 From: Manuel Blechschmidt Date: Thu, 4 Jan 2024 13:52:33 +0000 Subject: [PATCH 2/9] Made api/v4/ optional --- lib/modules/datasource/go/base.spec.ts | 22 ++++++++++++++++++++-- lib/modules/datasource/go/base.ts | 2 +- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/lib/modules/datasource/go/base.spec.ts b/lib/modules/datasource/go/base.spec.ts index b90c2feacb873b..b191d9d4ca245f 100644 --- a/lib/modules/datasource/go/base.spec.ts +++ b/lib/modules/datasource/go/base.spec.ts @@ -412,14 +412,32 @@ describe('modules/datasource/go/base', () => { 'example.com/gitlab/my-project/my-repo.git', ); - GlobalConfig.reset(); - hostRules.hostType.mockReturnValue(''); expect(res).toEqual({ datasource: GitlabTagsDatasource.id, packageName: 'my-project/my-repo', registryUrl: 'https://example.com/gitlab/', }); + + GlobalConfig.set({ endpoint: 'https://example.com/gitlab/' }); + + httpMock + .scope('https://example.com') + .get('/gitlab/my-project/my-repo.git?go-get=1') + .reply(200, meta); + + const res2 = await BaseGoDatasource.getDatasource( + 'example.com/gitlab/my-project/my-repo.git', + ); + + expect(res2).toEqual({ + datasource: GitlabTagsDatasource.id, + packageName: 'my-project/my-repo', + registryUrl: 'https://example.com/gitlab/', + }); + + GlobalConfig.reset(); + hostRules.hostType.mockReturnValue(''); }); }); }); diff --git a/lib/modules/datasource/go/base.ts b/lib/modules/datasource/go/base.ts index f45b530f06b143..052f65474b34c3 100644 --- a/lib/modules/datasource/go/base.ts +++ b/lib/modules/datasource/go/base.ts @@ -159,7 +159,7 @@ export class BaseGoDatasource { const endpoint = GlobalConfig.get('endpoint'); - const endpointPrefix = endpoint?.match('https://[^/]*/(.*)api/v4/?'); + const endpointPrefix = endpoint?.match('https://[^/]*/(.*?/)(api/v4/?)?'); if (endpointPrefix) { packageName = packageName.replace(endpointPrefix[1], ''); From 9a83357bbe4a5d615c71e3244fe6b7241023b65d Mon Sep 17 00:00:00 2001 From: Manuel Blechschmidt Date: Fri, 5 Jan 2024 11:51:24 +0100 Subject: [PATCH 3/9] Update lib/modules/datasource/go/base.ts Co-authored-by: Michael Kriese --- lib/modules/datasource/go/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules/datasource/go/base.ts b/lib/modules/datasource/go/base.ts index 052f65474b34c3..76dce7b4d098d0 100644 --- a/lib/modules/datasource/go/base.ts +++ b/lib/modules/datasource/go/base.ts @@ -157,7 +157,7 @@ export class BaseGoDatasource { // TODO: `parsedUrl.pathname` can be undefined let packageName = trimLeadingSlash(`${parsedUrl.pathname}`); - const endpoint = GlobalConfig.get('endpoint'); + const endpoint = GlobalConfig.get('endpoint')!; const endpointPrefix = endpoint?.match('https://[^/]*/(.*?/)(api/v4/?)?'); From d2044b225aa9c9e690147a58b72573788e773343 Mon Sep 17 00:00:00 2001 From: Manuel Blechschmidt Date: Fri, 5 Jan 2024 11:51:30 +0100 Subject: [PATCH 4/9] Update lib/modules/datasource/go/base.ts Co-authored-by: Michael Kriese --- lib/modules/datasource/go/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules/datasource/go/base.ts b/lib/modules/datasource/go/base.ts index 76dce7b4d098d0..0cc654e7f299a4 100644 --- a/lib/modules/datasource/go/base.ts +++ b/lib/modules/datasource/go/base.ts @@ -159,7 +159,7 @@ export class BaseGoDatasource { const endpoint = GlobalConfig.get('endpoint')!; - const endpointPrefix = endpoint?.match('https://[^/]*/(.*?/)(api/v4/?)?'); + const endpointPrefix = regEx('https://[^/]*/(.*?/)(api/v4/?)?'),exec(endpoint); if (endpointPrefix) { packageName = packageName.replace(endpointPrefix[1], ''); From 59dc3cbd8effec7f3a5270ca1c948ba43cffa81f Mon Sep 17 00:00:00 2001 From: Manuel Blechschmidt Date: Fri, 5 Jan 2024 11:51:37 +0100 Subject: [PATCH 5/9] Update lib/modules/datasource/go/base.ts Co-authored-by: Michael Kriese --- lib/modules/datasource/go/base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules/datasource/go/base.ts b/lib/modules/datasource/go/base.ts index 0cc654e7f299a4..fd7f8324f628c5 100644 --- a/lib/modules/datasource/go/base.ts +++ b/lib/modules/datasource/go/base.ts @@ -166,7 +166,7 @@ export class BaseGoDatasource { } const registryUrl = - endpoint?.replaceAll('api/v4/', '') ?? + endpoint?.replace(regEx('api/v4/?$'), '') ?? `${parsedUrl.protocol}//${parsedUrl.host}`; // a .git path indicates a concrete git repository, which can be different from metadata returned by gitlab From 987d6b3a449f199bff9f84736a3a00f719c83377 Mon Sep 17 00:00:00 2001 From: Manuel Blechschmidt Date: Fri, 5 Jan 2024 10:57:05 +0000 Subject: [PATCH 6/9] Fixed parse error --- lib/modules/datasource/go/base.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/modules/datasource/go/base.ts b/lib/modules/datasource/go/base.ts index fd7f8324f628c5..63fb03e5a4353c 100644 --- a/lib/modules/datasource/go/base.ts +++ b/lib/modules/datasource/go/base.ts @@ -159,7 +159,9 @@ export class BaseGoDatasource { const endpoint = GlobalConfig.get('endpoint')!; - const endpointPrefix = regEx('https://[^/]*/(.*?/)(api/v4/?)?'),exec(endpoint); + const endpointPrefix = regEx('https://[^/]*/(.*?/)(api/v4/?)?').exec( + endpoint, + ); if (endpointPrefix) { packageName = packageName.replace(endpointPrefix[1], ''); From 4e74d7aa9d8528e4c435ae933618cced89bcccbe Mon Sep 17 00:00:00 2001 From: Manuel Blechschmidt Date: Fri, 5 Jan 2024 12:29:47 +0000 Subject: [PATCH 7/9] Fixed prettier error --- lib/modules/datasource/go/base.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/modules/datasource/go/base.spec.ts b/lib/modules/datasource/go/base.spec.ts index b191d9d4ca245f..e306ad6d17e316 100644 --- a/lib/modules/datasource/go/base.spec.ts +++ b/lib/modules/datasource/go/base.spec.ts @@ -412,7 +412,6 @@ describe('modules/datasource/go/base', () => { 'example.com/gitlab/my-project/my-repo.git', ); - expect(res).toEqual({ datasource: GitlabTagsDatasource.id, packageName: 'my-project/my-repo', From 6a8457a8e943b6c67bd1ee2253a76ed448fdd23b Mon Sep 17 00:00:00 2001 From: Manuel Blechschmidt Date: Tue, 9 Jan 2024 19:18:41 +0000 Subject: [PATCH 8/9] Added review comments from viceice --- lib/modules/datasource/go/base.spec.ts | 5 ++--- lib/modules/datasource/go/base.ts | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/lib/modules/datasource/go/base.spec.ts b/lib/modules/datasource/go/base.spec.ts index e306ad6d17e316..8b3d5ec42fd9ae 100644 --- a/lib/modules/datasource/go/base.spec.ts +++ b/lib/modules/datasource/go/base.spec.ts @@ -1,4 +1,5 @@ import { mockDeep } from 'jest-mock-extended'; +import { ConfigSet } from 'ts-jest'; import { Fixtures } from '../../../../test/fixtures'; import * as httpMock from '../../../../test/http-mock'; import { mocked } from '../../../../test/util'; @@ -35,6 +36,7 @@ describe('modules/datasource/go/base', () => { beforeEach(() => { hostRules.find.mockReturnValue({}); hostRules.hosts.mockReturnValue([]); + GlobalConfig.reset(); }); describe('meta name=go-source', () => { @@ -434,9 +436,6 @@ describe('modules/datasource/go/base', () => { packageName: 'my-project/my-repo', registryUrl: 'https://example.com/gitlab/', }); - - GlobalConfig.reset(); - hostRules.hostType.mockReturnValue(''); }); }); }); diff --git a/lib/modules/datasource/go/base.ts b/lib/modules/datasource/go/base.ts index 63fb03e5a4353c..f109920d3d1a3b 100644 --- a/lib/modules/datasource/go/base.ts +++ b/lib/modules/datasource/go/base.ts @@ -167,9 +167,9 @@ export class BaseGoDatasource { packageName = packageName.replace(endpointPrefix[1], ''); } - const registryUrl = - endpoint?.replace(regEx('api/v4/?$'), '') ?? - `${parsedUrl.protocol}//${parsedUrl.host}`; + const registryUrl = endpointPrefix + ? endpoint.replace(regEx('api/v4/?$'), '') + : `${parsedUrl.protocol}//${parsedUrl.host}`; // a .git path indicates a concrete git repository, which can be different from metadata returned by gitlab const vcsIndicatedModule = BaseGoDatasource.gitVcsRegexp.exec(goModule); From 0d11a38a32b2f223a4f47c9e7f3da3749230a5cb Mon Sep 17 00:00:00 2001 From: Manuel Blechschmidt Date: Wed, 10 Jan 2024 08:33:33 +0000 Subject: [PATCH 9/9] Fixed eslint error --- lib/modules/datasource/go/base.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/modules/datasource/go/base.spec.ts b/lib/modules/datasource/go/base.spec.ts index 8b3d5ec42fd9ae..7bfbe623ae5589 100644 --- a/lib/modules/datasource/go/base.spec.ts +++ b/lib/modules/datasource/go/base.spec.ts @@ -1,5 +1,4 @@ import { mockDeep } from 'jest-mock-extended'; -import { ConfigSet } from 'ts-jest'; import { Fixtures } from '../../../../test/fixtures'; import * as httpMock from '../../../../test/http-mock'; import { mocked } from '../../../../test/util';