From da6f2ed7d58ef8e7c3dd845251d3a7b190a5ccac Mon Sep 17 00:00:00 2001
From: Johannes Feichtner <343448+Churro@users.noreply.github.com>
Date: Mon, 29 May 2023 06:02:24 +0200
Subject: [PATCH] fix(manager/gradle): normalize version aliases in version
 catalogs (#22470)

---
 .../gradle/__fixtures__/1/libs.versions.toml  |  3 +-
 .../gradle/__fixtures__/2/libs.versions.toml  |  4 +--
 lib/modules/manager/gradle/extract.spec.ts    | 21 +++++++++-----
 lib/modules/manager/gradle/extract/catalog.ts | 29 ++++++++++++++-----
 4 files changed, 38 insertions(+), 19 deletions(-)

diff --git a/lib/modules/manager/gradle/__fixtures__/1/libs.versions.toml b/lib/modules/manager/gradle/__fixtures__/1/libs.versions.toml
index 8aac96c8ed..cbcc3e272a 100644
--- a/lib/modules/manager/gradle/__fixtures__/1/libs.versions.toml
+++ b/lib/modules/manager/gradle/__fixtures__/1/libs.versions.toml
@@ -17,5 +17,6 @@ kotest = [ "kotest-runner-junit5", "kotest-assertions-core-jvm" ]
 
 [plugins]
 detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" }
-publish-on-central = { id = "org.danilopianini.publish-on-central", version.ref = "publish.on.central" }
+publish-on-central = { id = "org.danilopianini.publish-on-central", version.ref = "publish_on.central" }
 grgit = { id = "org.ajoberstar.grgit", version.unknown = "this will fail" }
+grgit2 = { id = "org.ajoberstar.grgit2", version.ref = "unknown-ref" }
diff --git a/lib/modules/manager/gradle/__fixtures__/2/libs.versions.toml b/lib/modules/manager/gradle/__fixtures__/2/libs.versions.toml
index e68088f183..62f98ea855 100644
--- a/lib/modules/manager/gradle/__fixtures__/2/libs.versions.toml
+++ b/lib/modules/manager/gradle/__fixtures__/2/libs.versions.toml
@@ -1,12 +1,12 @@
 [versions]
 kotlin = "1.5.21"
-retrofit = "2.8.2"
+retro_fit = "2.8.2"
 
 [libraries]
 okHttp = "com.squareup.okhttp3:okhttp:4.9.0"
 okio = { module = "com.squareup.okio:okio", version = "2.8.0" }
 picasso = { group = "com.squareup.picasso", name = "picasso", version = "2.5.1" }
-retrofit2-retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
+retrofit2-retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retro_fit" }
 google-firebase-analytics = { module = "com.google.firebase:firebase-analytics" }
 google-firebase-crashlytics = { group = "com.google.firebase", name = "firebase-crashlytics" }
 google-firebase-messaging = "com.google.firebase:firebase-messaging"
diff --git a/lib/modules/manager/gradle/extract.spec.ts b/lib/modules/manager/gradle/extract.spec.ts
index e1f6f422ca..d54aa0c921 100644
--- a/lib/modules/manager/gradle/extract.spec.ts
+++ b/lib/modules/manager/gradle/extract.spec.ts
@@ -606,6 +606,11 @@ describe('modules/manager/gradle/extract', () => {
               registryUrls: ['https://plugins.gradle.org/m2/'],
               skipReason: 'unspecified-version',
             },
+            {
+              depName: 'org.ajoberstar.grgit2',
+              depType: 'plugin',
+              skipReason: 'unspecified-version',
+            },
           ],
         },
       ]);
