Skip to content

Commit db8dc1c

Browse files
authored
Fix for illegal mutation issue with predeclareDeps (#2892)
2 parents 441dddc + 0eb98a9 commit db8dc1c

File tree

5 files changed

+39
-12
lines changed

5 files changed

+39
-12
lines changed

plugin-gradle/CHANGES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (
55
## [Unreleased]
66
### Added
77
- Add `tableTest` format type for standalone `.table` files.
8+
### Fixed
9+
- Fix illegal mutation when using predeclared dependencies.
810
### Changes
911
- Bump default `tabletest-formatter` version `1.0.1` -> `1.1.1`, now works with Java 17+.
1012

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public SpotlessExtensionPredeclare(Project project, GradleProvisioner.Policy pol
3232
super(project);
3333
this.registerDependenciesTask = findRegisterDepsTask().get();
3434
SpotlessTaskService taskService = getSpotlessTaskService().get();
35-
taskService.isUsingPredeclared = true;
35+
taskService.registerDependenciesTask = registerDependenciesTask;
3636
taskService.predeclaredProvisioner = policy.dedupingProvisioner(project);
3737
taskService.predeclaredP2Provisioner = policy.dedupingP2Provisioner(project);
3838
project.afterEvaluate(unused -> toSetup.forEach((name, formatExtension) -> {

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

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,14 @@
5656
* apply already did).
5757
*/
5858
public abstract class SpotlessTaskService implements BuildService<BuildServiceParameters.None>, AutoCloseable, OperationCompletionListener {
59-
protected boolean isUsingPredeclared;
6059
private final Map<String, SpotlessApply> apply = Collections.synchronizedMap(new HashMap<>());
6160
private final Map<String, SpotlessTask> source = Collections.synchronizedMap(new HashMap<>());
6261
private final Map<String, Provisioner> provisioner = Collections.synchronizedMap(new HashMap<>());
6362
private final Map<String, P2Provisioner> p2Provisioner = Collections.synchronizedMap(new HashMap<>());
6463

6564
@Nullable GradleProvisioner.DedupingProvisioner predeclaredProvisioner;
6665
@Nullable GradleProvisioner.DedupingP2Provisioner predeclaredP2Provisioner;
66+
@Nullable RegisterDependenciesTask registerDependenciesTask;
6767

6868
Provisioner provisionerFor(SpotlessExtension spotless) {
6969
if (spotless instanceof SpotlessExtensionPredeclare) {
@@ -129,12 +129,9 @@ static void usesServiceTolerateTestFailure(DefaultTask task, Provider<SpotlessTa
129129
}
130130

131131
public void hookSubprojectTask(Project project, SpotlessTask task) {
132-
// This check allows isolated projects support by not accessing the root project tasks unless really needed
133-
if (!isUsingPredeclared) {
134-
return;
132+
if (registerDependenciesTask != null) {
133+
registerDependenciesTask.hookSubprojectTask(task);
135134
}
136-
137-
project.getRootProject().getTasks().withType(RegisterDependenciesTask.class, registerTask -> registerTask.hookSubprojectTask(task));
138135
}
139136

140137
public static Provider<SpotlessTaskService> registerIfAbsent(Project project, String suffix) {

plugin-gradle/src/test/java/com/diffplug/gradle/spotless/IsolatedProjectTest.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import java.io.IOException;
1919

20-
import org.assertj.core.api.Assertions;
2120
import org.gradle.testkit.runner.GradleRunner;
2221
import org.junit.jupiter.api.Test;
2322

@@ -85,7 +84,7 @@ void noRootIsSupported() throws IOException {
8584
}
8685

8786
@Test
88-
void predeclaredIsUnsupported() throws IOException {
87+
void predeclaredIsSupported() throws IOException {
8988
setFile("build.gradle").toLines(
9089
"plugins {",
9190
" id 'com.diffplug.spotless'",
@@ -96,7 +95,6 @@ void predeclaredIsUnsupported() throws IOException {
9695
" kotlin { ktlint() }",
9796
"}");
9897
createNSubprojects();
99-
Assertions.assertThat(gradleRunner().withArguments("spotlessApply").buildAndFail().getOutput())
100-
.containsAnyOf("Cannot access project", "cannot access 'Project.tasks'");
98+
gradleRunner().withArguments("spotlessApply").build();
10199
}
102100
}

plugin-gradle/src/test/java/com/diffplug/gradle/spotless/MultiProjectTest.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016-2025 DiffPlug
2+
* Copyright 2016-2026 DiffPlug
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -137,6 +137,36 @@ public void predeclaredOrdering() throws IOException {
137137
.contains("Could not find method spotlessPredeclare() for arguments");
138138
}
139139

140+
@Test
141+
public void predeclaredDepsRegression() throws IOException {
142+
setFile("settings.gradle").toContent("include 'sub'");
143+
setFile("build.gradle").toLines(
144+
"plugins { id 'com.diffplug.spotless' }",
145+
"repositories { mavenCentral() }",
146+
"spotless {",
147+
" predeclareDeps()",
148+
" java {",
149+
" target file('test.java')",
150+
" googleJavaFormat('1.17.0')",
151+
" }",
152+
"}",
153+
"spotlessPredeclare {",
154+
" java { googleJavaFormat('1.17.0') }",
155+
"}");
156+
setFile("test.java").toResource("java/googlejavaformat/JavaCodeUnformatted.test");
157+
setFile("sub/build.gradle").toLines(
158+
"plugins { id 'com.diffplug.spotless' }",
159+
"repositories { mavenCentral() }",
160+
"spotless {",
161+
" java {",
162+
" target file('test.java')",
163+
" googleJavaFormat('1.17.0')",
164+
" }",
165+
"}");
166+
setFile("sub/test.java").toResource("java/googlejavaformat/JavaCodeUnformatted.test");
167+
gradleRunner().withGradleVersion("8.14").withArguments("spotlessApply").build();
168+
}
169+
140170
@Test
141171
public void predeclaredUndeclared() throws IOException {
142172
setFile("build.gradle").toLines(

0 commit comments

Comments
 (0)