From b9930407f40b5f1fa0a3a4be55cf710c58c70d50 Mon Sep 17 00:00:00 2001
From: Sergey Vedmak <serg.vedmak@gmail.com>
Date: Thu, 7 Oct 2021 12:54:51 +0300
Subject: [PATCH] fix(monorepo): load changelog.md file from gitlab monorepo
 (#12053)

---
 .../__snapshots__/gitlab.spec.ts.snap         |  6 +++++
 .../__snapshots__/release-notes.spec.ts.snap  |  2 +-
 lib/workers/pr/changelog/gitlab/index.ts      | 22 ++++++++-----------
 .../pr/changelog/release-notes.spec.ts        |  8 +++----
 lib/workers/pr/changelog/source-gitlab.ts     |  2 ++
 5 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/lib/workers/pr/changelog/__snapshots__/gitlab.spec.ts.snap b/lib/workers/pr/changelog/__snapshots__/gitlab.spec.ts.snap
index cc229009fe..d02b4cdfba 100644
--- a/lib/workers/pr/changelog/__snapshots__/gitlab.spec.ts.snap
+++ b/lib/workers/pr/changelog/__snapshots__/gitlab.spec.ts.snap
@@ -8,6 +8,7 @@ Object {
     "baseUrl": "https://gitlab.com/",
     "depName": "renovate",
     "repository": "meno/dropzone",
+    "sourceDirectory": undefined,
     "sourceUrl": "https://gitlab.com/meno/dropzone/",
     "type": "gitlab",
   },
@@ -156,6 +157,7 @@ Object {
     "baseUrl": "https://gitlab-enterprise.example.com/",
     "depName": "renovate",
     "repository": "meno/dropzone",
+    "sourceDirectory": undefined,
     "sourceUrl": "https://gitlab-enterprise.example.com/meno/dropzone/",
     "type": "gitlab",
   },
@@ -200,6 +202,7 @@ Object {
     "baseUrl": "https://git.test.com/",
     "depName": "renovate",
     "repository": "meno/dropzone",
+    "sourceDirectory": undefined,
     "sourceUrl": "https://git.test.com/meno/dropzone/",
     "type": "gitlab",
   },
@@ -244,6 +247,7 @@ Object {
     "baseUrl": "https://gitlab.com/",
     "depName": "renovate",
     "repository": "meno/dropzone",
+    "sourceDirectory": undefined,
     "sourceUrl": "https://gitlab.com/meno/dropzone/",
     "type": "gitlab",
   },
@@ -408,6 +412,7 @@ Object {
     "baseUrl": "https://gitlab.com/",
     "depName": "renovate",
     "repository": "meno/dropzone",
+    "sourceDirectory": undefined,
     "sourceUrl": "https://gitlab.com/meno/dropzone/",
     "type": "gitlab",
   },
@@ -556,6 +561,7 @@ Object {
     "baseUrl": "https://gitlab.com/",
     "depName": "renovate",
     "repository": "meno/dropzone",
+    "sourceDirectory": undefined,
     "sourceUrl": "https://gitlab.com/meno/dropzone/",
     "type": "gitlab",
   },
diff --git a/lib/workers/pr/changelog/__snapshots__/release-notes.spec.ts.snap b/lib/workers/pr/changelog/__snapshots__/release-notes.spec.ts.snap
index 976f87b5a5..4386f098d4 100644
--- a/lib/workers/pr/changelog/__snapshots__/release-notes.spec.ts.snap
+++ b/lib/workers/pr/changelog/__snapshots__/release-notes.spec.ts.snap
@@ -366,7 +366,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/itentialopensource%2fadapter-utils/repository/tree?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/itentialopensource%2fadapter-utils/repository/tree?per_page=100&path=packages/foo",
   },
   Object {
     "headers": Object {
diff --git a/lib/workers/pr/changelog/gitlab/index.ts b/lib/workers/pr/changelog/gitlab/index.ts
index ab7e71625d..282e2f5c21 100644
--- a/lib/workers/pr/changelog/gitlab/index.ts
+++ b/lib/workers/pr/changelog/gitlab/index.ts
@@ -60,23 +60,19 @@ export async function getReleaseNotesMd(
 
   // https://docs.gitlab.com/13.2/ee/api/repositories.html#list-repository-tree
   const tree = (
-    await http.getJson<GitlabTreeNode[]>(`${apiPrefix}tree?per_page=100`, {
-      paginate: true,
-    })
+    await http.getJson<GitlabTreeNode[]>(
+      `${apiPrefix}tree?per_page=100${
+        sourceDirectory ? `&path=${sourceDirectory}` : ''
+      }`,
+      {
+        paginate: true,
+      }
+    )
   ).body;
   const allFiles = tree.filter((f) => f.type === 'blob');
   let files: GitlabTreeNode[] = [];
-  if (sourceDirectory?.length) {
-    files = allFiles
-      .filter((f) => f.path.startsWith(sourceDirectory))
-      .filter((f) =>
-        changelogFilenameRegex.test(
-          f.path.replace(ensureTrailingSlash(sourceDirectory), '')
-        )
-      );
-  }
   if (!files.length) {
-    files = allFiles.filter((f) => changelogFilenameRegex.test(f.path));
+    files = allFiles.filter((f) => changelogFilenameRegex.test(f.name));
   }
   if (!files.length) {
     logger.trace('no changelog file found');
diff --git a/lib/workers/pr/changelog/release-notes.spec.ts b/lib/workers/pr/changelog/release-notes.spec.ts
index 622b0d618b..9967a40d79 100644
--- a/lib/workers/pr/changelog/release-notes.spec.ts
+++ b/lib/workers/pr/changelog/release-notes.spec.ts
@@ -37,9 +37,9 @@ const githubTreeResponse = {
 };
 
 const gitlabTreeResponse = [
-  { path: 'lib', type: 'tree' },
-  { path: 'CHANGELOG.md', type: 'blob', id: 'abcd' },
-  { path: 'README.md', type: 'blob' },
+  { path: 'lib', name: 'lib', type: 'tree' },
+  { path: 'CHANGELOG.md', name: 'CHANGELOG.md', type: 'blob', id: 'abcd' },
+  { path: 'README.md', name: 'README.md', type: 'blob' },
 ];
 
 const githubProject = {
@@ -615,7 +615,7 @@ describe('workers/pr/changelog/release-notes', () => {
         httpMock
           .scope('https://gitlab.com/')
           .get(
-            '/api/v4/projects/itentialopensource%2fadapter-utils/repository/tree?per_page=100'
+            `/api/v4/projects/itentialopensource%2fadapter-utils/repository/tree?per_page=100&path=${sourceDirectory}`
           )
           .reply(200, response)
           .get(
diff --git a/lib/workers/pr/changelog/source-gitlab.ts b/lib/workers/pr/changelog/source-gitlab.ts
index c241bb9a04..9eb713d13b 100644
--- a/lib/workers/pr/changelog/source-gitlab.ts
+++ b/lib/workers/pr/changelog/source-gitlab.ts
@@ -36,6 +36,7 @@ export async function getChangeLogJSON({
   releases,
   depName,
   manager,
+  sourceDirectory,
 }: BranchUpgradeConfig): Promise<ChangeLogResult | null> {
   logger.trace('getChangeLogJSON for gitlab');
   const version = allVersioning.get(versioning);
@@ -134,6 +135,7 @@ export async function getChangeLogJSON({
       repository,
       sourceUrl,
       depName,
+      sourceDirectory,
     },
     versions: changelogReleases,
   };
-- 
GitLab