diff --git a/lib/manager/gradle/__fixtures__/build.gradle.example1 b/lib/manager/gradle/__fixtures__/build.gradle.example1 index e4a2854e79ce1a2d2b265eb0e0c34b490c85f363..5ba8e6206b6960210644c27a8199e7d845e13749 100644 --- a/lib/manager/gradle/__fixtures__/build.gradle.example1 +++ b/lib/manager/gradle/__fixtures__/build.gradle.example1 @@ -14,6 +14,7 @@ buildscript { classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' classpath 'com.fkorotkov:gradle-libraries-plugin:0.1' classpath "gradle.plugin.se.patrikerdes:gradle-use-latest-versions-plugin:0.2.3" + classpath 'org.apache.openjpa:openjpa:3.1.1' } } @@ -73,6 +74,8 @@ dependencies { // optional dependencies for using Spock testCompile "org.hamcrest:hamcrest-core:1.3" // only necessary if Hamcrest matchers are used testRuntime "cglib:cglib-nodep:3.1" // allows mocking of classes (in addition to interfaces) + + dependency 'org.apache.openjpa:openjpa:3.1.1' } task integration(type: Test) { diff --git a/lib/manager/gradle/__snapshots__/index.spec.ts.snap b/lib/manager/gradle/__snapshots__/index.spec.ts.snap index e9758e7b91d23b46099f6e14f739671efec556a9..aaeec7a9edb9ad03e6455d7314341c9ec1e7f2a1 100644 --- a/lib/manager/gradle/__snapshots__/index.spec.ts.snap +++ b/lib/manager/gradle/__snapshots__/index.spec.ts.snap @@ -814,3 +814,5 @@ exports[`manager/gradle/index updateDependency should update an existing module exports[`manager/gradle/index updateDependency should update an existing plugin dependency 1`] = `Array []`; exports[`manager/gradle/index updateDependency should update an existing plugin dependency with Kotlin DSL 1`] = `Array []`; + +exports[`manager/gradle/index updateDependency should update dependencies in same file 1`] = `Array []`; diff --git a/lib/manager/gradle/build-gradle.ts b/lib/manager/gradle/build-gradle.ts index 84ca91c2d4b2b55f3fb884fc99c17bf063007fa7..8ab31dd1074b74ad7ff7af762a1352a60b33cea6 100644 --- a/lib/manager/gradle/build-gradle.ts +++ b/lib/manager/gradle/build-gradle.ts @@ -48,6 +48,14 @@ function kotlinPluginStringVersionFormatMatch( return regEx(`(id\\("${dependency.group}"\\)\\s+version\\s+")[^$].*?(")`); } +function dependencyStringVersionFormatMatch( + dependency: GradleDependency +): RegExp { + return regEx( + `(dependency\\s+['"]${dependency.group}:${dependency.name}:)[^'"]+(['"])` + ); +} + function allMapFormatOrders( group: string, name: string, @@ -202,19 +210,18 @@ function updateVersionLiterals( moduleStringVersionFormatMatch(dependency), groovyPluginStringVersionFormatMatch(dependency), kotlinPluginStringVersionFormatMatch(dependency), + dependencyStringVersionFormatMatch(dependency), ...moduleMapVersionFormatMatch(dependency), ...moduleKotlinNamedArgumentVersionFormatMatch(dependency), ]; + let result = buildGradleContent; for (const regex of regexes) { - const match = regex.exec(buildGradleContent); + const match = regex.exec(result); if (match) { - return buildGradleContent.replace( - match[0], - `${match[1]}${newVersion}${match[2]}` - ); + result = result.replace(match[0], `${match[1]}${newVersion}${match[2]}`); } } - return null; + return result === buildGradleContent ? null : result; } function updateLocalVariables( diff --git a/lib/manager/gradle/index.spec.ts b/lib/manager/gradle/index.spec.ts index a3cc67e177eaa9dc4d36592b0061c69c4a08444e..9c28b9c1fbac8703b43ec52c8232672374c8eb5f 100644 --- a/lib/manager/gradle/index.spec.ts +++ b/lib/manager/gradle/index.spec.ts @@ -389,6 +389,47 @@ describe(getName(__filename), () => { expect(execSnapshots).toMatchSnapshot(); }); + + it('should update dependencies in same file', async () => { + const execSnapshots = mockExecAll(exec, gradleOutput); + + const buildGradleContent = await fsExtra.readFile( + `${fixtures}/build.gradle.example1`, + 'utf8' + ); + + const upgrade = { + depGroup: 'org.apache.openjpa', + name: 'openjpa', + version: '3.1.1', + newValue: '3.1.2', + }; + + const buildGradleContentUpdated = manager.updateDependency({ + fileContent: buildGradleContent, + upgrade, + }); + + expect(buildGradleContent).not.toContain( + 'org.apache.openjpa:openjpa:3.1.2' + ); + + expect(buildGradleContentUpdated).not.toContain( + "dependency 'org.apache.openjpa:openjpa:3.1.1'" + ); + expect(buildGradleContentUpdated).not.toContain( + "dependency 'org.apache.openjpa:openjpa:3.1.1'" + ); + + expect(buildGradleContentUpdated).toContain( + "classpath 'org.apache.openjpa:openjpa:3.1.2'" + ); + expect(buildGradleContentUpdated).toContain( + "classpath 'org.apache.openjpa:openjpa:3.1.2'" + ); + + expect(execSnapshots).toMatchSnapshot(); + }); }); ifSystemSupportsGradle(6).describe('executeGradle integration', () => {