diff --git a/build-logic/kotlin-plugins/build.gradle.kts b/build-logic/kotlin-plugins/build.gradle.kts index b3a38d28..09d33ac9 100644 --- a/build-logic/kotlin-plugins/build.gradle.kts +++ b/build-logic/kotlin-plugins/build.gradle.kts @@ -46,6 +46,10 @@ gradlePlugin { id = "dev.msfjarvis.claw.spotless" implementationClass = "dev.msfjarvis.aps.gradle.SpotlessPlugin" } + register("versions") { + id = "dev.msfjarvis.claw.versions" + implementationClass = "dev.msfjarvis.aps.gradle.DependencyUpdatesPlugin" + } } } @@ -54,4 +58,6 @@ dependencies { implementation(libs.build.kotlin.gradle) implementation(libs.build.kotlin.serialization) implementation(libs.build.spotless) + implementation(libs.build.vcu) + implementation(libs.build.versions) } diff --git a/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/DependencyUpdatesPlugin.kt b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/DependencyUpdatesPlugin.kt new file mode 100644 index 00000000..07e72b87 --- /dev/null +++ b/build-logic/kotlin-plugins/src/main/kotlin/dev/msfjarvis/aps/gradle/DependencyUpdatesPlugin.kt @@ -0,0 +1,43 @@ +package dev.msfjarvis.aps.gradle + +import com.github.benmanes.gradle.versions.VersionsPlugin +import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask +import java.util.Locale +import nl.littlerobots.vcu.plugin.VersionCatalogUpdateExtension +import nl.littlerobots.vcu.plugin.VersionCatalogUpdatePlugin +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.getByType +import org.gradle.kotlin.dsl.withType + +@Suppress("Unused") +class DependencyUpdatesPlugin : Plugin { + override fun apply(project: Project) { + project.pluginManager.apply(VersionsPlugin::class) + project.pluginManager.apply(VersionCatalogUpdatePlugin::class) + project.tasks.withType().configureEach { + rejectVersionIf { + when (candidate.group) { + "com.android.application", + "com.android.library", + "com.google.accompanist", + "org.jetbrains.kotlin" -> true + else -> isNonStable(candidate.version) && !isNonStable(currentVersion) + } + } + checkForGradleUpdate = false + } + project.extensions.getByType().run { + keep.keepUnusedLibraries.set(true) + } + } + + private fun isNonStable(version: String): Boolean { + val stableKeyword = + listOf("RELEASE", "FINAL", "GA").any { version.toUpperCase(Locale.ROOT).contains(it) } + val regex = "^[\\d,.v-]+(-r)?$".toRegex() + val isStable = stableKeyword || regex.matches(version) + return isStable.not() + } +} diff --git a/build.gradle.kts b/build.gradle.kts index fb8a7173..3ba8d1f7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("dev.msfjarvis.claw.spotless") - // id("dev.msfjarvis.claw.versions") + id("dev.msfjarvis.claw.versions") id("dev.msfjarvis.claw.kotlin-common") alias(libs.plugins.hilt) apply false alias(libs.plugins.android.test) apply false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1940868a..5747dc03 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -43,6 +43,8 @@ build-cachefix = "org.gradle.android.cache-fix:org.gradle.android.cache-fix.grad build-kotlin-gradle = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } build-kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin" } build-spotless = "com.diffplug.spotless:spotless-plugin-gradle:6.7.2" +build-vcu = "nl.littlerobots.version-catalog-update:nl.littlerobots.version-catalog-update.gradle.plugin:0.5.1" +build-versions = "com.github.ben-manes:gradle-versions-plugin:0.42.0" coil = { module = "io.coil-kt:coil", version.ref = "coil" } coil-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" } compose-richtext-markdown = { module = "com.halilibo.compose-richtext:richtext-commonmark", version.ref = "richtext" }