From a6580a6925e99d4dff497ea22308016b5ea403bb Mon Sep 17 00:00:00 2001
From: Michael Kriese <michael.kriese@visualon.de>
Date: Mon, 9 Oct 2023 12:21:18 +0200
Subject: [PATCH] fix(changelogs): wrong release url (#25097)

---
 .../update/pr/changelog/gitea/index.spec.ts   |  2 +-
 .../update/pr/changelog/gitea/index.ts        |  2 +-
 .../update/pr/changelog/github/index.ts       |  2 +-
 .../update/pr/changelog/gitlab/index.ts       | 17 ++++---------
 .../update/pr/changelog/release-notes.spec.ts | 24 ++++++++++++++-----
 .../update/pr/changelog/release-notes.ts      |  8 +++----
 .../repository/update/pr/changelog/types.ts   |  2 +-
 .../repository/update/pr/index.spec.ts        |  1 +
 8 files changed, 32 insertions(+), 26 deletions(-)

diff --git a/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts b/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts
index f1c09d2d5d..a9316d67d9 100644
--- a/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts
+++ b/lib/workers/repository/update/pr/changelog/gitea/index.spec.ts
@@ -208,7 +208,7 @@ describe('workers/repository/update/pr/changelog/gitea/index', () => {
               notesSourceUrl:
                 'https://gitea.com/api/v1/repos/meno/dropzone/releases',
               tag: 'v5.6.1',
-              url: 'https://gitea.com/api/v1/repos/meno/dropzone/releases/tag/v5.6.1',
+              url: 'https://gitea.com/meno/dropzone/releases/tag/v5.6.1',
             },
           },
           { version: '5.6.0' },
diff --git a/lib/workers/repository/update/pr/changelog/gitea/index.ts b/lib/workers/repository/update/pr/changelog/gitea/index.ts
index 8f354fe6f1..fe99e2dfc0 100644
--- a/lib/workers/repository/update/pr/changelog/gitea/index.ts
+++ b/lib/workers/repository/update/pr/changelog/gitea/index.ts
@@ -83,7 +83,7 @@ export async function getReleaseList(
     ReleasesSchema
   );
   return res.body.map((release) => ({
-    url: `${apiUrl}/tag/${release.tag_name}`,
+    url: `${project.baseUrl}${project.repository}/releases/tag/${release.tag_name}`,
     notesSourceUrl: apiUrl,
     name: release.name,
     body: release.body,
diff --git a/lib/workers/repository/update/pr/changelog/github/index.ts b/lib/workers/repository/update/pr/changelog/github/index.ts
index dd03b25581..4bc1432afe 100644
--- a/lib/workers/repository/update/pr/changelog/github/index.ts
+++ b/lib/workers/repository/update/pr/changelog/github/index.ts
@@ -82,7 +82,7 @@ export async function getReleaseList(
   _release: ChangeLogRelease
 ): Promise<ChangeLogNotes[]> {
   logger.trace('github.getReleaseList()');
-  const apiBaseUrl = project.apiBaseUrl!; // TODO #22198
+  const apiBaseUrl = project.apiBaseUrl;
   const repository = project.repository;
   const notesSourceUrl = joinUrlParts(
     apiBaseUrl,
diff --git a/lib/workers/repository/update/pr/changelog/gitlab/index.ts b/lib/workers/repository/update/pr/changelog/gitlab/index.ts
index 711c14c329..889d7eb0d7 100644
--- a/lib/workers/repository/update/pr/changelog/gitlab/index.ts
+++ b/lib/workers/repository/update/pr/changelog/gitlab/index.ts
@@ -3,7 +3,6 @@ import { logger } from '../../../../../../logger';
 import type { GitlabRelease } from '../../../../../../modules/datasource/gitlab-releases/types';
 import type { GitlabTreeNode } from '../../../../../../types/platform/gitlab';
 import { GitlabHttp } from '../../../../../../util/http/gitlab';
-import { ensureTrailingSlash } from '../../../../../../util/url';
 import type {
   ChangeLogFile,
   ChangeLogNotes,
@@ -21,9 +20,7 @@ export async function getReleaseNotesMd(
 ): Promise<ChangeLogFile | null> {
   logger.trace('gitlab.getReleaseNotesMd()');
   const urlEncodedRepo = encodeURIComponent(repository);
-  const apiPrefix = `${ensureTrailingSlash(
-    apiBaseUrl
-  )}projects/${urlEncodedRepo}/repository/`;
+  const apiPrefix = `${apiBaseUrl}projects/${urlEncodedRepo}/repository/`;
 
   // https://docs.gitlab.com/13.2/ee/api/repositories.html#list-repository-tree
   const tree = (
@@ -64,20 +61,16 @@ export async function getReleaseList(
   _release: ChangeLogRelease
 ): Promise<ChangeLogNotes[]> {
   logger.trace('gitlab.getReleaseNotesMd()');
-  // TODO #22198
-  const apiBaseUrl = project.apiBaseUrl!;
-  // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
-  const repository = project.repository!;
+  const apiBaseUrl = project.apiBaseUrl;
+  const repository = project.repository;
   const urlEncodedRepo = encodeURIComponent(repository);
-  const apiUrl = `${ensureTrailingSlash(
-    apiBaseUrl
-  )}projects/${urlEncodedRepo}/releases`;
+  const apiUrl = `${apiBaseUrl}projects/${urlEncodedRepo}/releases`;
 
   const res = await http.getJson<GitlabRelease[]>(`${apiUrl}?per_page=100`, {
     paginate: true,
   });
   return res.body.map((release) => ({
-    url: `${apiUrl}/${release.tag_name}`,
+    url: `${project.baseUrl}${repository}/-/releases/${release.tag_name}`,
     notesSourceUrl: apiUrl,
     name: release.name,
     body: release.description,
diff --git a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts
index dda0633eb8..d3b72ae738 100644
--- a/lib/workers/repository/update/pr/changelog/release-notes.spec.ts
+++ b/lib/workers/repository/update/pr/changelog/release-notes.spec.ts
@@ -141,11 +141,21 @@ describe('workers/repository/update/pr/changelog/release-notes', () => {
     });
 
     it('returns ChangeLogResult without release notes', async () => {
+      httpMock
+        .scope(
+          'https://gitlab.com/api/v4/projects/gitlab-org%2Fgitter%2Fwebapp'
+        )
+        .get('/repository/tree?per_page=100&path=lib')
+        .reply(200, [])
+        .get('/releases?per_page=100')
+        .reply(200, []);
       const input = {
         project: partial<ChangeLogProject>({
           type: 'gitlab',
-          repository: 'https://gitlab.com/gitlab-org/gitter/webapp/',
+          repository: 'gitlab-org/gitter/webapp',
           sourceDirectory: 'lib',
+          apiBaseUrl: 'https://gitlab.com/api/v4/',
+          baseUrl: 'https://gitlab.com/',
         }),
         versions: [
           partial<ChangeLogRelease>({
@@ -159,9 +169,11 @@ describe('workers/repository/update/pr/changelog/release-notes', () => {
       ).toEqual({
         hasReleaseNotes: false,
         project: {
-          repository: 'https://gitlab.com/gitlab-org/gitter/webapp/',
+          repository: 'gitlab-org/gitter/webapp',
           type: 'gitlab',
           sourceDirectory: 'lib',
+          apiBaseUrl: 'https://gitlab.com/api/v4/',
+          baseUrl: 'https://gitlab.com/',
         },
         versions: [
           {
@@ -252,13 +264,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => {
           notesSourceUrl:
             'https://gitlab.com/api/v4/projects/some%2Fyet-other-repository/releases',
           tag: 'v1.0.0',
-          url: 'https://gitlab.com/api/v4/projects/some%2Fyet-other-repository/releases/v1.0.0',
+          url: 'https://gitlab.com/some/yet-other-repository/-/releases/v1.0.0',
         },
         {
           notesSourceUrl:
             'https://gitlab.com/api/v4/projects/some%2Fyet-other-repository/releases',
           tag: 'v1.0.1',
-          url: 'https://gitlab.com/api/v4/projects/some%2Fyet-other-repository/releases/v1.0.1',
+          url: 'https://gitlab.com/some/yet-other-repository/-/releases/v1.0.1',
         },
       ]);
     });
@@ -291,13 +303,13 @@ describe('workers/repository/update/pr/changelog/release-notes', () => {
           notesSourceUrl:
             'https://my.custom.domain/api/v4/projects/some%2Fyet-other-repository/releases',
           tag: 'v1.0.0',
-          url: 'https://my.custom.domain/api/v4/projects/some%2Fyet-other-repository/releases/v1.0.0',
+          url: 'https://my.custom.domain/some/yet-other-repository/-/releases/v1.0.0',
         },
         {
           notesSourceUrl:
             'https://my.custom.domain/api/v4/projects/some%2Fyet-other-repository/releases',
           tag: 'v1.0.1',
-          url: 'https://my.custom.domain/api/v4/projects/some%2Fyet-other-repository/releases/v1.0.1',
+          url: 'https://my.custom.domain/some/yet-other-repository/-/releases/v1.0.1',
         },
       ]);
     });
diff --git a/lib/workers/repository/update/pr/changelog/release-notes.ts b/lib/workers/repository/update/pr/changelog/release-notes.ts
index b03d95ecc9..1ca943247c 100644
--- a/lib/workers/repository/update/pr/changelog/release-notes.ts
+++ b/lib/workers/repository/update/pr/changelog/release-notes.ts
@@ -66,7 +66,7 @@ export function getCachedReleaseList(
 ): Promise<ChangeLogNotes[]> {
   const { repository, apiBaseUrl } = project;
   // TODO: types (#22198)
-  const cacheKey = `getReleaseList-${apiBaseUrl!}-${repository}`;
+  const cacheKey = `getReleaseList-${apiBaseUrl}-${repository}`;
   const cachedResult = memCache.get<Promise<ChangeLogNotes[]>>(cacheKey);
   // istanbul ignore if
   if (cachedResult !== undefined) {
@@ -241,7 +241,7 @@ export async function getReleaseNotesMdFileInner(
   project: ChangeLogProject
 ): Promise<ChangeLogFile | null> {
   const { repository, type } = project;
-  const apiBaseUrl = project.apiBaseUrl!;
+  const apiBaseUrl = project.apiBaseUrl;
   const sourceDirectory = project.sourceDirectory!;
   try {
     switch (type) {
@@ -295,8 +295,8 @@ export function getReleaseNotesMdFile(
   const { sourceDirectory, repository, apiBaseUrl } = project;
   // TODO: types (#22198)
   const cacheKey = sourceDirectory
-    ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl!}`
-    : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl!}`;
+    ? `getReleaseNotesMdFile@v2-${repository}-${sourceDirectory}-${apiBaseUrl}`
+    : `getReleaseNotesMdFile@v2-${repository}-${apiBaseUrl}`;
   const cachedResult = memCache.get<Promise<ChangeLogFile | null>>(cacheKey);
   // istanbul ignore if
   if (cachedResult !== undefined) {
diff --git a/lib/workers/repository/update/pr/changelog/types.ts b/lib/workers/repository/update/pr/changelog/types.ts
index 4c14a6c83a..8a4a19e9a8 100644
--- a/lib/workers/repository/update/pr/changelog/types.ts
+++ b/lib/workers/repository/update/pr/changelog/types.ts
@@ -28,7 +28,7 @@ export type ChangeLogPlatform = 'bitbucket' | 'gitea' | 'github' | 'gitlab';
 export interface ChangeLogProject {
   packageName?: string;
   type: ChangeLogPlatform;
-  apiBaseUrl?: string;
+  apiBaseUrl: string;
   baseUrl: string;
   repository: string;
   sourceUrl: string;
diff --git a/lib/workers/repository/update/pr/index.spec.ts b/lib/workers/repository/update/pr/index.spec.ts
index 6a4411f2fa..866eca46bc 100644
--- a/lib/workers/repository/update/pr/index.spec.ts
+++ b/lib/workers/repository/update/pr/index.spec.ts
@@ -685,6 +685,7 @@ describe('workers/repository/update/pr/index', () => {
             type: 'github',
             repository: 'some/repo',
             baseUrl: 'https://github.com',
+            apiBaseUrl: 'https://api.github.com/',
             sourceUrl: 'https://github.com/some/repo',
           },
           versions: [
-- 
GitLab