From 7178da30743b88b289d2f2cd859891d4c07be3ab Mon Sep 17 00:00:00 2001
From: george-wilson-rea <106576487+george-wilson-rea@users.noreply.github.com>
Date: Thu, 13 Jun 2024 20:04:11 +1000
Subject: [PATCH] refactor: Tidy Scala version normalization code (#29642)

---
 lib/modules/manager/sbt/extract.ts   |  6 +----
 lib/modules/manager/sbt/util.spec.ts | 39 +++++++++++++++++++++++++++-
 lib/modules/manager/sbt/util.ts      |  7 ++++-
 3 files changed, 45 insertions(+), 7 deletions(-)

diff --git a/lib/modules/manager/sbt/extract.ts b/lib/modules/manager/sbt/extract.ts
index 8be2b047dc..747245f1ae 100644
--- a/lib/modules/manager/sbt/extract.ts
+++ b/lib/modules/manager/sbt/extract.ts
@@ -201,16 +201,12 @@ function depHandler(ctx: Ctx): Ctx {
   delete ctx.variableName;
 
   const depName = `${groupId!}:${artifactId!}`;
-  const isScala3 = scalaVersion?.[0] === '3';
-  const scalaVersionForPackageName = isScala3 ? '3' : scalaVersion;
 
   const dep: PackageDependency = {
     datasource: SbtPackageDatasource.id,
     depName,
     packageName:
-      scalaVersionForPackageName && useScalaVersion
-        ? `${depName}_${scalaVersionForPackageName}`
-        : depName,
+      scalaVersion && useScalaVersion ? `${depName}_${scalaVersion}` : depName,
     currentValue,
   };
 
diff --git a/lib/modules/manager/sbt/util.spec.ts b/lib/modules/manager/sbt/util.spec.ts
index b4cdb90b7b..83f959fba3 100644
--- a/lib/modules/manager/sbt/util.spec.ts
+++ b/lib/modules/manager/sbt/util.spec.ts
@@ -1,4 +1,4 @@
-import { sortPackageFiles } from './util';
+import { normalizeScalaVersion, sortPackageFiles } from './util';
 
 describe('modules/manager/sbt/util', () => {
   describe('sortPackageFiles()', () => {
@@ -15,4 +15,41 @@ describe('modules/manager/sbt/util', () => {
       ]);
     });
   });
+
+  describe('normalizeScalaVersion()', () => {
+    it('does not normalize prior to 2.10', () => {
+      const version = '2.9.3';
+      expect(normalizeScalaVersion(version)).toBe('2.9.3');
+    });
+
+    it('normalizes a Scala 2.10 version number', () => {
+      const version = '2.10.7';
+      expect(normalizeScalaVersion(version)).toBe('2.10');
+    });
+
+    it('normalizes a Scala 2.11 version number', () => {
+      const version = '2.11.12';
+      expect(normalizeScalaVersion(version)).toBe('2.11');
+    });
+
+    it('normalizes a Scala 2.12 version number', () => {
+      const version = '2.12.19';
+      expect(normalizeScalaVersion(version)).toBe('2.12');
+    });
+
+    it('normalizes a Scala 2.13 version number', () => {
+      const version = '2.13.14';
+      expect(normalizeScalaVersion(version)).toBe('2.13');
+    });
+
+    it('normalizes a Scala 3 LTS version number', () => {
+      const version = '3.3.3';
+      expect(normalizeScalaVersion(version)).toBe('3');
+    });
+
+    it('normalizes a Scala 3 current version number', () => {
+      const version = '3.4.2';
+      expect(normalizeScalaVersion(version)).toBe('3');
+    });
+  });
 });
diff --git a/lib/modules/manager/sbt/util.ts b/lib/modules/manager/sbt/util.ts
index aa85d9bcbe..a7d1dbce8a 100644
--- a/lib/modules/manager/sbt/util.ts
+++ b/lib/modules/manager/sbt/util.ts
@@ -21,8 +21,13 @@ export function normalizeScalaVersion(str: string): string {
       return str;
     }
   }
+  const isScala3 = versioning.isGreaterThan(str, '3.0.0');
   if (regEx(/^\d+\.\d+\.\d+$/).test(str)) {
-    return str.replace(regEx(/^(\d+)\.(\d+)\.\d+$/), '$1.$2');
+    if (isScala3) {
+      return str.replace(regEx(/^(\d+)\.(\d+)\.\d+$/), '$1');
+    } else {
+      return str.replace(regEx(/^(\d+)\.(\d+)\.\d+$/), '$1.$2');
+    }
   }
   // istanbul ignore next
   return str;
-- 
GitLab