From eefcfeacc5520b040cc769cde2f2822ad44864a7 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 3 May 2026 13:42:10 +0200 Subject: [PATCH 1/3] Fix AddDependency no-op when libs.versions.toml is present on Gradle 9 The `withToolingApi` test helper was mutating `projectDir` to the `gradle/` subdirectory whenever it saw a `gradle/libs.versions.toml` source file. On Gradle 8.x the `-b` flag still pointed the daemon at the real build script, masking the bug; on Gradle 9.x the flag was removed and the daemon evaluated the wrong directory, returning a GradleProject whose `nameToConfiguration` was empty. AddDependency then silently no-opped because `getConfiguration("compileOnly")` returned null. - Drop the projectDir mutation: `gradle/libs.versions.toml` is a catalog inside the existing project, not a project-root marker. - AddDependencyVisitor now emits a `Markup.warn` listing available configurations instead of silently swallowing unknown-configuration cases, so future shape mismatches surface. - Add AddDependencyGradle9CatalogTest covering Gradle 9.0.0 and 8.14.3 with the catalog present. Fixes #7548 --- .../gradle/toolingapi/Assertions.java | 3 - .../gradle/AddDependencyVisitor.java | 8 +- .../AddDependencyGradle9CatalogTest.java | 116 ++++++++++++++++++ 3 files changed, 123 insertions(+), 4 deletions(-) create mode 100644 rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java diff --git a/rewrite-gradle-tooling-model/model/src/main/java/org/openrewrite/gradle/toolingapi/Assertions.java b/rewrite-gradle-tooling-model/model/src/main/java/org/openrewrite/gradle/toolingapi/Assertions.java index f398470c99d..3f0630fca2a 100644 --- a/rewrite-gradle-tooling-model/model/src/main/java/org/openrewrite/gradle/toolingapi/Assertions.java +++ b/rewrite-gradle-tooling-model/model/src/main/java/org/openrewrite/gradle/toolingapi/Assertions.java @@ -102,9 +102,6 @@ public static UncheckedConsumer> withToolingApi(@Nullable Gradl Toml.Document d = (Toml.Document) sourceFile; if (d.getSourcePath().startsWith("gradle/") && d.getSourcePath().toString().endsWith(".versions.toml")) { Path versionCatalog = tempDirectory.resolve(d.getSourcePath()); - if (!tempDirectory.equals(versionCatalog.getParent()) && tempDirectory.equals(versionCatalog.getParent().getParent())) { - projectDir = versionCatalog.getParent(); - } Files.createDirectories(versionCatalog.getParent()); Files.write(versionCatalog, d.printAllAsBytes()); } diff --git a/rewrite-gradle/src/main/java/org/openrewrite/gradle/AddDependencyVisitor.java b/rewrite-gradle/src/main/java/org/openrewrite/gradle/AddDependencyVisitor.java index be762ea59fe..6c6b57760a8 100644 --- a/rewrite-gradle/src/main/java/org/openrewrite/gradle/AddDependencyVisitor.java +++ b/rewrite-gradle/src/main/java/org/openrewrite/gradle/AddDependencyVisitor.java @@ -27,6 +27,7 @@ import org.openrewrite.java.tree.J; import org.openrewrite.java.tree.JavaSourceFile; import org.openrewrite.kotlin.tree.K; +import org.openrewrite.marker.Markup; import org.openrewrite.maven.MavenDownloadingException; import org.openrewrite.maven.table.MavenMetadataFailures; import org.openrewrite.maven.tree.GroupArtifact; @@ -80,7 +81,12 @@ public class AddDependencyVisitor extends JavaIsoVisitor { } GradleDependencyConfiguration gdc = gradleProject.getConfiguration(configuration); - if (gdc == null || gdc.findRequestedDependency(groupId, artifactId) != null) { + if (gdc == null) { + return Markup.warn(sourceFile, new IllegalStateException( + "GradleProject has no configuration named '" + configuration + + "'. Available configurations: " + gradleProject.getNameToConfiguration().keySet())); + } + if (gdc.findRequestedDependency(groupId, artifactId) != null) { return sourceFile; } diff --git a/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java b/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java new file mode 100644 index 00000000000..5b99c8e3b7c --- /dev/null +++ b/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java @@ -0,0 +1,116 @@ +/* + * Copyright 2026 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.openrewrite.gradle; + +import org.junit.jupiter.api.Test; +import org.openrewrite.Issue; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.gradle.Assertions.buildGradleKts; +import static org.openrewrite.gradle.toolingapi.Assertions.withToolingApi; +import static org.openrewrite.toml.Assertions.toml; + +@Issue("https://github.com/openrewrite/rewrite/issues/7548") +class AddDependencyGradle9CatalogTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipe(new AddDependency( + "org.projectlombok", "lombok", "1.18.44", + null, "compileOnly", null, + null, null, null, Boolean.TRUE + )); + } + + @Test + void gradle9_catalogPresent_addDependencyShouldEditBuildKts() { + rewriteRun( + spec -> spec.beforeRecipe(withToolingApi("9.0.0")), + toml( + """ + [versions] + lombok = "1.18.44" + + [libraries] + lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" } + """, + spec -> spec.path("gradle/libs.versions.toml") + ), + buildGradleKts( + """ + plugins { + java + } + repositories { + mavenCentral() + } + """, + """ + plugins { + java + } + repositories { + mavenCentral() + } + + dependencies { + compileOnly("org.projectlombok:lombok:1.18.44") + } + """ + ) + ); + } + + @Test + void gradle8_catalogPresent_addDependencyEditsBuildKts() { + rewriteRun( + spec -> spec.beforeRecipe(withToolingApi("8.14.3")), + toml( + """ + [versions] + lombok = "1.18.44" + + [libraries] + lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" } + """, + spec -> spec.path("gradle/libs.versions.toml") + ), + buildGradleKts( + """ + plugins { + java + } + repositories { + mavenCentral() + } + """, + """ + plugins { + java + } + repositories { + mavenCentral() + } + + dependencies { + compileOnly("org.projectlombok:lombok:1.18.44") + } + """ + ) + ); + } +} From d26e556347cb852c0f3b56a9ac3fbcda86c30d8d Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 3 May 2026 14:29:27 +0200 Subject: [PATCH 2/3] Use stable lombok 1.18.30 in regression test OpenRewrite's MavenPomDownloader was getting an HTTP 404 for lombok 1.18.44 in CI, even though the artifact exists. Use a long-stable version to avoid transient resolution flakes. --- .../gradle/AddDependencyGradle9CatalogTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java b/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java index 5b99c8e3b7c..d034cbc14e2 100644 --- a/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java +++ b/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java @@ -30,7 +30,7 @@ class AddDependencyGradle9CatalogTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { spec.recipe(new AddDependency( - "org.projectlombok", "lombok", "1.18.44", + "org.projectlombok", "lombok", "1.18.30", null, "compileOnly", null, null, null, null, Boolean.TRUE )); @@ -43,7 +43,7 @@ void gradle9_catalogPresent_addDependencyShouldEditBuildKts() { toml( """ [versions] - lombok = "1.18.44" + lombok = "1.18.30" [libraries] lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" } @@ -68,7 +68,7 @@ void gradle9_catalogPresent_addDependencyShouldEditBuildKts() { } dependencies { - compileOnly("org.projectlombok:lombok:1.18.44") + compileOnly("org.projectlombok:lombok:1.18.30") } """ ) @@ -82,7 +82,7 @@ void gradle8_catalogPresent_addDependencyEditsBuildKts() { toml( """ [versions] - lombok = "1.18.44" + lombok = "1.18.30" [libraries] lombok = { module = "org.projectlombok:lombok", version.ref = "lombok" } @@ -107,7 +107,7 @@ void gradle8_catalogPresent_addDependencyEditsBuildKts() { } dependencies { - compileOnly("org.projectlombok:lombok:1.18.44") + compileOnly("org.projectlombok:lombok:1.18.30") } """ ) From 7940c80d2ef50cdee7f381bb93f6c74903488ff2 Mon Sep 17 00:00:00 2001 From: Tim te Beek Date: Sun, 3 May 2026 17:17:20 +0200 Subject: [PATCH 3/3] Skip POM download in regression test CI runners are intermittently getting HTTP 404 from Maven Central for stable artifacts (also affects main). Pass version=null so AddDependency does not invoke MavenPomDownloader. The bug under test is about the recipe making no change at all when libs.versions.toml is present on Gradle 9, so the dependency version is incidental. --- .../gradle/AddDependencyGradle9CatalogTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java b/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java index d034cbc14e2..3b2e52266cd 100644 --- a/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java +++ b/rewrite-gradle/src/test/java/org/openrewrite/gradle/AddDependencyGradle9CatalogTest.java @@ -29,8 +29,11 @@ class AddDependencyGradle9CatalogTest implements RewriteTest { @Override public void defaults(RecipeSpec spec) { + // version=null avoids triggering MavenPomDownloader; the bug was about the + // recipe not making any change at all when libs.versions.toml is present on + // Gradle 9, so the version itself is incidental. spec.recipe(new AddDependency( - "org.projectlombok", "lombok", "1.18.30", + "org.projectlombok", "lombok", null, null, "compileOnly", null, null, null, null, Boolean.TRUE )); @@ -68,7 +71,7 @@ void gradle9_catalogPresent_addDependencyShouldEditBuildKts() { } dependencies { - compileOnly("org.projectlombok:lombok:1.18.30") + compileOnly("org.projectlombok:lombok") } """ ) @@ -107,7 +110,7 @@ void gradle8_catalogPresent_addDependencyEditsBuildKts() { } dependencies { - compileOnly("org.projectlombok:lombok:1.18.30") + compileOnly("org.projectlombok:lombok") } """ )