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 00000000000000..bddeb5947dfe1d --- /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 3de8b93a16b511..d1ebe3cea1353c 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 a7b3bf4a6b3378..1a556836964e12 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