From 3749df2853d5801bf12176d28742e17b74620c0d Mon Sep 17 00:00:00 2001
From: Connor Meredith <4907463+connormeredith@users.noreply.github.com>
Date: Thu, 29 Jul 2021 21:30:15 +0100
Subject: [PATCH] fix(gitlab): only fetch MRs opened by renovate (#10985)

* fix(gitlab): only fetch MRs opened by renovate

* Explicitly check for authorId before using it.

* Use scope instead of author_id for Gitlab fetch MR and issue requests.

Co-authored-by: Rhys Arkins <rhys@arkins.net>
---
 .../gitlab/__snapshots__/index.spec.ts.snap   | 44 ++++++------
 lib/platform/gitlab/index.spec.ts             | 72 +++++++++++++------
 lib/platform/gitlab/index.ts                  | 10 +--
 3 files changed, 75 insertions(+), 51 deletions(-)

diff --git a/lib/platform/gitlab/__snapshots__/index.spec.ts.snap b/lib/platform/gitlab/__snapshots__/index.spec.ts.snap
index 91bbdf4f78..64478dadb7 100644
--- a/lib/platform/gitlab/__snapshots__/index.spec.ts.snap
+++ b/lib/platform/gitlab/__snapshots__/index.spec.ts.snap
@@ -681,7 +681,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened",
+    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened",
   },
   Object {
     "body": "{\\"title\\":\\"new-title\\",\\"description\\":\\"new-content\\",\\"labels\\":[]}",
@@ -711,7 +711,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened",
+    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened",
   },
   Object {
     "body": "{\\"title\\":\\"new-title\\",\\"description\\":\\"new-content\\",\\"labels\\":[\\"Renovate\\",\\"Maintenance\\"]}",
@@ -741,7 +741,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened",
+    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened",
   },
   Object {
     "headers": Object {
@@ -768,7 +768,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened",
+    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened",
   },
   Object {
     "headers": Object {
@@ -809,7 +809,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened",
+    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened",
   },
   Object {
     "headers": Object {
@@ -850,7 +850,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened",
+    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened",
   },
   Object {
     "body": "{\\"state_event\\":\\"close\\"}",
@@ -957,7 +957,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened",
+    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened",
   },
   Object {
     "headers": Object {
@@ -984,7 +984,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened",
+    "url": "https://gitlab.com/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened",
   },
 ]
 `;
@@ -1000,7 +1000,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
 ]
 `;
@@ -1016,7 +1016,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
 ]
 `;
@@ -1032,7 +1032,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
 ]
 `;
@@ -1048,7 +1048,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
 ]
 `;
@@ -1064,7 +1064,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
 ]
 `;
@@ -1080,7 +1080,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
 ]
 `;
@@ -1107,7 +1107,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/some%2Frepo/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me",
   },
 ]
 `;
