Skip to content

Commit 5e40de5

Browse files
authored
Remove all eager task creation for SpotlessModern (#622)
* Avoid eagerly creating the ‘clean’ task * Avoid eagerly creating the 'spotlessInternalRegisterDependencies' task
1 parent db915dd commit 5e40de5

File tree

6 files changed

+42
-21
lines changed

6 files changed

+42
-21
lines changed

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/FormatExtension.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public FormatExtension(SpotlessExtensionBase spotless) {
6464
}
6565

6666
protected final Provisioner provisioner() {
67-
return spotless.registerDependenciesTask.rootProvisioner;
67+
return spotless.getRegisterDependenciesTask().rootProvisioner;
6868
}
6969

7070
private String formatName() {
@@ -677,10 +677,10 @@ protected void setupTask(SpotlessTask task) {
677677
task.setSteps(steps);
678678
task.setLineEndingsPolicy(getLineEndings().createPolicy(getProject().getProjectDir(), () -> task.target));
679679
if (spotless.project != spotless.project.getRootProject()) {
680-
spotless.registerDependenciesTask.hookSubprojectTask(task);
680+
spotless.getRegisterDependenciesTask().hookSubprojectTask(task);
681681
}
682682
if (getRatchetFrom() != null) {
683-
task.setupRatchet(spotless.registerDependenciesTask.gitRatchet, getRatchetFrom());
683+
task.setupRatchet(spotless.getRegisterDependenciesTask().gitRatchet, getRatchetFrom());
684684
}
685685
}
686686

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/GradleProvisioner.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ private GradleProvisioner() {}
3939

4040
@Deprecated
4141
public static Provisioner fromProject(Project project) {
42-
return project.getPlugins().apply(SpotlessPlugin.class).getExtension().registerDependenciesTask.rootProvisioner;
42+
return project.getPlugins().apply(SpotlessPlugin.class).getExtension().getRegisterDependenciesTask().rootProvisioner;
4343
}
4444

4545
/** The provisioner used for the root project. */

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtension.java

+13
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
public class SpotlessExtension extends SpotlessExtensionBase {
2424
final Task rootCheckTask, rootApplyTask, rootDiagnoseTask;
2525
private static final String FILES_PROPERTY = "spotlessFiles";
26+
private final RegisterDependenciesTask registerDependenciesTask;
2627

2728
public SpotlessExtension(Project project) {
2829
super(project);
@@ -34,6 +35,18 @@ public SpotlessExtension(Project project) {
3435
rootApplyTask.setDescription(APPLY_DESCRIPTION);
3536
rootDiagnoseTask = project.task(EXTENSION + DIAGNOSE);
3637
rootDiagnoseTask.setGroup(TASK_GROUP); // no description on purpose
38+
39+
RegisterDependenciesTask registerDependenciesTask = (RegisterDependenciesTask) project.getRootProject().getTasks().findByName(RegisterDependenciesTask.TASK_NAME);
40+
if (registerDependenciesTask == null) {
41+
registerDependenciesTask = project.getRootProject().getTasks().create(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class);
42+
registerDependenciesTask.setup();
43+
}
44+
this.registerDependenciesTask = registerDependenciesTask;
45+
}
46+
47+
@Override
48+
RegisterDependenciesTask getRegisterDependenciesTask() {
49+
return registerDependenciesTask;
3750
}
3851

3952
/**

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionBase.java

+2-8
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434

3535
public abstract class SpotlessExtensionBase {
3636
final Project project;
37-
final RegisterDependenciesTask registerDependenciesTask;
3837

3938
protected static final String TASK_GROUP = "Verification";
4039
protected static final String CHECK_DESCRIPTION = "Checks that sourcecode satisfies formatting steps.";
@@ -47,15 +46,10 @@ public abstract class SpotlessExtensionBase {
4746

4847
public SpotlessExtensionBase(Project project) {
4948
this.project = requireNonNull(project);
50-
51-
RegisterDependenciesTask registerDependenciesTask = (RegisterDependenciesTask) project.getRootProject().getTasks().findByName(RegisterDependenciesTask.TASK_NAME);
52-
if (registerDependenciesTask == null) {
53-
registerDependenciesTask = project.getRootProject().getTasks().create(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class);
54-
registerDependenciesTask.setup();
55-
}
56-
this.registerDependenciesTask = registerDependenciesTask;
5749
}
5850

51+
abstract RegisterDependenciesTask getRegisterDependenciesTask();
52+
5953
/** Line endings (if any). */
6054
LineEnding lineEndings = LineEnding.GIT_ATTRIBUTES;
6155

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionModern.java

+14
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import org.gradle.api.tasks.TaskProvider;
2424

2525
public class SpotlessExtensionModern extends SpotlessExtensionBase {
26+
private final TaskProvider<RegisterDependenciesTask> registerDependenciesTask;
27+
2628
public SpotlessExtensionModern(Project project) {
2729
super(project);
2830
rootCheckTask = project.getTasks().register(EXTENSION + CHECK, task -> {
@@ -37,6 +39,13 @@ public SpotlessExtensionModern(Project project) {
3739
task.setGroup(TASK_GROUP); // no description on purpose
3840
});
3941

42+
TaskContainer rootProjectTasks = project.getRootProject().getTasks();
43+
if (!rootProjectTasks.getNames().contains(RegisterDependenciesTask.TASK_NAME)) {
44+
this.registerDependenciesTask = rootProjectTasks.register(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class, RegisterDependenciesTask::setup);
45+
} else {
46+
this.registerDependenciesTask = rootProjectTasks.named(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class);
47+
}
48+
4049
project.afterEvaluate(unused -> {
4150
if (enforceCheck) {
4251
project.getTasks().named(JavaBasePlugin.CHECK_TASK_NAME)
@@ -47,6 +56,11 @@ public SpotlessExtensionModern(Project project) {
4756

4857
final TaskProvider<?> rootCheckTask, rootApplyTask, rootDiagnoseTask;
4958

59+
@Override
60+
RegisterDependenciesTask getRegisterDependenciesTask() {
61+
return registerDependenciesTask.get();
62+
}
63+
5064
@SuppressWarnings("unchecked")
5165
@Override
5266
public <T extends FormatExtension> void format(String name, Class<T> clazz, Action<T> configure) {

plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessPluginModern.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import org.gradle.api.Plugin;
1919
import org.gradle.api.Project;
20-
import org.gradle.api.Task;
2120
import org.gradle.api.plugins.BasePlugin;
2221

2322
import com.diffplug.spotless.SpotlessCache;
@@ -35,14 +34,15 @@ public void apply(Project project) {
3534
project.getExtensions().create(SpotlessExtension.EXTENSION, SpotlessExtensionModern.class, project);
3635

3736
// clear spotless' cache when the user does a clean
38-
Task clean = project.getTasks().getByName(BasePlugin.CLEAN_TASK_NAME);
39-
clean.doLast(unused -> {
40-
// resolution for: https://github.com/diffplug/spotless/issues/243#issuecomment-564323856
41-
// project.getRootProject() is consistent across every project, so only of one the clears will
42-
// actually happen (as desired)
43-
//
44-
// we use System.identityHashCode() to avoid a memory leak by hanging on to the reference directly
45-
SpotlessCache.clearOnce(System.identityHashCode(project.getRootProject()));
37+
project.getTasks().named(BasePlugin.CLEAN_TASK_NAME).configure(clean -> {
38+
clean.doLast(unused -> {
39+
// resolution for: https://github.com/diffplug/spotless/issues/243#issuecomment-564323856
40+
// project.getRootProject() is consistent across every project, so only of one the clears will
41+
// actually happen (as desired)
42+
//
43+
// we use System.identityHashCode() to avoid a memory leak by hanging on to the reference directly
44+
SpotlessCache.clearOnce(System.identityHashCode(project.getRootProject()));
45+
});
4646
});
4747
}
4848
}

0 commit comments

Comments
 (0)