diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 99340b4a..28861d27 100755 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ea720f98..115e6ac0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-bin.zip diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessPlugin.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessPlugin.java index c4f00ef5..e53cf44c 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessPlugin.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessPlugin.java @@ -15,17 +15,17 @@ */ package com.diffplug.gradle.spotless; +import com.diffplug.spotless.SpotlessCache; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import groovy.lang.Closure; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.execution.TaskExecutionGraph; import org.gradle.api.plugins.BasePlugin; import org.gradle.api.plugins.JavaBasePlugin; - -import com.diffplug.spotless.SpotlessCache; - -import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; -import groovy.lang.Closure; +import org.gradle.api.tasks.TaskContainer; +import org.gradle.api.tasks.TaskProvider; public class SpotlessPlugin implements Plugin { SpotlessExtension spotlessExtension; @@ -47,38 +47,63 @@ public class SpotlessPlugin implements Plugin { spotlessExtension = project.getExtensions().create(EXTENSION, SpotlessExtension.class, project); // after the project has been evaluated, configure the check and format tasks per source set - project.afterEvaluate(this::createTasks); +// project.afterEvaluate(this::createTasks); + createTasks(project); } - /** The extension for this plugin. */ + /** + * The extension for this plugin. + */ public SpotlessExtension getExtension() { return spotlessExtension; } @SuppressWarnings("rawtypes") void createTasks(Project project) { - Task rootCheckTask = project.task(EXTENSION + CHECK); - rootCheckTask.setGroup(TASK_GROUP); - rootCheckTask.setDescription(CHECK_DESCRIPTION); - Task rootApplyTask = project.task(EXTENSION + APPLY); - rootApplyTask.setGroup(TASK_GROUP); - rootApplyTask.setDescription(APPLY_DESCRIPTION); + final TaskContainer tasks = project.getTasks(); + TaskProvider rootCheckTask = tasks.register(EXTENSION + CHECK); + rootCheckTask.configure(task -> { + task.getLogger().lifecycle("{}:{}", task.getProject(), task.getName()); + task.setGroup(TASK_GROUP); + task.setDescription(CHECK_DESCRIPTION); + }); + TaskProvider rootApplyTask = tasks.register(EXTENSION + APPLY); + rootApplyTask.configure(task -> { + task.getLogger().lifecycle("{}:{}", task.getProject(), task.getName()); + task.setGroup(TASK_GROUP); + task.setDescription(APPLY_DESCRIPTION); + }); spotlessExtension.formats.forEach((key, value) -> { // create the task that does the work String taskName = EXTENSION + capitalize(key); - SpotlessTask spotlessTask = project.getTasks().create(taskName, SpotlessTask.class); - value.setupTask(spotlessTask); + TaskProvider spotlessTask = tasks.register(taskName, SpotlessTask.class); + spotlessTask.configure(task -> { + task.getLogger().lifecycle("{}:{}", task.getProject(), task.getName()); + value.setupTask(task); + }); // create the check and apply control tasks - Task checkTask = project.getTasks().create(taskName + CHECK); - Task applyTask = project.getTasks().create(taskName + APPLY); + TaskProvider checkTask = tasks.register(taskName + CHECK); + TaskProvider applyTask = tasks.register(taskName + APPLY); // the root tasks depend on them - rootCheckTask.dependsOn(checkTask); - rootApplyTask.dependsOn(applyTask); + rootCheckTask.configure(task -> { + task.getLogger().lifecycle("{}:{}", task.getProject(), task.getName()); + task.dependsOn(tasks.named(taskName + CHECK)); + }); + rootApplyTask.configure(task -> { + task.getLogger().lifecycle("{}:{}", task.getProject(), task.getName()); + task.dependsOn(tasks.named(taskName + APPLY)); + }); // and they depend on the work task - checkTask.dependsOn(spotlessTask); - applyTask.dependsOn(spotlessTask); + checkTask.configure(task -> { + task.getLogger().lifecycle("{}:{}", task.getProject(), task.getName()); + task.dependsOn(tasks.named(taskName)); + }); + applyTask.configure(task -> { + task.getLogger().lifecycle("{}:{}", task.getProject(), task.getName()); + task.dependsOn(tasks.named(taskName)); + }); // when the task graph is ready, we'll configure the spotlessTask appropriately project.getGradle().getTaskGraph().whenReady(new Closure(null) { @@ -87,32 +112,34 @@ public class SpotlessPlugin implements Plugin { // called by gradle @SuppressFBWarnings("UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS") public Object doCall(TaskExecutionGraph graph) { - if (graph.hasTask(checkTask)) { - spotlessTask.setCheck(); + if (graph.hasTask(taskName + CHECK)) { + spotlessTask.configure(task -> task.setCheck()); } - if (graph.hasTask(applyTask)) { - spotlessTask.setApply(); + if (graph.hasTask(taskName + APPLY)) { + spotlessTask.configure(task -> task.setApply()); } return Closure.DONE; } }); }); - // Add our check task as a dependency on the global check task - // getTasks() returns a "live" collection, so this works even if the - // task doesn't exist at the time this call is made - if (spotlessExtension.enforceCheck) { - project.getTasks() + project.afterEvaluate(x -> { + // Add our check task as a dependency on the global check task + // getTasks() returns a "live" collection, so this works even if the + // task doesn't exist at the time this call is made + if (spotlessExtension.enforceCheck) { + tasks .matching(task -> task.getName().equals(JavaBasePlugin.CHECK_TASK_NAME)) .all(task -> task.dependsOn(rootCheckTask)); - } - - // clear spotless' cache when the user does a clean, but only after any spotless tasks - Task clean = project.getTasks().getByName(BasePlugin.CLEAN_TASK_NAME); - clean.doLast(unused -> SpotlessCache.clear()); - project.getTasks() - .withType(SpotlessTask.class) - .all(task -> task.mustRunAfter(clean)); + + // clear spotless' cache when the user does a clean, but only after any spotless tasks + Task clean = tasks.getByName(BasePlugin.CLEAN_TASK_NAME); + clean.doLast(unused -> SpotlessCache.clear()); + tasks + .withType(SpotlessTask.class) + .configureEach(task -> task.mustRunAfter(clean)); + } + }); } static String capitalize(String input) { diff --git a/settings.gradle b/settings.gradle index dd09f48a..0eb39325 100644 --- a/settings.gradle +++ b/settings.gradle @@ -7,3 +7,5 @@ include 'testlib' // library for sharing test infrastructure between the project include 'lib-extra' // reusable library with lots of dependencies include 'plugin-gradle' // gradle-specific glue code include 'plugin-maven' // maven-specific glue code + +enableFeaturePreview('STABLE_PUBLISHING')