From dacf13ca7f30c00b980cec69507fde5732c259d8 Mon Sep 17 00:00:00 2001 From: Aurimas Liutikas Date: Thu, 29 Jan 2026 15:49:27 -0800 Subject: [PATCH] Apply spotless by default - Upgrades to spotless 8.2.1 - Moves spotless setup from an init.gradle.kts to build-logic - Narrows down the scope of `target` in spotless configuration to be more precise to workaround https://github.com/diffplug/spotless/issues/2717 - Updates all references to init.gradle.kts Ran gradle-profiler ./gradlew build --dry-run to validate performance impact. Before PR: Mean 10,527.96 ms with 289.01 ms std dev After PR: Mean 11,251.78 ms with 530.29 ms std dev Regression is there, but quite minor. Test: ./gradlew spotlessCheck --- .github/pull_request_template.md | 2 +- .github/workflows/Build.yaml | 2 +- .run/spotlessApply.run.xml | 1 - AGENTS.md | 2 +- build-logic/convention/build.gradle.kts | 1 + .../AndroidApplicationConventionPlugin.kt | 2 + .../kotlin/AndroidLibraryConventionPlugin.kt | 2 + .../main/kotlin/JvmLibraryConventionPlugin.kt | 2 + .../apps/nowinandroid/KotlinAndroid.kt | 2 + .../samples/apps/nowinandroid/Spotless.kt | 55 +++++++++++++++++ build.gradle.kts | 1 + gradle/init.gradle.kts | 59 ------------------- gradle/libs.versions.toml | 4 ++ tools/pre-push | 2 +- 14 files changed, 73 insertions(+), 64 deletions(-) create mode 100644 build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Spotless.kt delete mode 100644 gradle/init.gradle.kts diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 265ff2ba5..efe4ef29a 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -10,7 +10,7 @@ Thanks for submitting a pull request. To accept your pull request we need you do **Ensure tests pass and code is formatted correctly** - Run local tests on the `DemoDebug` variant by running `./gradlew testDemoDebug` -- Fix code formatting: `./gradlew --init-script gradle/init.gradle.kts spotlessApply` +- Fix code formatting: `./gradlew spotlessApply` **Add a description** diff --git a/.github/workflows/Build.yaml b/.github/workflows/Build.yaml index 7e5a80eea..eec554b37 100644 --- a/.github/workflows/Build.yaml +++ b/.github/workflows/Build.yaml @@ -48,7 +48,7 @@ jobs: run: ./gradlew :build-logic:convention:check - name: Check spotless - run: ./gradlew spotlessCheck --init-script gradle/init.gradle.kts --no-configuration-cache + run: ./gradlew spotlessCheck - name: Check Dependency Guard id: dependencyguard_verify diff --git a/.run/spotlessApply.run.xml b/.run/spotlessApply.run.xml index 5c4dac833..03bd19a6d 100644 --- a/.run/spotlessApply.run.xml +++ b/.run/spotlessApply.run.xml @@ -4,7 +4,6 @@ diff --git a/AGENTS.md b/AGENTS.md index efb39ef19..edcfd396e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -26,7 +26,7 @@ The main Android app lives in the `app/` folder. Feature modules live in `featur The app and Android libraries have two product flavors: `demo` and `prod`, and two build types: `debug` and `release`. - Build: `./gradlew assemble{Variant}`. Typically `assembleDemoDebug`. -- Fix linting/formatting: `./gradlew --init-script gradle/init.gradle.kts spotlessApply` +- Fix linting/formatting: `./gradlew spotlessApply` - Run local tests: `./gradlew {variant}Test` - Run single test: `./gradlew {variant}Test --tests "com.example.myapp.MyTestClass"` - Run local screenshot tests: `./gradlew verifyRoborazziDemoDebug` diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index 5faf257c1..41491da4f 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -45,6 +45,7 @@ dependencies { compileOnly(libs.kotlin.gradlePlugin) compileOnly(libs.ksp.gradlePlugin) compileOnly(libs.room.gradlePlugin) + compileOnly(libs.spotless.gradlePlugin) implementation(libs.truth) lintChecks(libs.androidx.lint.gradle) } diff --git a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt index 8c45a056c..8cbd06a7c 100644 --- a/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidApplicationConventionPlugin.kt @@ -20,6 +20,7 @@ import com.google.samples.apps.nowinandroid.configureBadgingTasks import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.configureKotlinAndroid import com.google.samples.apps.nowinandroid.configurePrintApksTask +import com.google.samples.apps.nowinandroid.configureSpotlessForAndroid import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.apply @@ -42,6 +43,7 @@ class AndroidApplicationConventionPlugin : Plugin { configurePrintApksTask(this) configureBadgingTasks(this) } + configureSpotlessForAndroid() } } } diff --git a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt index ee47e823a..045334a49 100644 --- a/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/AndroidLibraryConventionPlugin.kt @@ -20,6 +20,7 @@ import com.google.samples.apps.nowinandroid.configureFlavors import com.google.samples.apps.nowinandroid.configureGradleManagedDevices import com.google.samples.apps.nowinandroid.configureKotlinAndroid import com.google.samples.apps.nowinandroid.configurePrintApksTask +import com.google.samples.apps.nowinandroid.configureSpotlessForAndroid import com.google.samples.apps.nowinandroid.disableUnnecessaryAndroidTests import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin @@ -52,6 +53,7 @@ class AndroidLibraryConventionPlugin : Plugin { configurePrintApksTask(this) disableUnnecessaryAndroidTests(target) } + configureSpotlessForAndroid() dependencies { "androidTestImplementation"(libs.findLibrary("kotlin.test").get()) "testImplementation"(libs.findLibrary("kotlin.test").get()) diff --git a/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt index a1477891d..c9150abc7 100644 --- a/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/JvmLibraryConventionPlugin.kt @@ -15,6 +15,7 @@ */ import com.google.samples.apps.nowinandroid.configureKotlinJvm +import com.google.samples.apps.nowinandroid.configureSpotlessForJvm import com.google.samples.apps.nowinandroid.libs import org.gradle.api.Plugin import org.gradle.api.Project @@ -28,6 +29,7 @@ class JvmLibraryConventionPlugin : Plugin { apply(plugin = "nowinandroid.android.lint") configureKotlinJvm() + configureSpotlessForJvm() dependencies { "testImplementation"(libs.findLibrary("kotlin.test").get()) } diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt index 37b1ba99b..6d16efdb7 100644 --- a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/KotlinAndroid.kt @@ -17,10 +17,12 @@ package com.google.samples.apps.nowinandroid import com.android.build.api.dsl.CommonExtension +import com.diffplug.gradle.spotless.SpotlessExtension import org.gradle.api.JavaVersion import org.gradle.api.Project import org.gradle.api.plugins.JavaPluginExtension import org.gradle.kotlin.dsl.assign +import org.gradle.kotlin.dsl.apply import org.gradle.kotlin.dsl.configure import org.gradle.kotlin.dsl.dependencies import org.jetbrains.kotlin.gradle.dsl.JvmTarget diff --git a/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Spotless.kt b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Spotless.kt new file mode 100644 index 000000000..8b92345c5 --- /dev/null +++ b/build-logic/convention/src/main/kotlin/com/google/samples/apps/nowinandroid/Spotless.kt @@ -0,0 +1,55 @@ +/* + * Copyright 2026 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.samples.apps.nowinandroid + +import com.diffplug.gradle.spotless.SpotlessExtension +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.configure + +internal fun Project.configureSpotlessForAndroid() { + configureSpotlessCommon() + extensions.configure { + format("xml") { + target("src/**/*.xml") + // Look for the first XML tag that isn't a comment (