From 96d174b460707ba07ff81d50887ebfe1848a7f1f Mon Sep 17 00:00:00 2001
From: RahulGautamSingh <rahultesnik@gmail.com>
Date: Sat, 3 Feb 2024 12:21:00 +0545
Subject: [PATCH] fix(update/pr): stricter de-deduplicationof upgrades (#27029)

---
 .../repository/update/pr/index.spec.ts        | 48 +++++++++++++++++++
 lib/workers/repository/update/pr/index.ts     |  6 +--
 2 files changed, 49 insertions(+), 5 deletions(-)

diff --git a/lib/workers/repository/update/pr/index.spec.ts b/lib/workers/repository/update/pr/index.spec.ts
index 6e0f81d0ad..d50959fb92 100644
--- a/lib/workers/repository/update/pr/index.spec.ts
+++ b/lib/workers/repository/update/pr/index.spec.ts
@@ -798,6 +798,54 @@ describe('workers/repository/update/pr/index', () => {
           ],
         });
       });
+
+      // compares currentVersion and currentValue separately to
+      // prevent removal false duplicates
+      it('stricter de-deuplication of changelogs', async () => {
+        platform.createPr.mockResolvedValueOnce(pr);
+        const upgrade = {
+          ...dummyUpgrade,
+          currentValue:
+            '1.21.5-alpine3.18@sha256:d8b99943fb0587b79658af03d4d4e8b57769b21dcf08a8401352a9f2a7228754',
+          newValue:
+            '1.21.6-alpine3.18@sha256:3354c3a94c3cf67cb37eb93a8e9474220b61a196b13c26f1c01715c301b22a69',
+          currentVersion: '1.21.5-alpine3.18',
+          newVersion: '1.21.6-alpine3.18',
+          logJSON: undefined,
+          sourceUrl: 'https://github.com/foo/bar',
+          hasReleaseNotes: true,
+        };
+        delete upgrade.logJSON;
+
+        const res = await ensurePr({
+          ...config,
+          upgrades: [
+            upgrade,
+            {
+              ...upgrade,
+              currentValue:
+                '1.21.5-alpine3.19@sha256:d8b99943fb0587b79658af03d4d4e8b57769b21dcf08a8401352a9f2a7228754',
+              newValue:
+                '1.21.6-alpine3.19@sha256:3354c3a94c3cf67cb37eb93a8e9474220b61a196b13c26f1c01715c301b22a69',
+              currentVersion: '1.21.5-alpine3.19',
+              newVersion: '1.21.6-alpine3.19',
+            },
+            // adding this object for coverage
+            {
+              ...upgrade,
+              currentValue: undefined,
+              newValue:
+                '1.21.6-alpine3.19@sha256:3354c3a94c3cf67cb37eb93a8e9474220b61a196b13c26f1c01715c301b22a69',
+              currentVersion: '1.21.5-alpine3.19',
+              newVersion: undefined,
+            },
+          ],
+        });
+
+        expect(res).toEqual({ type: 'with-pr', pr });
+        const [[bodyConfig]] = prBody.getPrBody.mock.calls;
+        expect(bodyConfig.upgrades).toHaveLength(3);
+      });
     });
 
     describe('prCache', () => {
diff --git a/lib/workers/repository/update/pr/index.ts b/lib/workers/repository/update/pr/index.ts
index 0629f0bc68..02f5ba42da 100644
--- a/lib/workers/repository/update/pr/index.ts
+++ b/lib/workers/repository/update/pr/index.ts
@@ -243,11 +243,7 @@ export async function ensurePr(
   // Get changelog and then generate template strings
   for (const upgrade of upgrades) {
     // TODO: types (#22198)
-    const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${
-      upgrade.manager
-    }-${
-      upgrade.currentVersion ?? upgrade.currentValue!
-    }-${upgrade.newVersion!}`;
+    const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${upgrade.manager}-${upgrade.currentVersion ?? ''}-${upgrade.currentValue ?? ''}-${upgrade.newVersion ?? ''}-${upgrade.newValue ?? ''}`;
     if (processedUpgrades.includes(upgradeKey)) {
       continue;
     }
-- 
GitLab