diff --git a/build-logic/convention/build.gradle.kts b/build-logic/convention/build.gradle.kts index fc8710ab8..3a696aa7f 100644 --- a/build-logic/convention/build.gradle.kts +++ b/build-logic/convention/build.gradle.kts @@ -21,6 +21,8 @@ plugins { `kotlin-dsl` alias(libs.plugins.android.lint) alias(libs.plugins.dependency.analysis) + alias(libs.plugins.spotless) + alias(libs.plugins.detekt) } group = "com.geeksville.mesh.buildlogic" @@ -54,6 +56,8 @@ dependencies { compileOnly(libs.secrets.gradlePlugin) compileOnly(libs.spotless.gradlePlugin) compileOnly(libs.truth) + + detektPlugins(libs.detekt.formatting) } tasks { @@ -63,6 +67,39 @@ tasks { } } +spotless { + ratchetFrom("origin/main") + kotlin { + target("src/*/kotlin/**/*.kt", "src/*/java/**/*.kt") + targetExclude("**/build/**/*.kt") + ktfmt().kotlinlangStyle().configure { it.setMaxWidth(120) } + ktlint(libs.versions.ktlint.get()).setEditorConfigPath(rootProject.file("../config/spotless/.editorconfig").path) + licenseHeaderFile(rootProject.file("../config/spotless/copyright.kt")) + } + kotlinGradle { + target("**/*.gradle.kts") + ktfmt().kotlinlangStyle().configure { it.setMaxWidth(120) } + ktlint(libs.versions.ktlint.get()).setEditorConfigPath(rootProject.file("../config/spotless/.editorconfig").path) + licenseHeaderFile( + rootProject.file("../config/spotless/copyright.kts"), + "(^(?![\\/ ]\\*).*$)" + ) + } +} + +detekt { + toolVersion = libs.versions.detekt.get() + config.setFrom(rootProject.file("../config/detekt/detekt.yml")) + buildUponDefaultConfig = true + allRules = false + baseline = file("detekt-baseline.xml") + source.setFrom( + files( + "src/main/java", + "src/main/kotlin", + ) + ) +} gradlePlugin { plugins { diff --git a/build-logic/convention/detekt-baseline.xml b/build-logic/convention/detekt-baseline.xml new file mode 100644 index 000000000..a7b56b97f --- /dev/null +++ b/build-logic/convention/detekt-baseline.xml @@ -0,0 +1,37 @@ + + + + + AbsentOrWrongFileLicense:DetektConventionPlugin.kt$.DetektConventionPlugin.kt + AbsentOrWrongFileLicense:SpotlessConventionPlugin.kt$.SpotlessConventionPlugin.kt + ChainWrapping:AndroidInstrumentedTests.kt$&& + EnumNaming:MeshtasticFlavor.kt$FlavorDimension$marketplace + EnumNaming:MeshtasticFlavor.kt$MeshtasticFlavor$fdroid : MeshtasticFlavor + EnumNaming:MeshtasticFlavor.kt$MeshtasticFlavor$google : MeshtasticFlavor + FinalNewline:ProjectExtensions.kt$com.geeksville.mesh.buildlogic.ProjectExtensions.kt + MagicNumber:AndroidApplicationConventionPlugin.kt$AndroidApplicationConventionPlugin$36 + MagicNumber:AndroidLibraryConventionPlugin.kt$AndroidLibraryConventionPlugin$36 + MagicNumber:KotlinAndroid.kt$21 + MagicNumber:KotlinAndroid.kt$26 + MagicNumber:KotlinAndroid.kt$36 + MagicNumber:Spotless.kt$120 + MaxLineLength:GitVersionValueSource.kt$GitVersionValueSource$throw RuntimeException("Failed to determine git commit count for versionCode. Ensure you have a full git history (not a shallow clone) and .git is present.\nOriginal error: ${e.message}", e) + NewLineAtEndOfFile:ProjectExtensions.kt$com.geeksville.mesh.buildlogic.ProjectExtensions.kt + NoBlankLineBeforeRbrace:AndroidApplicationComposeConventionPlugin.kt$AndroidApplicationComposeConventionPlugin$ + NoBlankLineBeforeRbrace:AndroidLibraryComposeConventionPlugin.kt$AndroidLibraryComposeConventionPlugin$ + NoConsecutiveBlankLines:MeshtasticFlavor.kt$ + NoUnusedImports:AndroidApplicationFlavorsConventionPlugin.kt$.AndroidApplicationFlavorsConventionPlugin.kt + NoUnusedImports:AndroidLibraryConventionPlugin.kt$.AndroidLibraryConventionPlugin.kt + SpacingAroundParens:MeshtasticFlavor.kt$MeshtasticFlavor.fdroid$) + TooGenericExceptionCaught:GitVersionValueSource.kt$GitVersionValueSource$e: Exception + TooGenericExceptionThrown:GitVersionValueSource.kt$GitVersionValueSource$throw RuntimeException("Failed to determine git commit count for versionCode. Ensure you have a full git history (not a shallow clone) and .git is present.\nOriginal error: ${e.message}", e) + UnusedImports:AndroidApplicationFlavorsConventionPlugin.kt$import com.geeksville.mesh.buildlogic.MeshtasticFlavor + UnusedImports:AndroidApplicationFlavorsConventionPlugin.kt$import com.geeksville.mesh.buildlogic.libs + UnusedImports:AndroidApplicationFlavorsConventionPlugin.kt$import org.gradle.kotlin.dsl.apply + UnusedImports:AndroidApplicationFlavorsConventionPlugin.kt$import org.gradle.kotlin.dsl.dependencies + UnusedImports:AndroidApplicationFlavorsConventionPlugin.kt$import org.gradle.kotlin.dsl.exclude + UnusedImports:AndroidLibraryConventionPlugin.kt$import com.geeksville.mesh.buildlogic.libs + UnusedImports:AndroidLibraryConventionPlugin.kt$import org.gradle.kotlin.dsl.dependencies + UnusedParameter:AndroidLintConventionPlugin.kt$project: Project + + diff --git a/build-logic/convention/src/main/kotlin/com/geeksville/mesh/buildlogic/Spotless.kt b/build-logic/convention/src/main/kotlin/com/geeksville/mesh/buildlogic/Spotless.kt index e4ae56f5a..65d10ea9f 100644 --- a/build-logic/convention/src/main/kotlin/com/geeksville/mesh/buildlogic/Spotless.kt +++ b/build-logic/convention/src/main/kotlin/com/geeksville/mesh/buildlogic/Spotless.kt @@ -18,11 +18,7 @@ package com.geeksville.mesh.buildlogic import com.diffplug.gradle.spotless.SpotlessExtension -import io.gitlab.arturbosch.detekt.Detekt -import io.gitlab.arturbosch.detekt.extensions.DetektExtension import org.gradle.api.Project -import org.gradle.kotlin.dsl.dependencies -import org.gradle.kotlin.dsl.named internal fun Project.configureSpotless(extension: SpotlessExtension) = extension.apply { extension.apply { @@ -31,17 +27,19 @@ internal fun Project.configureSpotless(extension: SpotlessExtension) = extension target("src/*/kotlin/**/*.kt", "src/*/java/**/*.kt") targetExclude("**/build/**/*.kt") ktfmt().kotlinlangStyle().configure { it.setMaxWidth(120) } - ktlint("1.7.1").setEditorConfigPath(rootProject.file("config/spotless/.editorconfig").path) + ktlint(libs.findVersion("ktlint").get().requiredVersion) + .setEditorConfigPath(rootProject.file("config/spotless/.editorconfig").path) licenseHeaderFile(rootProject.file("config/spotless/copyright.kt")) } kotlinGradle { target("**/*.gradle.kts") ktfmt().kotlinlangStyle().configure { it.setMaxWidth(120) } - ktlint("1.7.1").setEditorConfigPath(rootProject.file("config/spotless/.editorconfig").path) + ktlint(libs.findVersion("ktlint").get().requiredVersion) + .setEditorConfigPath(rootProject.file("config/spotless/.editorconfig").path) licenseHeaderFile( rootProject.file("config/spotless/copyright.kts"), "(^(?![\\/ ]\\*).*$)" ) } } -} \ No newline at end of file +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9d910b35b..f1981da3d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -18,6 +18,7 @@ room = "2.8.4" kotlin = "2.2.21" kotlinx-coroutines-android = "1.10.2" kotlinx-serialization = "1.9.0" +ktlint = "1.7.1" # Google hilt = "2.57.2"