@@ -1150,7 +1150,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/some%2Frepo/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me",
   },
   Object {
     "headers": Object {
@@ -1216,7 +1216,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/some%2Frepo/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me",
   },
   Object {
     "headers": Object {
@@ -1282,7 +1282,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/some%2Frepo/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me",
   },
   Object {
     "headers": Object {
@@ -2465,7 +2465,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
   Object {
     "body": "{\\"title\\":\\"title\\",\\"description\\":\\"body\\",\\"state_event\\":\\"close\\"}",
@@ -2517,7 +2517,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
   Object {
     "body": "{\\"title\\":\\"Draft: title\\",\\"description\\":\\"body\\"}",
@@ -2569,7 +2569,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
   Object {
     "body": "{\\"title\\":\\"Draft: title\\",\\"description\\":\\"body\\"}",
@@ -2621,7 +2621,7 @@ Array [
       "user-agent": "RenovateBot/0.0.0-semantic-release (https://github.com/renovatebot/renovate)",
     },
     "method": "GET",
-    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100",
+    "url": "https://gitlab.com/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me",
   },
   Object {
     "body": "{\\"title\\":\\"title\\",\\"description\\":\\"body\\"}",
diff --git a/lib/platform/gitlab/index.spec.ts b/lib/platform/gitlab/index.spec.ts
index 1deb9edbbf..d01c005d2c 100644
--- a/lib/platform/gitlab/index.spec.ts
+++ b/lib/platform/gitlab/index.spec.ts
@@ -354,7 +354,9 @@ describe(getName(), () => {
     it('should return null if no PR exists', async () => {
       const scope = await initRepo();
       scope
-        .get('/api/v4/projects/some%2Frepo/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, []);
       const pr = await gitlab.getBranchPr('some-branch');
       expect(pr).toBeNull();
@@ -363,7 +365,9 @@ describe(getName(), () => {
     it('should return the PR object', async () => {
       const scope = await initRepo();
       scope
-        .get('/api/v4/projects/some%2Frepo/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 91,
@@ -400,7 +404,9 @@ describe(getName(), () => {
     it('should strip draft prefix from title', async () => {
       const scope = await initRepo();
       scope
-        .get('/api/v4/projects/some%2Frepo/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 91,
@@ -437,7 +443,9 @@ describe(getName(), () => {
     it('should strip deprecated draft prefix from title', async () => {
       const scope = await initRepo();
       scope
-        .get('/api/v4/projects/some%2Frepo/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/some%2Frepo/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 91,
@@ -677,7 +685,7 @@ describe(getName(), () => {
       httpMock
         .scope(gitlabApiHost)
         .get(
-          '/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened'
+          '/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened'
         )
         .reply(200, [
           {
@@ -697,7 +705,7 @@ describe(getName(), () => {
       httpMock
         .scope(gitlabApiHost)
         .get(
-          '/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened'
+          '/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened'
         )
         .reply(200, [
           {
@@ -721,7 +729,7 @@ describe(getName(), () => {
       httpMock
         .scope(gitlabApiHost)
         .get(
-          '/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened'
+          '/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened'
         )
         .reply(200, [
           {
@@ -747,7 +755,7 @@ describe(getName(), () => {
       httpMock
         .scope(gitlabApiHost)
         .get(
-          '/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened'
+          '/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened'
         )
         .reply(200, [])
         .post('/api/v4/projects/undefined/issues')
@@ -765,7 +773,7 @@ describe(getName(), () => {
       httpMock
         .scope(gitlabApiHost)
         .get(
-          '/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened'
+          '/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened'
         )
         .reply(200, [
           {
@@ -793,7 +801,7 @@ describe(getName(), () => {
       httpMock
         .scope(gitlabApiHost)
         .get(
-          '/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened'
+          '/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened'
         )
         .reply(200, [
           {
@@ -822,7 +830,7 @@ describe(getName(), () => {
       httpMock
         .scope(gitlabApiHost)
         .get(
-          '/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened'
+          '/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened'
         )
         .reply(200, [
           {
@@ -849,7 +857,7 @@ describe(getName(), () => {
       httpMock
         .scope(gitlabApiHost)
         .get(
-          '/api/v4/projects/undefined/issues?per_page=100&author_id=undefined&state=opened'
+          '/api/v4/projects/undefined/issues?per_page=100&scope=created_by_me&state=opened'
         )
         .reply(200, [
           {
@@ -1108,7 +1116,9 @@ describe(getName(), () => {
     it('returns true if no title and all state', async () => {
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
@@ -1126,7 +1136,9 @@ describe(getName(), () => {
     it('returns true if not open', async () => {
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
@@ -1146,7 +1158,9 @@ describe(getName(), () => {
     it('returns true if open and with title', async () => {
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
@@ -1167,7 +1181,9 @@ describe(getName(), () => {
     it('returns true with title', async () => {
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
@@ -1186,7 +1202,9 @@ describe(getName(), () => {
     it('returns true with draft prefix title', async () => {
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
@@ -1205,7 +1223,9 @@ describe(getName(), () => {
     it('returns true with deprecated draft prefix title', async () => {
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
@@ -1492,7 +1512,9 @@ describe(getName(), () => {
       await initPlatform('13.3.6-ee');
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
@@ -1510,7 +1532,9 @@ describe(getName(), () => {
       await initPlatform('13.3.6-ee');
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
@@ -1528,7 +1552,9 @@ describe(getName(), () => {
       await initPlatform('13.3.6-ee');
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
@@ -1546,7 +1572,9 @@ describe(getName(), () => {
       await initPlatform('13.3.6-ee');
       httpMock
         .scope(gitlabApiHost)
-        .get('/api/v4/projects/undefined/merge_requests?per_page=100')
+        .get(
+          '/api/v4/projects/undefined/merge_requests?per_page=100&scope=created_by_me'
+        )
         .reply(200, [
           {
             iid: 1,
diff --git a/lib/platform/gitlab/index.ts b/lib/platform/gitlab/index.ts
index 7c43c8fe1d..28eecfa1c1 100644
--- a/lib/platform/gitlab/index.ts
+++ b/lib/platform/gitlab/index.ts
@@ -70,7 +70,6 @@ const defaults = {
 const DRAFT_PREFIX = 'Draft: ';
 const DRAFT_PREFIX_DEPRECATED = 'WIP: ';
 
-let authorId: number;
 let draftPrefix = DRAFT_PREFIX;
 
 export async function initPlatform({
@@ -96,7 +95,6 @@ export async function initPlatform({
       )
     ).body;
     gitAuthor = `${user.name} <${user.email}>`;
-    authorId = user.id;
     // version is 'x.y.z-edition', so not strictly semver; need to strip edition
     gitlabVersion = (
       await gitlabApi.getJson<{ version: string }>('version', { token })
@@ -398,10 +396,8 @@ async function fetchPrList(): Promise<Pr[]> {
     per_page: '100',
   } as any;
   // istanbul ignore if
-  if (config.ignorePrAuthor) {
-    // https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-requests
-    // default: `scope=created_by_me`
-    searchParams.scope = 'all';
+  if (!config.ignorePrAuthor) {
+    searchParams.scope = 'created_by_me';
   }
   const query = getQueryString(searchParams);
   const urlString = `projects/${config.repository}/merge_requests?${query}`;
@@ -730,7 +726,7 @@ export async function getIssueList(): Promise<GitlabIssue[]> {
   if (!config.issueList) {
     const query = getQueryString({
       per_page: '100',
-      author_id: `${authorId}`,
+      scope: 'created_by_me',
       state: 'opened',
     });
     const res = await gitlabApi.getJson<
-- 
GitLab