Skip to content

Remove all eager task creation for SpotlessModern #622

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jun 23, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public FormatExtension(SpotlessExtensionBase spotless) {
}

protected final Provisioner provisioner() {
return spotless.registerDependenciesTask.rootProvisioner;
return spotless.getRegisterDependenciesTask().rootProvisioner;
}

private String formatName() {
Expand Down Expand Up @@ -677,10 +677,10 @@ protected void setupTask(SpotlessTask task) {
task.setSteps(steps);
task.setLineEndingsPolicy(getLineEndings().createPolicy(getProject().getProjectDir(), () -> task.target));
if (spotless.project != spotless.project.getRootProject()) {
spotless.registerDependenciesTask.hookSubprojectTask(task);
spotless.getRegisterDependenciesTask().hookSubprojectTask(task);
}
if (getRatchetFrom() != null) {
task.setupRatchet(spotless.registerDependenciesTask.gitRatchet, getRatchetFrom());
task.setupRatchet(spotless.getRegisterDependenciesTask().gitRatchet, getRatchetFrom());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ private GradleProvisioner() {}

@Deprecated
public static Provisioner fromProject(Project project) {
return project.getPlugins().apply(SpotlessPlugin.class).getExtension().registerDependenciesTask.rootProvisioner;
return project.getPlugins().apply(SpotlessPlugin.class).getExtension().getRegisterDependenciesTask().rootProvisioner;
}

/** The provisioner used for the root project. */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
public class SpotlessExtension extends SpotlessExtensionBase {
final Task rootCheckTask, rootApplyTask, rootDiagnoseTask;
private static final String FILES_PROPERTY = "spotlessFiles";
private final RegisterDependenciesTask registerDependenciesTask;

public SpotlessExtension(Project project) {
super(project);
Expand All @@ -34,6 +35,18 @@ public SpotlessExtension(Project project) {
rootApplyTask.setDescription(APPLY_DESCRIPTION);
rootDiagnoseTask = project.task(EXTENSION + DIAGNOSE);
rootDiagnoseTask.setGroup(TASK_GROUP); // no description on purpose

RegisterDependenciesTask registerDependenciesTask = (RegisterDependenciesTask) project.getRootProject().getTasks().findByName(RegisterDependenciesTask.TASK_NAME);
if (registerDependenciesTask == null) {
registerDependenciesTask = project.getRootProject().getTasks().create(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class);
registerDependenciesTask.setup();
}
this.registerDependenciesTask = registerDependenciesTask;
}

@Override
RegisterDependenciesTask getRegisterDependenciesTask() {
return registerDependenciesTask;
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,6 @@

public abstract class SpotlessExtensionBase {
final Project project;
final RegisterDependenciesTask registerDependenciesTask;

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

public SpotlessExtensionBase(Project project) {
this.project = requireNonNull(project);

RegisterDependenciesTask registerDependenciesTask = (RegisterDependenciesTask) project.getRootProject().getTasks().findByName(RegisterDependenciesTask.TASK_NAME);
if (registerDependenciesTask == null) {
registerDependenciesTask = project.getRootProject().getTasks().create(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class);
registerDependenciesTask.setup();
}
this.registerDependenciesTask = registerDependenciesTask;
}

abstract RegisterDependenciesTask getRegisterDependenciesTask();

/** Line endings (if any). */
LineEnding lineEndings = LineEnding.GIT_ATTRIBUTES;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@
import org.gradle.api.tasks.TaskProvider;

public class SpotlessExtensionModern extends SpotlessExtensionBase {
private final TaskProvider<RegisterDependenciesTask> registerDependenciesTask;

public SpotlessExtensionModern(Project project) {
super(project);
rootCheckTask = project.getTasks().register(EXTENSION + CHECK, task -> {
Expand All @@ -37,6 +39,13 @@ public SpotlessExtensionModern(Project project) {
task.setGroup(TASK_GROUP); // no description on purpose
});

TaskContainer rootProjectTasks = project.getRootProject().getTasks();
if (!rootProjectTasks.getNames().contains(RegisterDependenciesTask.TASK_NAME)) {
this.registerDependenciesTask = rootProjectTasks.register(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class, RegisterDependenciesTask::setup);
} else {
this.registerDependenciesTask = rootProjectTasks.named(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class);
}

project.afterEvaluate(unused -> {
if (enforceCheck) {
project.getTasks().named(JavaBasePlugin.CHECK_TASK_NAME)
Expand All @@ -47,6 +56,11 @@ public SpotlessExtensionModern(Project project) {

final TaskProvider<?> rootCheckTask, rootApplyTask, rootDiagnoseTask;

@Override
RegisterDependenciesTask getRegisterDependenciesTask() {
return registerDependenciesTask.get();
}

@SuppressWarnings("unchecked")
@Override
public <T extends FormatExtension> void format(String name, Class<T> clazz, Action<T> configure) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.plugins.BasePlugin;

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

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