Skip to content
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
1 change: 1 addition & 0 deletions plugin-gradle/CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ We adhere to the [keepachangelog](https://keepachangelog.com/en/1.0.0/) format (
### Fixed
- Fix `tableTestFormatter` editorconfig cache not honoring `.editorconfig` changes across Gradle daemon runs due to a shared static `EditorConfigProvider`. ([#2893](https://github.com/diffplug/spotless/pull/2893))
- Fix non-idempotent formatting when `importOrder()` is combined with `greclipse()`: a single catch-all group no longer strips blank lines that `greclipse()` independently inserted between import groups. ([#2914](https://github.com/diffplug/spotless/pull/2914))
- Fix `predeclareDepsFromBuildscript()` on Gradle 9 by avoiding mutation of the root buildscript configuration container. ([#2929](https://github.com/diffplug/spotless/pull/2929), fixes [#2599](https://github.com/diffplug/spotless/issues/2599))
### Changes
- Bump default `cleanthat` version `2.24` -> `2.25`. ([#2903](https://github.com/diffplug/spotless/pull/2903))
- Bump default `eclipse-jdt` version from `4.35` to `4.39`. ([#2912](https://github.com/diffplug/spotless/pull/2912))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.gradle.api.Project;
import org.gradle.api.artifacts.Configuration;
import org.gradle.api.artifacts.ConfigurationContainer;
import org.gradle.api.artifacts.Dependency;
import org.gradle.api.artifacts.dsl.DependencyHandler;
import org.gradle.api.attributes.Bundling;
import org.gradle.api.attributes.Category;
Expand Down Expand Up @@ -122,12 +123,14 @@ static Provisioner forRootProjectBuildscript(Project project) {
private static Provisioner forConfigurationContainer(Project project, ConfigurationContainer configurations, DependencyHandler dependencies) {
return (withTransitives, mavenCoords) -> {
try {
Configuration config = configurations.create("spotless"
+ new Request(withTransitives, mavenCoords).hashCode());
mavenCoords.stream()
Request request = new Request(withTransitives, mavenCoords);
Dependency[] deps = mavenCoords.stream()
.map(dependencies::create)
.forEach(config.getDependencies()::add);
config.setDescription(mavenCoords.toString());
.toArray(Dependency[]::new);
// Detached configurations avoid mutating the target configuration container, which Gradle 9 forbids
// for the root buildscript container during task execution. See https://github.com/diffplug/spotless/issues/2599.
Configuration config = configurations.detachedConfiguration(deps);
config.setDescription("Spotless internal dependency resolution for " + request);
config.setTransitive(withTransitives);
config.setCanBeConsumed(false);
config.setVisible(false);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,84 @@ target file('test.java')
}
}

@Nested
class Gradle9Compatibility {
@Test
void issue2599_Gradle951_CanUsePredeclareDepsFromBuildscript() throws IOException {
setFile("build.gradle.kts").toContent("""
import com.diffplug.gradle.spotless.SpotlessExtensionPredeclare

buildscript {
repositories { mavenCentral() }
}
plugins {
id("com.diffplug.spotless")
}
spotless {
predeclareDepsFromBuildscript()
}
configure<SpotlessExtensionPredeclare> {
kotlin { ktfmt("0.56") }
}
spotless {
kotlin {
target("src/**/*.kt")
ktfmt("0.56")
}
}
""");
setFile("src/main/kotlin/basic.kt").toResource("kotlin/ktfmt/basic.dirty");

BuildResult result = gradleRunner()
.withGradleVersion("9.5.1")
.withArguments("spotlessApply", "--stacktrace")
.build();

assertThat(result.getOutput()).contains("BUILD SUCCESSFUL");
assertFile("src/main/kotlin/basic.kt").sameAsResource("kotlin/ktfmt/basic.clean");
}

@Test
void gradle951CanUsePredeclareWithProjectRepositories() throws IOException {
setFile("build.gradle.kts").toContent("""
import com.diffplug.gradle.spotless.SpotlessExtensionPredeclare

plugins {
id("com.diffplug.spotless")
}
repositories { mavenCentral() }
spotless {
predeclareDeps()
}
configure<SpotlessExtensionPredeclare> {
kotlin { ktfmt("0.56") }
}
spotless {
kotlin {
target("src/**/*.kt")
ktfmt("0.56")
}
}
""");
setFile("src/main/kotlin/basic.kt").toResource("kotlin/ktfmt/basic.dirty");

BuildResult withoutConfigurationCache = gradleRunner()
.withGradleVersion("9.5.1")
.withArguments("spotlessApply", "--stacktrace")
.build();
assertThat(withoutConfigurationCache.getOutput()).contains("BUILD SUCCESSFUL");
assertFile("src/main/kotlin/basic.kt").sameAsResource("kotlin/ktfmt/basic.clean");

setFile("src/main/kotlin/basic.kt").toResource("kotlin/ktfmt/basic.dirty");
BuildResult withConfigurationCache = gradleRunner()
.withGradleVersion("9.5.1")
.withArguments("spotlessApply", "--configuration-cache", "--stacktrace")
.build();
assertThat(withConfigurationCache.getOutput()).contains("BUILD SUCCESSFUL");
assertFile("src/main/kotlin/basic.kt").sameAsResource("kotlin/ktfmt/basic.clean");
}
}

@Nested
class EdgeCases {
@Test
Expand Down
Loading