@@ -631,7 +636,7 @@ describe('modules/manager/gradle/extract', () => {
               groupName: 'com.squareup.okhttp3',
               currentValue: '4.9.0',
               managerData: {
-                fileReplacePosition: 99,
+                fileReplacePosition: 100,
                 packageFile: 'gradle/libs.versions.toml',
               },
             },
@@ -640,7 +645,7 @@ describe('modules/manager/gradle/extract', () => {
               groupName: 'com.squareup.okio',
               currentValue: '2.8.0',
               managerData: {
-                fileReplacePosition: 161,
+                fileReplacePosition: 162,
                 packageFile: 'gradle/libs.versions.toml',
               },
             },
@@ -649,16 +654,16 @@ describe('modules/manager/gradle/extract', () => {
               groupName: 'com.squareup.picasso',
               currentValue: '2.5.1',
               managerData: {
-                fileReplacePosition: 243,
+                fileReplacePosition: 244,
                 packageFile: 'gradle/libs.versions.toml',
               },
             },
             {
               depName: 'com.squareup.retrofit2:retrofit',
-              groupName: 'retrofit',
+              groupName: 'retro.fit',
               currentValue: '2.8.2',
               managerData: {
-                fileReplacePosition: 41,
+                fileReplacePosition: 42,
                 packageFile: 'gradle/libs.versions.toml',
               },
             },
@@ -691,7 +696,7 @@ describe('modules/manager/gradle/extract', () => {
               packageName:
                 'org.jetbrains.kotlin.jvm:org.jetbrains.kotlin.jvm.gradle.plugin',
               managerData: {
-                fileReplacePosition: 661,
+                fileReplacePosition: 663,
                 packageFile: 'gradle/libs.versions.toml',
               },
               registryUrls: ['https://plugins.gradle.org/m2/'],
@@ -716,7 +721,7 @@ describe('modules/manager/gradle/extract', () => {
               packageName:
                 'org.danilopianini.multi-jvm-test-plugin:org.danilopianini.multi-jvm-test-plugin.gradle.plugin',
               managerData: {
-                fileReplacePosition: 822,
+                fileReplacePosition: 824,
                 packageFile: 'gradle/libs.versions.toml',
               },
               registryUrls: ['https://plugins.gradle.org/m2/'],
@@ -818,7 +823,7 @@ describe('modules/manager/gradle/extract', () => {
             },
             {
               depName: 'mocha-junit:mocha-junit',
-              groupName: 'mocha-junit-reporter',
+              groupName: 'mocha.junit.reporter',
               currentValue: '2.0.2',
               managerData: {
                 fileReplacePosition: 82,
diff --git a/lib/modules/manager/gradle/extract/catalog.ts b/lib/modules/manager/gradle/extract/catalog.ts
index 7061d8e8d4..ed11cab6dd 100644
--- a/lib/modules/manager/gradle/extract/catalog.ts
+++ b/lib/modules/manager/gradle/extract/catalog.ts
@@ -55,8 +55,22 @@ function isVersionPointer(
   return hasKey('ref', obj);
 }
 
-function normalizeVersionPointer(versionPointer: string): string {
-  return versionPointer.replace(regEx(/[._]/g), '-');
+function normalizeAlias(alias: string): string {
+  return alias.replace(regEx(/[-_]/g), '.');
+}
+
+function findOriginalAlias(
+  versions: Record<string, GradleVersionPointerTarget>,
+  alias: string
+): string {
+  const normalizedAlias = normalizeAlias(alias);
+  for (const sectionKey of Object.keys(versions)) {
+    if (normalizeAlias(sectionKey) === normalizedAlias) {
+      return sectionKey;
+    }
+  }
+
+  return alias;
 }
 
 interface VersionExtract {
@@ -83,13 +97,12 @@ function extractVersion({
   versionSubContent: string;
 }): VersionExtract {
   if (isVersionPointer(version)) {
-    const parsedVersion = normalizeVersionPointer(version.ref);
-    // everything else is ignored
+    const originalAlias = findOriginalAlias(versions, version.ref);
     return extractLiteralVersion({
-      version: versions[parsedVersion],
+      version: versions[originalAlias],
       depStartIndex: versionStartIndex,
       depSubContent: versionSubContent,
-      sectionKey: parsedVersion,
+      sectionKey: originalAlias,
     });
   } else {
     return extractLiteralVersion({
@@ -210,7 +223,7 @@ function extractDependency({
     };
   }
   const versionRef = isVersionPointer(descriptor.version)
-    ? normalizeVersionPointer(descriptor.version.ref)
+    ? normalizeAlias(descriptor.version.ref)
     : null;
   if (isArtifactDescriptor(descriptor)) {
     const { group, name } = descriptor;
@@ -289,7 +302,7 @@ export function parseCatalog(
       dependency.skipReason = skipReason;
     }
     if (isVersionPointer(version) && dependency.commitMessageTopic) {
-      dependency.groupName = normalizeVersionPointer(version.ref);
+      dependency.groupName = normalizeAlias(version.ref);
       delete dependency.commitMessageTopic;
     }
 
-- 
GitLab