Skip to content

Commit

Permalink
Fix composite build (#1001 fixes #860)
Browse files Browse the repository at this point in the history
  • Loading branch information
nedtwigg committed Dec 7, 2021
2 parents 142bf66 + 9e9ca2b commit 1d3705f
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 10 deletions.
2 changes: 2 additions & 0 deletions plugin-gradle/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (starting after version `3.27.0`).

## [Unreleased]
### Fixed
* Fix gradle composite builds ([#860](https://github.com/diffplug/spotless/issues/860)).

## [6.0.3] - 2021-12-06
### Fixed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,9 @@ void hookSubprojectTask(SpotlessTask task) {

void setup() {
Preconditions.checkArgument(getProject().getRootProject() == getProject(), "Can only be used on the root project");

String compositeBuildSuffix = getName().substring(TASK_NAME.length()); // see https://github.com/diffplug/spotless/pull/1001
BuildServiceRegistry buildServices = getProject().getGradle().getSharedServices();
getTaskService().set(buildServices.registerIfAbsent("SpotlessTaskService", SpotlessTaskService.class, spec -> {}));
getTaskService().set(buildServices.registerIfAbsent("SpotlessTaskService" + compositeBuildSuffix, SpotlessTaskService.class, spec -> {}));
getBuildEventsListenerRegistry().onTaskCompletion(getTaskService());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@

public class SpotlessExtensionImpl extends SpotlessExtension {
private final TaskProvider<RegisterDependenciesTask> registerDependenciesTask;
final TaskProvider<?> rootCheckTask, rootApplyTask, rootDiagnoseTask;

public SpotlessExtensionImpl(Project project) {
super(project);
Expand All @@ -38,13 +39,7 @@ public SpotlessExtensionImpl(Project project) {
rootDiagnoseTask = project.getTasks().register(EXTENSION + DIAGNOSE, task -> {
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);
}
registerDependenciesTask = findRegisterDepsTask();

project.afterEvaluate(unused -> {
if (enforceCheck) {
Expand All @@ -58,7 +53,26 @@ public SpotlessExtensionImpl(Project project) {
});
}

final TaskProvider<?> rootCheckTask, rootApplyTask, rootDiagnoseTask;
private TaskProvider<RegisterDependenciesTask> findRegisterDepsTask() {
try {
return findRegisterDepsTask(RegisterDependenciesTask.TASK_NAME);
} catch (Exception e) {
// in a composite build there can be multiple Spotless plugins on the classpath, and they will each try to register
// a task on the root project with the same name. That will generate casting errors, which we can catch and try again
// with an identity-specific identifier.
// https://github.com/diffplug/spotless/pull/1001 for details
return findRegisterDepsTask(RegisterDependenciesTask.TASK_NAME + System.identityHashCode(RegisterDependenciesTask.class));
}
}

private TaskProvider<RegisterDependenciesTask> findRegisterDepsTask(String taskName) {
TaskContainer rootProjectTasks = project.getRootProject().getTasks();
if (!rootProjectTasks.getNames().contains(taskName)) {
return rootProjectTasks.register(taskName, RegisterDependenciesTask.class, RegisterDependenciesTask::setup);
} else {
return rootProjectTasks.named(taskName, RegisterDependenciesTask.class);
}
}

RegisterDependenciesTask getRegisterDependenciesTask() {
return registerDependenciesTask.get();
Expand Down

0 comments on commit 1d3705f

Please sign in to comment.