diff --git a/plugin/src/main/java/org/openrewrite/gradle/AbstractRewriteTask.java b/plugin/src/main/java/org/openrewrite/gradle/AbstractRewriteTask.java index ddecf1501..84bf9e111 100755 --- a/plugin/src/main/java/org/openrewrite/gradle/AbstractRewriteTask.java +++ b/plugin/src/main/java/org/openrewrite/gradle/AbstractRewriteTask.java @@ -16,31 +16,41 @@ package org.openrewrite.gradle; import org.gradle.api.DefaultTask; +import org.gradle.api.file.ProjectLayout; +import org.gradle.api.provider.Provider; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.options.Option; +import org.gradle.util.GradleVersion; +import javax.inject.Inject; import java.io.File; import java.nio.file.Path; +import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public abstract class AbstractRewriteTask extends DefaultTask { - protected ResolveRewriteDependenciesTask resolveDependenciesTask; + protected Provider> resolvedDependencies; protected boolean dumpGcActivity; protected GradleProjectParser gpp; protected RewriteExtension extension; + protected AbstractRewriteTask() { + if (GradleVersion.current().compareTo(GradleVersion.version("7.4")) >= 0) { + notCompatibleWithConfigurationCache("org.openrewrite.rewrite needs to parse the whole project"); + } + } + public T setExtension(RewriteExtension extension) { this.extension = extension; //noinspection unchecked return (T) this; } - public T setResolveDependenciesTask(ResolveRewriteDependenciesTask resolveDependenciesTask) { - this.resolveDependenciesTask = resolveDependenciesTask; - this.dependsOn(resolveDependenciesTask); + public T setResolvedDependencies(Provider> resolvedDependencies) { + this.resolvedDependencies = resolvedDependencies; //noinspection unchecked return (T) this; } @@ -55,16 +65,25 @@ public boolean isDumpGcActivity() { return dumpGcActivity; } + @Inject + public ProjectLayout getProjectLayout() { + throw new AssertionError("unexpected; getProjectLayout() should be overridden by Gradle"); + } + @Internal protected T getProjectParser() { if (gpp == null) { if (extension == null) { throw new IllegalArgumentException("Must configure extension"); } - if (resolveDependenciesTask == null) { - throw new IllegalArgumentException("Must configure resolveDependenciesTask"); + if (resolvedDependencies == null) { + throw new IllegalArgumentException("Must configure resolvedDependencies"); + } + Set deps = resolvedDependencies.getOrNull(); + if (deps == null) { + deps = Collections.emptySet(); } - Set classpath = resolveDependenciesTask.getResolvedDependencies().stream() + Set classpath = deps.stream() .map(File::toPath) .collect(Collectors.toSet()); gpp = new DelegatingProjectParser(getProject(), extension, classpath); diff --git a/plugin/src/main/java/org/openrewrite/gradle/ResolveRewriteDependenciesTask.java b/plugin/src/main/java/org/openrewrite/gradle/ResolveRewriteDependenciesTask.java deleted file mode 100755 index edd36eae6..000000000 --- a/plugin/src/main/java/org/openrewrite/gradle/ResolveRewriteDependenciesTask.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright 2024 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.gradle.api.DefaultTask; -import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.Dependency; -import org.gradle.api.artifacts.dsl.DependencyHandler; -import org.gradle.api.attributes.Bundling; -import org.gradle.api.attributes.Category; -import org.gradle.api.attributes.LibraryElements; -import org.gradle.api.attributes.Usage; -import org.gradle.api.attributes.java.TargetJvmEnvironment; -import org.gradle.api.model.ObjectFactory; -import org.gradle.api.tasks.Internal; -import org.gradle.api.tasks.TaskAction; - -import java.io.File; -import java.util.Arrays; -import java.util.Set; -import java.util.stream.Stream; - -import static org.gradle.api.attributes.Bundling.BUNDLING_ATTRIBUTE; -import static org.gradle.api.attributes.java.TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE; - -public class ResolveRewriteDependenciesTask extends DefaultTask { - private Set resolvedDependencies; - private Configuration configuration; - protected RewriteExtension extension; - - public ResolveRewriteDependenciesTask setConfiguration(Configuration configuration) { - this.configuration = configuration; - return this; - } - - public ResolveRewriteDependenciesTask setExtension(RewriteExtension extension) { - this.extension = extension; - return this; - } - - @Internal - public Set getResolvedDependencies() { - if (resolvedDependencies == null) { - String rewriteVersion = extension.getRewriteVersion(); - Project project = getProject(); - DependencyHandler deps = project.getDependencies(); - Dependency[] dependencies = new Dependency[]{ - deps.create("org.openrewrite:rewrite-core:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-groovy:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-gradle:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-hcl:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-json:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-kotlin:" + extension.getRewriteKotlinVersion()), - deps.create("org.openrewrite:rewrite-java:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-java-21:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-java-17:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-java-11:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-java-8:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-maven:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-properties:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-protobuf:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-xml:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-yaml:" + rewriteVersion), - deps.create("org.openrewrite:rewrite-polyglot:" + extension.getRewritePolyglotVersion()), - deps.create("org.openrewrite.gradle.tooling:model:" + extension.getRewriteGradleModelVersion()), - - // This is an optional dependency of rewrite-java needed when projects also apply the checkstyle plugin - deps.create("com.puppycrawl.tools:checkstyle:" + extension.getCheckstyleToolsVersion()), - deps.create("com.fasterxml.jackson.module:jackson-module-kotlin:" + extension.getJacksonModuleKotlinVersion()), - deps.create("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:" + extension.getJacksonModuleKotlinVersion()) - }; - if (configuration != null) { - dependencies = Stream.concat( - Arrays.stream(dependencies), - configuration.getDependencies().stream() - ).toArray(Dependency[]::new); - } - // By using a detached configuration, we separate this dependency resolution from the rest of the project's - // configuration. This also means that Gradle has no criteria with which to select between variants of - // dependencies which expose differing capabilities. So those must be manually configured - Configuration detachedConf = project.getConfigurations().detachedConfiguration(dependencies); - - try { - ObjectFactory objectFactory = project.getObjects(); - detachedConf.attributes(attributes -> { - // Taken from org.gradle.api.plugins.jvm.internal.DefaultJvmEcosystemAttributesDetails - attributes.attribute(Category.CATEGORY_ATTRIBUTE, objectFactory.named(Category.class, Category.LIBRARY)); - attributes.attribute(Usage.USAGE_ATTRIBUTE, objectFactory.named(Usage.class, Usage.JAVA_RUNTIME)); - attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objectFactory.named(LibraryElements.class, LibraryElements.JAR)); - attributes.attribute(BUNDLING_ATTRIBUTE, objectFactory.named(Bundling.class, Bundling.EXTERNAL)); - attributes.attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, objectFactory.named(TargetJvmEnvironment.class, TargetJvmEnvironment.STANDARD_JVM)); - }); - } catch (NoClassDefFoundError e) { - // Old versions of gradle don't have all of these attributes and that's OK - } - - resolvedDependencies = detachedConf.resolve(); - } - return resolvedDependencies; - } - - @TaskAction - void run() { - getResolvedDependencies(); - } -} diff --git a/plugin/src/main/java/org/openrewrite/gradle/RewriteDryRunTask.java b/plugin/src/main/java/org/openrewrite/gradle/RewriteDryRunTask.java index 7b6536f74..f7e07aba5 100644 --- a/plugin/src/main/java/org/openrewrite/gradle/RewriteDryRunTask.java +++ b/plugin/src/main/java/org/openrewrite/gradle/RewriteDryRunTask.java @@ -22,17 +22,22 @@ import org.gradle.api.tasks.TaskAction; import javax.inject.Inject; -import java.io.File; +import java.nio.file.Path; public class RewriteDryRunTask extends AbstractRewriteTask { private static final Logger logger = Logging.getLogger(RewriteDryRunTask.class); - // This must return File, rather than Path. - // On Gradle 4.0 annotating something returning a Path with @OutputFile triggers a bug that deadlocks Gradle @OutputFile - public File getReportPath() { - return getProject().getLayout().getBuildDirectory().get().getAsFile().toPath().resolve("reports").resolve("rewrite").resolve("rewrite.patch").toFile(); + public Path getReportPath() { + return getProjectLayout() + .getBuildDirectory() + .get() + .getAsFile() + .toPath() + .resolve("reports") + .resolve("rewrite") + .resolve("rewrite.patch"); } @Inject @@ -44,6 +49,6 @@ public RewriteDryRunTask() { @TaskAction public void run() { - getProjectParser().dryRun(getReportPath().toPath(), dumpGcActivity, throwable -> logger.info("Error during rewrite dry run", throwable)); + getProjectParser().dryRun(getReportPath(), dumpGcActivity, throwable -> logger.info("Error during rewrite dry run", throwable)); } } diff --git a/plugin/src/main/java/org/openrewrite/gradle/RewritePlugin.java b/plugin/src/main/java/org/openrewrite/gradle/RewritePlugin.java index 415def3c0..9b983a02a 100644 --- a/plugin/src/main/java/org/openrewrite/gradle/RewritePlugin.java +++ b/plugin/src/main/java/org/openrewrite/gradle/RewritePlugin.java @@ -19,17 +19,31 @@ import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.dsl.DependencyHandler; +import org.gradle.api.attributes.Attribute; +import org.gradle.api.attributes.Bundling; +import org.gradle.api.attributes.Category; +import org.gradle.api.attributes.LibraryElements; +import org.gradle.api.attributes.Usage; +import org.gradle.api.attributes.java.TargetJvmEnvironment; +import org.gradle.api.model.ObjectFactory; import org.gradle.api.plugins.JavaBasePlugin; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.plugins.JavaPluginExtension; import org.gradle.api.plugins.quality.CheckstyleExtension; import org.gradle.api.plugins.quality.CheckstylePlugin; +import org.gradle.api.provider.Provider; import org.gradle.api.tasks.SourceSetContainer; import java.io.File; import java.util.Comparator; import java.util.HashSet; import java.util.Set; +import java.util.stream.Stream; + +import static org.gradle.api.attributes.Bundling.BUNDLING_ATTRIBUTE; +import static org.gradle.api.attributes.java.TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE; /** * When applied to the root project of a multi-project build, applies to all subprojects. @@ -41,6 +55,8 @@ @SuppressWarnings("unused") public class RewritePlugin implements Plugin { + private Set resolvedDependencies; + @Override public void apply(Project project) { boolean isRootProject = project == project.getRootProject(); @@ -56,25 +72,21 @@ public void apply(Project project) { // Rewrite module dependencies put here will be available to all rewrite tasks Configuration rewriteConf = project.getConfigurations().maybeCreate("rewrite"); - // We use this method of task creation because it works on old versions of Gradle - // Don't replace with TaskContainer.register() (introduced in 4.9), or another overload of create() (introduced in 4.7) - ResolveRewriteDependenciesTask resolveRewriteDependenciesTask = project.getTasks().create("rewriteResolveDependencies", ResolveRewriteDependenciesTask.class) - .setExtension(extension) - .setConfiguration(rewriteConf); + Provider> resolvedDependenciesProvider = project.provider(() -> getResolvedDependencies(project, extension, rewriteConf)); RewriteRunTask rewriteRun = project.getTasks().create("rewriteRun", RewriteRunTask.class) .setExtension(extension) - .setResolveDependenciesTask(resolveRewriteDependenciesTask); + .setResolvedDependencies(resolvedDependenciesProvider); rewriteRun.dependsOn(rewriteConf); RewriteDryRunTask rewriteDryRun = project.getTasks().create("rewriteDryRun", RewriteDryRunTask.class) .setExtension(extension) - .setResolveDependenciesTask(resolveRewriteDependenciesTask); + .setResolvedDependencies(resolvedDependenciesProvider); rewriteDryRun.dependsOn(rewriteConf); RewriteDiscoverTask rewriteDiscover = project.getTasks().create("rewriteDiscover", RewriteDiscoverTask.class) .setExtension(extension) - .setResolveDependenciesTask(resolveRewriteDependenciesTask); + .setResolvedDependencies(resolvedDependenciesProvider); rewriteDiscover.dependsOn(rewriteConf); if (isRootProject) { @@ -138,4 +150,69 @@ private static void configureProject(Project project, RewriteExtension extension })); }); } + + private Set getResolvedDependencies(Project project, RewriteExtension extension, Configuration rewriteConf) { + if (resolvedDependencies == null) { + Dependency[] dependencies = Stream.concat( + knownRewriteDependencies(extension, project.getDependencies()), + rewriteConf.getDependencies().stream() + ).toArray(Dependency[]::new); + // By using a detached configuration, we separate this dependency resolution from the rest of the project's + // configuration. This also means that Gradle has no criteria with which to select between variants of + // dependencies which expose differing capabilities. So those must be manually configured + Configuration detachedConf = project.getConfigurations().detachedConfiguration(dependencies); + + try { + ObjectFactory objectFactory = project.getObjects(); + detachedConf.attributes(attributes -> { + // Adapted from org.gradle.api.plugins.jvm.internal.DefaultJvmEcosystemAttributesDetails + attributes.attribute(Category.CATEGORY_ATTRIBUTE, objectFactory.named(Category.class, Category.LIBRARY)); + attributes.attribute(Usage.USAGE_ATTRIBUTE, objectFactory.named(Usage.class, Usage.JAVA_RUNTIME)); + attributes.attribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objectFactory.named(LibraryElements.class, LibraryElements.JAR)); + attributes.attribute(BUNDLING_ATTRIBUTE, objectFactory.named(Bundling.class, Bundling.EXTERNAL)); + try { + attributes.attribute(TARGET_JVM_ENVIRONMENT_ATTRIBUTE, objectFactory.named(TargetJvmEnvironment.class, TargetJvmEnvironment.STANDARD_JVM)); + } catch (NoClassDefFoundError e) { + // Old versions of Gradle don't have the class TargetJvmEnvironment and that's OK, we can always + // try this attribute instead + attributes.attribute(Attribute.of("org.gradle.jvm.environment", String.class), "standard-jvm"); + } + }); + } catch (NoClassDefFoundError e) { + // Old versions of Gradle don't have all of these attributes and that's OK + } + + resolvedDependencies = detachedConf.resolve(); + } + return resolvedDependencies; + } + + private static Stream knownRewriteDependencies(RewriteExtension extension, DependencyHandler deps) { + String rewriteVersion = extension.getRewriteVersion(); + return Stream.of( + deps.create("org.openrewrite:rewrite-core:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-groovy:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-gradle:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-hcl:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-json:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-kotlin:" + extension.getRewriteKotlinVersion()), + deps.create("org.openrewrite:rewrite-java:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-java-21:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-java-17:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-java-11:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-java-8:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-maven:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-properties:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-protobuf:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-xml:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-yaml:" + rewriteVersion), + deps.create("org.openrewrite:rewrite-polyglot:" + extension.getRewritePolyglotVersion()), + deps.create("org.openrewrite.gradle.tooling:model:" + extension.getRewriteGradleModelVersion()), + + // This is an optional dependency of rewrite-java needed when projects also apply the checkstyle plugin + deps.create("com.puppycrawl.tools:checkstyle:" + extension.getCheckstyleToolsVersion()), + deps.create("com.fasterxml.jackson.module:jackson-module-kotlin:" + extension.getJacksonModuleKotlinVersion()), + deps.create("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:" + extension.getJacksonModuleKotlinVersion()) + ); + } } diff --git a/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteDiscoverTest.kt b/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteDiscoverTest.kt index 1464c415b..b0a5e249e 100644 --- a/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteDiscoverTest.kt +++ b/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteDiscoverTest.kt @@ -18,12 +18,16 @@ package org.openrewrite.gradle import org.assertj.core.api.Assertions.assertThat import org.gradle.testkit.runner.TaskOutcome import org.junit.jupiter.api.Test +import org.junit.jupiter.api.condition.DisabledIf import org.junit.jupiter.api.io.TempDir +import org.openrewrite.Issue import java.io.File class RewriteDiscoverTest : RewritePluginTest { - // "https://github.com/openrewrite/rewrite-gradle-plugin/issues/33" + override fun taskName(): String = "rewriteDiscover" + + @Issue("https://github.com/openrewrite/rewrite-gradle-plugin/issues/33") @Test fun `rewriteDiscover prints recipes from external dependencies`( @TempDir projectDir: File @@ -55,8 +59,8 @@ class RewriteDiscoverTest : RewritePluginTest { """) } - val result = runGradle(projectDir, "rewriteDiscover") - val rewriteDiscoverResult = result.task(":rewriteDiscover")!! + val result = runGradle(projectDir, taskName()) + val rewriteDiscoverResult = result.task(":${taskName()}")!! assertThat(rewriteDiscoverResult.outcome).isEqualTo(TaskOutcome.SUCCESS) assertThat(result.output).contains("Configured with 2 active recipes and 1 active styles.") diff --git a/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteDryRunTest.kt b/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteDryRunTest.kt index 388f27168..486bf95ed 100644 --- a/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteDryRunTest.kt +++ b/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteDryRunTest.kt @@ -20,9 +20,13 @@ import org.gradle.testkit.runner.TaskOutcome import org.junit.jupiter.api.Test import org.junit.jupiter.api.condition.DisabledIf import org.junit.jupiter.api.io.TempDir +import org.openrewrite.Issue import java.io.File class RewriteDryRunTest : RewritePluginTest { + + override fun taskName(): String = "rewriteDryRun" + @Test fun `rewriteDryRun runs successfully without modifying source files`( @TempDir projectDir: File @@ -70,8 +74,8 @@ class RewriteDryRunTest : RewritePluginTest { java(helloWorld) } } - val result = runGradle(projectDir, "rewriteDryRun") - val rewriteDryRunResult = result.task(":rewriteDryRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteDryRunResult = result.task(":${taskName()}")!! assertThat(rewriteDryRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) assertThat(File(projectDir, "src/main/java/org/openrewrite/before/HelloWorld.java") @@ -119,8 +123,8 @@ class RewriteDryRunTest : RewritePluginTest { } } - val result = runGradle(projectDir, "rewriteDryRun", "-DactiveRecipe=org.openrewrite.java.OrderImports") - val rewriteDryRunResult = result.task(":rewriteDryRun")!! + val result = runGradle(projectDir, taskName(), "-DactiveRecipe=org.openrewrite.java.OrderImports") + val rewriteDryRunResult = result.task(":${taskName()}")!! assertThat(rewriteDryRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) assertThat(File(projectDir, "build/reports/rewrite/rewrite.patch").exists()).isTrue } @@ -188,10 +192,38 @@ class RewriteDryRunTest : RewritePluginTest { """) } } - val result = runGradle(projectDir, "rewriteDryRun", "-DactiveRecipe=org.openrewrite.kotlin.FindKotlinSources") - val rewriteDryRunResult = result.task(":rewriteDryRun")!! + val result = runGradle(projectDir, taskName(), "-DactiveRecipe=org.openrewrite.kotlin.FindKotlinSources") + val rewriteDryRunResult = result.task(":${taskName()}")!! assertThat(rewriteDryRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) assertThat(File(projectDir, "build/reports/rewrite/rewrite.patch").exists()).isTrue } + + // The configuration cache works on Gradle 6.6+, but rewrite-gradle-plugin uses notCompatibleWithConfigurationCache, + // which is only available on Gradle 7.4+. + @DisabledIf("lessThanGradle7_4") + @Issue("https://github.com/openrewrite/rewrite-gradle-plugin/issues/227") + @Test + fun `rewriteDryRun is compatible with the configuration cache`( + @TempDir projectDir: File + ) { + gradleProject(projectDir) { + buildGradle(""" + plugins { + id("org.openrewrite.rewrite") + } + + repositories { + mavenLocal() + mavenCentral() + maven { + url = uri("https://oss.sonatype.org/content/repositories/snapshots") + } + } + """) + } + val result = runGradle(projectDir, taskName(), "--configuration-cache") + val rewriteDryRunResult = result.task(":${taskName()}")!! + assertThat(rewriteDryRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) + } } diff --git a/plugin/src/test/kotlin/org/openrewrite/gradle/RewritePluginTest.kt b/plugin/src/test/kotlin/org/openrewrite/gradle/RewritePluginTest.kt index 27de5a3eb..38f60299b 100644 --- a/plugin/src/test/kotlin/org/openrewrite/gradle/RewritePluginTest.kt +++ b/plugin/src/test/kotlin/org/openrewrite/gradle/RewritePluginTest.kt @@ -15,9 +15,15 @@ */ package org.openrewrite.gradle +import org.assertj.core.api.Assertions.assertThat import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner +import org.gradle.testkit.runner.TaskOutcome import org.gradle.util.GradleVersion +import org.junit.jupiter.api.Test +import org.junit.jupiter.api.condition.DisabledIf +import org.junit.jupiter.api.io.TempDir +import org.openrewrite.Issue import java.io.File import java.lang.management.ManagementFactory @@ -25,6 +31,8 @@ val gradleVersion: String? = System.getProperty("org.openrewrite.test.gradleVers interface RewritePluginTest { + fun taskName(): String + fun runGradle(testDir: File, vararg args: String): BuildResult = GradleRunner.create() .withDebug(ManagementFactory.getRuntimeMXBean().inputArguments.toString().indexOf("-agentlib:jdwp") > 0) @@ -39,7 +47,6 @@ interface RewritePluginTest { .forwardOutput() .build() - fun lessThanGradle6_1(): Boolean { val currentVersion = if (gradleVersion == null) GradleVersion.current() else GradleVersion.version(gradleVersion) return currentVersion < GradleVersion.version("6.1") @@ -49,4 +56,37 @@ interface RewritePluginTest { val currentVersion = if (gradleVersion == null) GradleVersion.current() else GradleVersion.version(gradleVersion) return currentVersion < GradleVersion.version("6.8") } + + fun lessThanGradle7_4(): Boolean { + val currentVersion = if (gradleVersion == null) GradleVersion.current() else GradleVersion.version(gradleVersion) + return currentVersion < GradleVersion.version("7.4") + } + + // The configuration cache works on Gradle 6.6+, but rewrite-gradle-plugin uses notCompatibleWithConfigurationCache, + // which is only available on Gradle 7.4+. + @DisabledIf("lessThanGradle7_4") + @Issue("https://github.com/openrewrite/rewrite-gradle-plugin/issues/227") + @Test + fun `task is compatible with the configuration cache`( + @TempDir projectDir: File + ) { + gradleProject(projectDir) { + buildGradle(""" + plugins { + id("org.openrewrite.rewrite") + } + + repositories { + mavenLocal() + mavenCentral() + maven { + url = uri("https://oss.sonatype.org/content/repositories/snapshots") + } + } + """) + } + val result = runGradle(projectDir, taskName(), "--configuration-cache") + val taskResult = result.task(":${taskName()}")!! + assertThat(taskResult.outcome).isEqualTo(TaskOutcome.SUCCESS) + } } diff --git a/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteResolveDependenciesTest.kt b/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteResolveDependenciesTest.kt deleted file mode 100644 index 59a08308e..000000000 --- a/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteResolveDependenciesTest.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2024 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.assertj.core.api.Assertions.assertThat -import org.gradle.testkit.runner.TaskOutcome -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.io.TempDir -import java.io.File - -class RewriteResolveDependenciesTest : RewritePluginTest { - @Test - fun `Specifying a rewriteVersion does not cause build failures`( - @TempDir projectDir: File - ) { - gradleProject(projectDir) { - buildGradle(""" - plugins { - id("java") - id("org.openrewrite.rewrite") - } - - repositories { - mavenLocal() - mavenCentral() - maven { - url = uri("https://oss.sonatype.org/content/repositories/snapshots") - } - } - - rewrite { - rewriteVersion = "8.8.0" - } - """) - } - - val result = runGradle(projectDir, "rewriteResolveDependencies") - val rewriteDryRunResult = result.task(":rewriteResolveDependencies")!! - assertThat(rewriteDryRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) - } - -} diff --git a/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteRunTest.kt b/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteRunTest.kt index 0b1083d03..59053d426 100644 --- a/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteRunTest.kt +++ b/plugin/src/test/kotlin/org/openrewrite/gradle/RewriteRunTest.kt @@ -33,6 +33,8 @@ import java.nio.file.Path class RewriteRunTest : RewritePluginTest { + override fun taskName(): String = "rewriteRun" + @Test fun `rewrite is isolated from conflicting versions of jackson on the classpath`( @TempDir projectDir: File @@ -81,8 +83,8 @@ class RewriteRunTest : RewritePluginTest { } } - val buildResult = runGradle(projectDir, "rewriteRun") - val taskResult = buildResult.task(":rewriteRun")!! + val buildResult = runGradle(projectDir, taskName()) + val taskResult = buildResult.task(":${taskName()}")!! assertThat(taskResult.outcome).isEqualTo(TaskOutcome.SUCCESS) } @@ -131,8 +133,8 @@ class RewriteRunTest : RewritePluginTest { } } assertThat(File(projectDir, "build.gradle").exists()).isTrue - val buildResult = runGradle(projectDir, "rewriteRun") - val taskResult = buildResult.task(":rewriteRun")!! + val buildResult = runGradle(projectDir, taskName()) + val taskResult = buildResult.task(":${taskName()}")!! assertThat(taskResult.outcome).isEqualTo(TaskOutcome.SUCCESS) @@ -317,8 +319,8 @@ class RewriteRunTest : RewritePluginTest { } } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) //language=java val aTestClassExpected = """ @@ -394,8 +396,8 @@ class RewriteRunTest : RewritePluginTest { } commitFilesToGitRepo(projectDir) - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val propertiesFile = File(projectDir, "a/src/main/resources/test.properties") @@ -456,8 +458,8 @@ class RewriteRunTest : RewritePluginTest { } } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val aFile = File(projectDir, "src/main/java/com/foo/A.java") @@ -514,8 +516,8 @@ class RewriteRunTest : RewritePluginTest { propertiesFile("in-sourceset.properties", "sam=true\n") } } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val propertiesTextExpected = "samuel=true\n" @@ -557,8 +559,8 @@ class RewriteRunTest : RewritePluginTest { """) } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val gradlew = File(projectDir, "gradlew") @@ -624,8 +626,8 @@ class RewriteRunTest : RewritePluginTest { """) } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) assertThat(projectDir.resolve("build.gradle").readText()) @@ -703,8 +705,8 @@ class RewriteRunTest : RewritePluginTest { """) } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) assertThat(projectDir.resolve("build.gradle").readText()) @@ -770,8 +772,8 @@ class RewriteRunTest : RewritePluginTest { """) } } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val aFile = projectDir.resolve("src/main/java/com/foo/A.java") @@ -839,8 +841,8 @@ class RewriteRunTest : RewritePluginTest { """) } } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val aFile = projectDir.resolve("src/main/java/com/foo/A.java") @@ -926,8 +928,8 @@ class RewriteRunTest : RewritePluginTest { } } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val bFile = projectDir.resolve("src/main/groovy/com/foo/B.groovy") @@ -987,8 +989,8 @@ class RewriteRunTest : RewritePluginTest { } } - val result = runGradle(projectDir, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val aFile = projectDir.resolve("src/main/kotlin/com/foo/A.kt") @@ -1052,8 +1054,8 @@ class RewriteRunTest : RewritePluginTest { } } - val result = runGradle(buildRoot, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(buildRoot, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val javaFile = buildRoot.resolve("src/main/java/org/openrewrite/before/HelloWorld.java") assertThat(javaFile.readText()) @@ -1132,7 +1134,7 @@ class RewriteRunTest : RewritePluginTest { } } - val result = runGradle(projectDir, "rewriteRun") + val result = runGradle(projectDir, taskName()) val rewriteRunResult = result.task(":product:rewriteRun")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) @@ -1203,8 +1205,8 @@ class RewriteRunTest : RewritePluginTest { } } - val result = runGradle(buildRoot, "rewriteRun") - val rewriteRunResult = result.task(":rewriteRun")!! + val result = runGradle(buildRoot, taskName()) + val rewriteRunResult = result.task(":${taskName()}")!! assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) val javaFile = buildRoot.resolve("src/test/java/com/foo/ATest.java") assertThat(javaFile.readText()) @@ -1326,8 +1328,8 @@ class RewriteRunTest : RewritePluginTest { propertyKey: distributionUrl """.trimIndent()) } - val result = runGradle(projectDir, "rewriteRun") - val task = result.task(":rewriteRun")!! + val result = runGradle(projectDir, taskName()) + val task = result.task(":${taskName()}")!! assertThat(task.outcome).isEqualTo(TaskOutcome.SUCCESS) val propertiesFile = projectDir.resolve("gradle/wrapper/gradle-wrapper.properties") assertThat(propertiesFile.readText()) @@ -1340,4 +1342,31 @@ class RewriteRunTest : RewritePluginTest { """.trimIndent() ) } + + // The configuration cache works on Gradle 6.6+, but rewrite-gradle-plugin uses notCompatibleWithConfigurationCache, + // which is only available on Gradle 7.4+. + @DisabledIf("lessThanGradle7_4") + @Issue("https://github.com/openrewrite/rewrite-gradle-plugin/issues/227") + @Test + fun `rewriteRun is compatible with the configuration cache`( + @TempDir projectDir: File + ) { + gradleProject(projectDir) { + buildGradle(""" + plugins { + id("org.openrewrite.rewrite") + } + repositories { + mavenLocal() + mavenCentral() + maven { + url = uri("https://oss.sonatype.org/content/repositories/snapshots") + } + } + """) + } + val result = runGradle(projectDir, taskName(), "--configuration-cache") + val rewriteRunResult = result.task(":${taskName()}")!! + assertThat(rewriteRunResult.outcome).isEqualTo(TaskOutcome.SUCCESS) + } }