From 33a72843fa99279c9f9738f8e2b95cd11f6490da Mon Sep 17 00:00:00 2001 From: Ervin Marasigan Date: Wed, 24 Nov 2021 14:51:00 -0600 Subject: [PATCH 1/6] fix: #860 composite gradle build --- .../diffplug/gradle/spotless/RegisterDependenciesTask.java | 2 +- .../diffplug/gradle/spotless/SpotlessExtensionImpl.java | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java index db74c04781..08b4fe422f 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java @@ -54,7 +54,7 @@ void setup() { Preconditions.checkArgument(getProject().getRootProject() == getProject(), "Can only be used on the root project"); BuildServiceRegistry buildServices = getProject().getGradle().getSharedServices(); - getTaskService().set(buildServices.registerIfAbsent("SpotlessTaskService", SpotlessTaskService.class, spec -> {})); + getTaskService().set(buildServices.registerIfAbsent("SpotlessTaskService" + System.identityHashCode(RegisterDependenciesTask.class.getClassLoader()), SpotlessTaskService.class, spec -> {})); getBuildEventsListenerRegistry().onTaskCompletion(getTaskService()); } diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java index d55521c681..88608a9fb5 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java @@ -40,10 +40,11 @@ public SpotlessExtensionImpl(Project project) { }); TaskContainer rootProjectTasks = project.getRootProject().getTasks(); - if (!rootProjectTasks.getNames().contains(RegisterDependenciesTask.TASK_NAME)) { - this.registerDependenciesTask = rootProjectTasks.register(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class, RegisterDependenciesTask::setup); + String taskName = RegisterDependenciesTask.TASK_NAME + System.identityHashCode(RegisterDependenciesTask.class.getClassLoader()); + if (!rootProjectTasks.getNames().contains(taskName)) { + this.registerDependenciesTask = rootProjectTasks.register(taskName, RegisterDependenciesTask.class, RegisterDependenciesTask::setup); } else { - this.registerDependenciesTask = rootProjectTasks.named(RegisterDependenciesTask.TASK_NAME, RegisterDependenciesTask.class); + this.registerDependenciesTask = rootProjectTasks.named(taskName, RegisterDependenciesTask.class); } project.afterEvaluate(unused -> { From 16611dd451b60bc102e7b2f1898669c83888453a Mon Sep 17 00:00:00 2001 From: Ervin Marasigan Date: Wed, 24 Nov 2021 15:03:56 -0600 Subject: [PATCH 2/6] chore: added changes for #860 --- plugin-gradle/CHANGES.md | 1 + 1 file changed, 1 insertion(+) diff --git a/plugin-gradle/CHANGES.md b/plugin-gradle/CHANGES.md index 1bd4f13881..0f557de039 100644 --- a/plugin-gradle/CHANGES.md +++ b/plugin-gradle/CHANGES.md @@ -7,6 +7,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format ( ### Changed * Bump jgit version ([#992](https://github.com/diffplug/spotless/pull/992)). * jgit `5.10.0.202012080955-r` -> `5.13.0.202109080827-r` +* Fix gradle composite builds ([#860](https://github.com/diffplug/spotless/issues/860)). ## [6.0.0] - 2021-11-09 ### Added From 8faf2bbe48d46c99a7946b716c3aa1981731e4fb Mon Sep 17 00:00:00 2001 From: Ervin Marasigan Date: Wed, 24 Nov 2021 17:23:40 -0600 Subject: [PATCH 3/6] fix: apply fix #860 only for composite projects --- .../com/diffplug/gradle/spotless/RegisterDependenciesTask.java | 3 ++- .../com/diffplug/gradle/spotless/SpotlessExtensionImpl.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java index 08b4fe422f..03db076320 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java @@ -54,7 +54,8 @@ void setup() { Preconditions.checkArgument(getProject().getRootProject() == getProject(), "Can only be used on the root project"); BuildServiceRegistry buildServices = getProject().getGradle().getSharedServices(); - getTaskService().set(buildServices.registerIfAbsent("SpotlessTaskService" + System.identityHashCode(RegisterDependenciesTask.class.getClassLoader()), SpotlessTaskService.class, spec -> {})); + getTaskService().set(buildServices.registerIfAbsent("SpotlessTaskService" + + (getProject().getSubprojects().size() > 1 ? System.identityHashCode(RegisterDependenciesTask.class.getClassLoader()) : ""), SpotlessTaskService.class, spec -> {})); getBuildEventsListenerRegistry().onTaskCompletion(getTaskService()); } diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java index 88608a9fb5..c010edd0fb 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java @@ -40,7 +40,8 @@ public SpotlessExtensionImpl(Project project) { }); TaskContainer rootProjectTasks = project.getRootProject().getTasks(); - String taskName = RegisterDependenciesTask.TASK_NAME + System.identityHashCode(RegisterDependenciesTask.class.getClassLoader()); + String taskName = RegisterDependenciesTask.TASK_NAME + + (project.getRootProject().getSubprojects().size() > 1 ? System.identityHashCode(RegisterDependenciesTask.class.getClassLoader()) : ""); if (!rootProjectTasks.getNames().contains(taskName)) { this.registerDependenciesTask = rootProjectTasks.register(taskName, RegisterDependenciesTask.class, RegisterDependenciesTask::setup); } else { From 964fca599bcf4505485f4a3ae3f9a05f424a6a5e Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Mon, 6 Dec 2021 14:04:56 -0800 Subject: [PATCH 4/6] Instead of having two random numbers per classloader, we can have just one by parsing out the previous result. --- .../diffplug/gradle/spotless/RegisterDependenciesTask.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java index 03db076320..e2a5145b02 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/RegisterDependenciesTask.java @@ -52,10 +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" + - (getProject().getSubprojects().size() > 1 ? System.identityHashCode(RegisterDependenciesTask.class.getClassLoader()) : ""), SpotlessTaskService.class, spec -> {})); + getTaskService().set(buildServices.registerIfAbsent("SpotlessTaskService" + compositeBuildSuffix, SpotlessTaskService.class, spec -> {})); getBuildEventsListenerRegistry().onTaskCompletion(getTaskService()); } From e59b7e5ab89e321eef523375b770799d4f655631 Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Mon, 6 Dec 2021 14:16:37 -0800 Subject: [PATCH 5/6] We now generate an `identityHashCode`-specific RegisterDependenciesTask whenever necessary, but only when necessary. --- .../spotless/SpotlessExtensionImpl.java | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java index c010edd0fb..9111814977 100644 --- a/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java +++ b/plugin-gradle/src/main/java/com/diffplug/gradle/spotless/SpotlessExtensionImpl.java @@ -24,6 +24,7 @@ public class SpotlessExtensionImpl extends SpotlessExtension { private final TaskProvider registerDependenciesTask; + final TaskProvider rootCheckTask, rootApplyTask, rootDiagnoseTask; public SpotlessExtensionImpl(Project project) { super(project); @@ -38,15 +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(); - String taskName = RegisterDependenciesTask.TASK_NAME + - (project.getRootProject().getSubprojects().size() > 1 ? System.identityHashCode(RegisterDependenciesTask.class.getClassLoader()) : ""); - if (!rootProjectTasks.getNames().contains(taskName)) { - this.registerDependenciesTask = rootProjectTasks.register(taskName, RegisterDependenciesTask.class, RegisterDependenciesTask::setup); - } else { - this.registerDependenciesTask = rootProjectTasks.named(taskName, RegisterDependenciesTask.class); - } + registerDependenciesTask = findRegisterDepsTask(); project.afterEvaluate(unused -> { if (enforceCheck) { @@ -56,7 +49,26 @@ public SpotlessExtensionImpl(Project project) { }); } - final TaskProvider rootCheckTask, rootApplyTask, rootDiagnoseTask; + private TaskProvider 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 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(); From 9e9ca2b7f14e2e1cc8afe28be698243e210313ce Mon Sep 17 00:00:00 2001 From: Ned Twigg Date: Mon, 6 Dec 2021 14:32:43 -0800 Subject: [PATCH 6/6] Update changelog. --- plugin-gradle/CHANGES.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugin-gradle/CHANGES.md b/plugin-gradle/CHANGES.md index 3ba6644bce..279fece211 100644 --- a/plugin-gradle/CHANGES.md +++ b/plugin-gradle/CHANGES.md @@ -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 @@ -22,7 +24,6 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format ( * Added `onlyIfContentMatches` option to `licenseHeader` to skip license header application based on source file content pattern ([#650](https://github.com/diffplug/spotless/issues/650)). * Bump jgit version ([#992](https://github.com/diffplug/spotless/pull/992)). * jgit `5.10.0.202012080955-r` -> `5.13.0.202109080827-r` -* Fix gradle composite builds ([#860](https://github.com/diffplug/spotless/issues/860)). ## [6.0.0] - 2021-11-09 ### Added