From b2e006e2dcd07b54787f3c2a59d309342ce0a46c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 2 Jul 2025 20:14:23 +0000 Subject: [PATCH 1/3] Initial plan From 736089c2ed5a9ea4a67fccb658ac1bf94c783c2d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 2 Jul 2025 20:25:42 +0000 Subject: [PATCH 2/3] Remove automatic java plugin application for Android compatibility Co-authored-by: obecker <197628+obecker@users.noreply.github.com> --- plugin-gradle/demo/allowed.gradle | 1 + plugin-gradle/demo/cycle.gradle | 1 + plugin-gradle/demo/default.gradle | 1 + plugin-gradle/demo/disallowed.gradle | 1 + plugin-gradle/demo/error-ignoring-list.gradle | 1 + plugin-gradle/demo/error-ignoring-map.gradle | 1 + plugin-gradle/demo/error-illegal-pattern.gradle | 1 + plugin-gradle/demo/error-missing-pattern.gradle | 1 + plugin-gradle/demo/ignoreFailures.gradle | 1 + plugin-gradle/demo/ignoring-from.gradle | 1 + plugin-gradle/demo/ignoring-kt.gradle.kts | 1 + plugin-gradle/demo/ignoring-to.gradle | 1 + plugin-gradle/demo/ignoring.gradle | 1 + plugin-gradle/demo/multiple.gradle | 1 + plugin-gradle/demo/reportsDisabled.gradle | 1 + plugin-gradle/demo/slices-cycle.gradle | 1 + plugin-gradle/demo/source-sets.gradle | 1 + plugin-gradle/demo/success.gradle | 1 + plugin-gradle/demo/test-sources-kt.gradle.kts | 1 + plugin-gradle/demo/test-sources.gradle | 1 + .../groovy/de/obqo/decycle/gradle/DecyclePlugin.groovy | 8 +++++++- .../de/obqo/decycle/gradle/DecyclePluginUnitTest.java | 1 + 22 files changed, 28 insertions(+), 1 deletion(-) diff --git a/plugin-gradle/demo/allowed.gradle b/plugin-gradle/demo/allowed.gradle index 7f199ee..ced34ef 100644 --- a/plugin-gradle/demo/allowed.gradle +++ b/plugin-gradle/demo/allowed.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/cycle.gradle b/plugin-gradle/demo/cycle.gradle index d145e09..b36e234 100644 --- a/plugin-gradle/demo/cycle.gradle +++ b/plugin-gradle/demo/cycle.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/default.gradle b/plugin-gradle/demo/default.gradle index 8e32460..7db6793 100644 --- a/plugin-gradle/demo/default.gradle +++ b/plugin-gradle/demo/default.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } // should detect the cycle between demo.cycle.a and demo.cycle.b without any custom configuration diff --git a/plugin-gradle/demo/disallowed.gradle b/plugin-gradle/demo/disallowed.gradle index e9d68e4..6704a67 100644 --- a/plugin-gradle/demo/disallowed.gradle +++ b/plugin-gradle/demo/disallowed.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/error-ignoring-list.gradle b/plugin-gradle/demo/error-ignoring-list.gradle index 3cf53ee..f28f2c9 100644 --- a/plugin-gradle/demo/error-ignoring-list.gradle +++ b/plugin-gradle/demo/error-ignoring-list.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/error-ignoring-map.gradle b/plugin-gradle/demo/error-ignoring-map.gradle index 0ea3bca..17e10e5 100644 --- a/plugin-gradle/demo/error-ignoring-map.gradle +++ b/plugin-gradle/demo/error-ignoring-map.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/error-illegal-pattern.gradle b/plugin-gradle/demo/error-illegal-pattern.gradle index e118701..143bf62 100644 --- a/plugin-gradle/demo/error-illegal-pattern.gradle +++ b/plugin-gradle/demo/error-illegal-pattern.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/error-missing-pattern.gradle b/plugin-gradle/demo/error-missing-pattern.gradle index 960d91a..d83ce4a 100644 --- a/plugin-gradle/demo/error-missing-pattern.gradle +++ b/plugin-gradle/demo/error-missing-pattern.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/ignoreFailures.gradle b/plugin-gradle/demo/ignoreFailures.gradle index 58aa264..771793a 100644 --- a/plugin-gradle/demo/ignoreFailures.gradle +++ b/plugin-gradle/demo/ignoreFailures.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/ignoring-from.gradle b/plugin-gradle/demo/ignoring-from.gradle index 927e96c..6510765 100644 --- a/plugin-gradle/demo/ignoring-from.gradle +++ b/plugin-gradle/demo/ignoring-from.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/ignoring-kt.gradle.kts b/plugin-gradle/demo/ignoring-kt.gradle.kts index ed17b85..cb3b4d4 100644 --- a/plugin-gradle/demo/ignoring-kt.gradle.kts +++ b/plugin-gradle/demo/ignoring-kt.gradle.kts @@ -1,4 +1,5 @@ plugins { + id("java") id("de.obqo.decycle") } diff --git a/plugin-gradle/demo/ignoring-to.gradle b/plugin-gradle/demo/ignoring-to.gradle index e4f06e3..d6c59f9 100644 --- a/plugin-gradle/demo/ignoring-to.gradle +++ b/plugin-gradle/demo/ignoring-to.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/ignoring.gradle b/plugin-gradle/demo/ignoring.gradle index 0a5b765..09114e9 100644 --- a/plugin-gradle/demo/ignoring.gradle +++ b/plugin-gradle/demo/ignoring.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/multiple.gradle b/plugin-gradle/demo/multiple.gradle index e3726bf..fc4e314 100644 --- a/plugin-gradle/demo/multiple.gradle +++ b/plugin-gradle/demo/multiple.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/reportsDisabled.gradle b/plugin-gradle/demo/reportsDisabled.gradle index 3e105e1..1de08ef 100644 --- a/plugin-gradle/demo/reportsDisabled.gradle +++ b/plugin-gradle/demo/reportsDisabled.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/slices-cycle.gradle b/plugin-gradle/demo/slices-cycle.gradle index 99f0cc6..d5d1a93 100644 --- a/plugin-gradle/demo/slices-cycle.gradle +++ b/plugin-gradle/demo/slices-cycle.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/source-sets.gradle b/plugin-gradle/demo/source-sets.gradle index 556431b..cb1b405 100644 --- a/plugin-gradle/demo/source-sets.gradle +++ b/plugin-gradle/demo/source-sets.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/success.gradle b/plugin-gradle/demo/success.gradle index 2dcad41..bb2bbba 100644 --- a/plugin-gradle/demo/success.gradle +++ b/plugin-gradle/demo/success.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/demo/test-sources-kt.gradle.kts b/plugin-gradle/demo/test-sources-kt.gradle.kts index 3ed5e6f..b1ccf4c 100644 --- a/plugin-gradle/demo/test-sources-kt.gradle.kts +++ b/plugin-gradle/demo/test-sources-kt.gradle.kts @@ -1,4 +1,5 @@ plugins { + id("java") id("de.obqo.decycle") } diff --git a/plugin-gradle/demo/test-sources.gradle b/plugin-gradle/demo/test-sources.gradle index 2601218..b0caecc 100644 --- a/plugin-gradle/demo/test-sources.gradle +++ b/plugin-gradle/demo/test-sources.gradle @@ -1,4 +1,5 @@ plugins { + id 'java' id 'de.obqo.decycle' } diff --git a/plugin-gradle/src/main/groovy/de/obqo/decycle/gradle/DecyclePlugin.groovy b/plugin-gradle/src/main/groovy/de/obqo/decycle/gradle/DecyclePlugin.groovy index 4725c3a..ce119d4 100644 --- a/plugin-gradle/src/main/groovy/de/obqo/decycle/gradle/DecyclePlugin.groovy +++ b/plugin-gradle/src/main/groovy/de/obqo/decycle/gradle/DecyclePlugin.groovy @@ -14,7 +14,6 @@ class DecyclePlugin implements Plugin { @Override void apply(final Project project) { - project.apply plugin: 'java' Properties props = new Properties() getClass().classLoader.getResource("META-INF/gradle-plugins/de.obqo.decycle.properties").withInputStream { stream -> @@ -35,6 +34,13 @@ class DecyclePlugin implements Plugin { workerClasspath.setDescription("The Decycle libraries to be used for this project") project.afterEvaluate { + // Ensure that a compatible plugin (java, java-library, android, etc.) is applied + if (!project.hasProperty('sourceSets')) { + throw new org.gradle.api.GradleException( + "Decycle plugin requires a plugin that provides source sets (e.g., 'java', 'java-library', or Android plugins). " + + "Please apply one of these plugins before applying the decycle plugin." + ) + } project.dependencies { decycle "de.obqo.decycle:decycle-lib:${toolVersion}" diff --git a/plugin-gradle/src/test/java/de/obqo/decycle/gradle/DecyclePluginUnitTest.java b/plugin-gradle/src/test/java/de/obqo/decycle/gradle/DecyclePluginUnitTest.java index 2e88be6..4a1bb54 100644 --- a/plugin-gradle/src/test/java/de/obqo/decycle/gradle/DecyclePluginUnitTest.java +++ b/plugin-gradle/src/test/java/de/obqo/decycle/gradle/DecyclePluginUnitTest.java @@ -15,6 +15,7 @@ public class DecyclePluginUnitTest { @Test void pluginShouldAddTaskAndExtension() { Project project = ProjectBuilder.builder().build(); + project.getPluginManager().apply("java"); project.getPluginManager().apply("de.obqo.decycle"); assertThat(project.getTasks().getByName("decycle")).isInstanceOf(Task.class); From cda736a58f4d2bdb6b08e4ebe72ff6bd99df7b44 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 2 Jul 2025 20:28:56 +0000 Subject: [PATCH 3/3] Add test for Android compatibility and validation error handling Co-authored-by: obecker <197628+obecker@users.noreply.github.com> --- plugin-gradle/demo/error-no-java-plugin.gradle | 8 ++++++++ .../obqo/decycle/gradle/DecyclePluginFunctionalTest.java | 7 +++++++ 2 files changed, 15 insertions(+) create mode 100644 plugin-gradle/demo/error-no-java-plugin.gradle diff --git a/plugin-gradle/demo/error-no-java-plugin.gradle b/plugin-gradle/demo/error-no-java-plugin.gradle new file mode 100644 index 0000000..71f8f45 --- /dev/null +++ b/plugin-gradle/demo/error-no-java-plugin.gradle @@ -0,0 +1,8 @@ +plugins { + id 'de.obqo.decycle' +} + +// This simulates a project without the java plugin - it should fail with a meaningful error +decycle { + excluding 'demo.cycle.**' +} \ No newline at end of file diff --git a/plugin-gradle/src/test/java/de/obqo/decycle/gradle/DecyclePluginFunctionalTest.java b/plugin-gradle/src/test/java/de/obqo/decycle/gradle/DecyclePluginFunctionalTest.java index ed0cc32..1b2d406 100644 --- a/plugin-gradle/src/test/java/de/obqo/decycle/gradle/DecyclePluginFunctionalTest.java +++ b/plugin-gradle/src/test/java/de/obqo/decycle/gradle/DecyclePluginFunctionalTest.java @@ -239,4 +239,11 @@ void shouldCachePreviousRun() { // then assertBuildResult(upToDateResult, TaskOutcome.UP_TO_DATE, "decycleMain"); } + + @Test + void shouldFailWhenNoCompatiblePluginApplied() { + final BuildResult result = buildAndFail("error-no-java-plugin.gradle"); + assertBuildResult(result, TaskOutcome.FAILED, null) + .contains("Decycle plugin requires a plugin that provides source sets"); + } }