From dad6a1f6074b10bfdc83c26482f45aa5a569ecfa Mon Sep 17 00:00:00 2001
From: StinkyLord <42116482+PhilipAbed@users.noreply.github.com>
Date: Wed, 11 May 2022 06:44:44 +0300
Subject: [PATCH] fix(gradle): gradle/libs.versions.toml should replace version
 not comment (#15330)

---
 .../gradle/__fixtures__/3/libs.versions.toml  | 10 +++++
 lib/modules/manager/gradle/extract.spec.ts    | 42 +++++++++++++++++++
 lib/modules/manager/gradle/extract/catalog.ts | 22 +++++++++-
 3 files changed, 73 insertions(+), 1 deletion(-)
 create mode 100644 lib/modules/manager/gradle/__fixtures__/3/libs.versions.toml

diff --git a/lib/modules/manager/gradle/__fixtures__/3/libs.versions.toml b/lib/modules/manager/gradle/__fixtures__/3/libs.versions.toml
new file mode 100644
index 0000000000..bddeb5947d
--- /dev/null
+++ b/lib/modules/manager/gradle/__fixtures__/3/libs.versions.toml
@@ -0,0 +1,10 @@
+[versions]
+# Releases: http://someWebsite.com/junit/1.4.9
+mocha-junit-reporter = "2.0.2"
+# JUnit 1.4.9 is awesome!
+junit = "1.4.9"
+
+
+[libraries]
+junit-legacy = { module = "junit:junit", version.ref = "junit" }
+mocha-junit = { module = "mocha-junit:mocha-junit", version.ref = "mocha-junit-reporter" }
diff --git a/lib/modules/manager/gradle/extract.spec.ts b/lib/modules/manager/gradle/extract.spec.ts
index 3de8b93a16..d1ebe3cea1 100644
--- a/lib/modules/manager/gradle/extract.spec.ts
+++ b/lib/modules/manager/gradle/extract.spec.ts
@@ -505,4 +505,46 @@ describe('modules/manager/gradle/extract', () => {
       },
     ]);
   });
+
+  it('should change the dependency version not the comment version', async () => {
+    const tomlFile = loadFixture('3/libs.versions.toml');
+    const fsMock = {
+      'gradle/libs.versions.toml': tomlFile,
+    };
+    mockFs(fsMock);
+    const res = await extractAllPackageFiles(
+      {} as ExtractConfig,
+      Object.keys(fsMock)
+    );
+    expect(res).toMatchObject([
+      {
+        packageFile: 'gradle/libs.versions.toml',
+        datasource: 'maven',
+        deps: [
+          {
+            depName: 'junit:junit',
+            groupName: 'junit',
+            currentValue: '1.4.9',
+            managerData: {
+              fileReplacePosition: 124,
+              packageFile: 'gradle/libs.versions.toml',
+            },
+            fileReplacePosition: 124,
+            registryUrls: ['https://repo.maven.apache.org/maven2'],
+          },
+          {
+            depName: 'mocha-junit:mocha-junit',
+            groupName: 'mocha-junit-reporter',
+            currentValue: '2.0.2',
+            managerData: {
+              fileReplacePosition: 82,
+              packageFile: 'gradle/libs.versions.toml',
+            },
+            fileReplacePosition: 82,
+            registryUrls: ['https://repo.maven.apache.org/maven2'],
+          },
+        ],
+      },
+    ]);
+  });
 });
diff --git a/lib/modules/manager/gradle/extract/catalog.ts b/lib/modules/manager/gradle/extract/catalog.ts
index a7b3bf4a6b..1a55683696 100644
--- a/lib/modules/manager/gradle/extract/catalog.ts
+++ b/lib/modules/manager/gradle/extract/catalog.ts
@@ -3,6 +3,7 @@ import is from '@sindresorhus/is';
 import deepmerge from 'deepmerge';
 import type { SkipReason } from '../../../../types';
 import { hasKey } from '../../../../util/object';
+import { escapeRegExp, regEx } from '../../../../util/regex';
 import type { PackageDependency } from '../../types';
 import type {
   GradleCatalog,
@@ -14,6 +15,25 @@ import type {
   VersionPointer,
 } from '../types';
 
+function findVersionIndex(
+  content: string,
+  depName: string,
+  version: string
+): number {
+  const eDn = escapeRegExp(depName);
+  const eVer = escapeRegExp(version);
+  const re = regEx(
+    `(?:id\\s*=\\s*)?['"]?${eDn}["']?(?:(?:\\s*=\\s*)|:|,\\s*)(?:.*version(?:\\.ref)?(?:\\s*\\=\\s*))?["']?${eVer}['"]?`
+  );
+  const match = re.exec(content);
+  if (match) {
+    return match.index + content.slice(match.index).indexOf(version);
+  }
+  // ignoring Fallback because I can't reach it in tests, and code is not supposed to reach it but just in case.
+  /* istanbul ignore next */
+  return findIndexAfter(content, depName, version);
+}
+
 function findIndexAfter(
   content: string,
   sliceAfter: string,
@@ -91,7 +111,7 @@ function extractLiteralVersion({
     return { skipReason: 'no-version' };
   } else if (is.string(version)) {
     const fileReplacePosition =
-      depStartIndex + findIndexAfter(depSubContent, sectionKey, version);
+      depStartIndex + findVersionIndex(depSubContent, sectionKey, version);
     return { currentValue: version, fileReplacePosition };
   } else if (is.plainObject(version)) {
     // https://github.com/gradle/gradle/blob/d9adf33a57925582988fc512002dcc0e8ce4db95/subprojects/core/src/main/java/org/gradle/api/internal/catalog/parser/TomlCatalogFileParser.java#L368
-- 
GitLab