From 51619a6181204d52e81044865708e5df34536eb8 Mon Sep 17 00:00:00 2001 From: Sergio Zharinov <zharinov@users.noreply.github.com> Date: Sat, 18 Jul 2020 10:35:05 +0400 Subject: [PATCH] fix(gradle): Update same dependencies in single file (#6777) --- .../gradle/__fixtures__/build.gradle.example1 | 3 ++ .../gradle/__snapshots__/index.spec.ts.snap | 2 + lib/manager/gradle/build-gradle.ts | 19 ++++++--- lib/manager/gradle/index.spec.ts | 41 +++++++++++++++++++ 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/lib/manager/gradle/__fixtures__/build.gradle.example1 b/lib/manager/gradle/__fixtures__/build.gradle.example1 index e4a2854e79..5ba8e6206b 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 e9758e7b91..aaeec7a9ed 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 84ca91c2d4..8ab31dd107 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 a3cc67e177..9c28b9c1fb 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', () => { -- GitLab