diff --git a/CHANGELOG.md b/CHANGELOG.md index dbfa54aa3..f31493991 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Changelog - project-local `gradle.properties` - root-project `local.properties` - root-project/global `gradle.properties` +- **New**: Extract `version-number` artifact. This contains a Kotlin, non-deprecated `VersionNumber` API. This is useful given that Gradle's is both deprecated and not available in standard JVM projects. - Remove defunct `foundry.git.hooksPath` and `foundry.git.ignoreRevsFile` properties. 0.20.2 diff --git a/build.gradle.kts b/build.gradle.kts index ed63160e2..de0dbd7c3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -166,6 +166,8 @@ dependencies { dokka(projects.tools.foundryCommon) dokka(projects.tools.skippy) dokka(projects.tools.tracing) + dokka(projects.tools.versionNumber) + dokka(projects.platforms.gradle.betterGradleProperties) dokka(projects.platforms.gradle.foundryGradlePlugin) dokka(projects.platforms.gradle.agpHandlers.agpHandlerApi) } diff --git a/platforms/gradle/agp-handlers/agp-handler-api/build.gradle.kts b/platforms/gradle/agp-handlers/agp-handler-api/build.gradle.kts index 94115af83..30ec00960 100644 --- a/platforms/gradle/agp-handlers/agp-handler-api/build.gradle.kts +++ b/platforms/gradle/agp-handlers/agp-handler-api/build.gradle.kts @@ -21,7 +21,7 @@ plugins { dependencies { lintChecks(libs.gradleLints) - implementation(libs.guava) + implementation(projects.tools.versionNumber) compileOnly(gradleApi()) compileOnly(libs.agp) diff --git a/platforms/gradle/foundry-gradle-plugin/build.gradle.kts b/platforms/gradle/foundry-gradle-plugin/build.gradle.kts index 70f89ce64..d70617bb3 100644 --- a/platforms/gradle/foundry-gradle-plugin/build.gradle.kts +++ b/platforms/gradle/foundry-gradle-plugin/build.gradle.kts @@ -76,6 +76,7 @@ dependencies { // Better I/O api(libs.okio) api(projects.platforms.gradle.agpHandlers.agpHandlerApi) + api(projects.tools.versionNumber) implementation(platform(libs.coroutines.bom)) implementation(libs.commonsText) { because("For access to its StringEscapeUtils") } diff --git a/platforms/gradle/foundry-gradle-plugin/src/main/kotlin/foundry/gradle/FoundryRootPlugin.kt b/platforms/gradle/foundry-gradle-plugin/src/main/kotlin/foundry/gradle/FoundryRootPlugin.kt index 6ef33b06f..dc02d750f 100644 --- a/platforms/gradle/foundry-gradle-plugin/src/main/kotlin/foundry/gradle/FoundryRootPlugin.kt +++ b/platforms/gradle/foundry-gradle-plugin/src/main/kotlin/foundry/gradle/FoundryRootPlugin.kt @@ -20,7 +20,7 @@ import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask import com.osacky.doctor.DoctorExtension import com.squareup.moshi.adapter import foundry.cli.AppleSiliconCompat -import foundry.gradle.agp.VersionNumber +import foundry.common.versioning.VersionNumber import foundry.gradle.avoidance.ComputeAffectedProjectsTask import foundry.gradle.avoidance.GenerateAndroidTestProjectPathsTask import foundry.gradle.avoidance.GenerateDependencyGraphTask diff --git a/platforms/gradle/foundry-gradle-plugin/src/main/kotlin/foundry/gradle/tasks/BaseDownloadTask.kt b/platforms/gradle/foundry-gradle-plugin/src/main/kotlin/foundry/gradle/tasks/BaseDownloadTask.kt index def20d626..e570792ee 100644 --- a/platforms/gradle/foundry-gradle-plugin/src/main/kotlin/foundry/gradle/tasks/BaseDownloadTask.kt +++ b/platforms/gradle/foundry-gradle-plugin/src/main/kotlin/foundry/gradle/tasks/BaseDownloadTask.kt @@ -15,7 +15,7 @@ */ package foundry.gradle.tasks -import foundry.gradle.agp.VersionNumber +import foundry.common.versioning.VersionNumber import java.io.IOException import javax.inject.Inject import okhttp3.OkHttpClient diff --git a/settings.gradle.kts b/settings.gradle.kts index 01e911545..81921ac9d 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -158,6 +158,7 @@ include( ":tools:foundry-common", ":tools:skippy", ":tools:tracing", + ":tools:version-number", ) // https://docs.gradle.org/5.6/userguide/groovy_plugin.html#sec:groovy_compilation_avoidance diff --git a/tools/version-number/api/version-number.api b/tools/version-number/api/version-number.api new file mode 100644 index 000000000..6cb026521 --- /dev/null +++ b/tools/version-number/api/version-number.api @@ -0,0 +1,33 @@ +public final class foundry/common/versioning/VersionNumber : java/lang/Comparable { + public static final field Companion Lfoundry/common/versioning/VersionNumber$Companion; + public fun (IIIILjava/lang/String;)V + public synthetic fun (IIIILjava/lang/String;Lfoundry/common/versioning/VersionNumber$AbstractScheme;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (IIILjava/lang/String;)V + public fun compareTo (Lfoundry/common/versioning/VersionNumber;)I + public synthetic fun compareTo (Ljava/lang/Object;)I + public fun equals (Ljava/lang/Object;)Z + public final fun getBaseVersion ()Lfoundry/common/versioning/VersionNumber; + public final fun getMajor ()I + public final fun getMicro ()I + public final fun getMinor ()I + public final fun getPatch ()I + public final fun getQualifier ()Ljava/lang/String; + public fun hashCode ()I + public fun toString ()Ljava/lang/String; +} + +public final class foundry/common/versioning/VersionNumber$Companion { + public final fun getUNKNOWN ()Lfoundry/common/versioning/VersionNumber; + public final fun parse (Ljava/lang/String;)Lfoundry/common/versioning/VersionNumber; + public final fun scheme ()Lfoundry/common/versioning/VersionNumber$Scheme; + public final fun version (I)Lfoundry/common/versioning/VersionNumber; + public final fun version (II)Lfoundry/common/versioning/VersionNumber; + public static synthetic fun version$default (Lfoundry/common/versioning/VersionNumber$Companion;IIILjava/lang/Object;)Lfoundry/common/versioning/VersionNumber; + public final fun withPatchNumber ()Lfoundry/common/versioning/VersionNumber$Scheme; +} + +public abstract interface class foundry/common/versioning/VersionNumber$Scheme { + public abstract fun format (Lfoundry/common/versioning/VersionNumber;)Ljava/lang/String; + public abstract fun parse (Ljava/lang/String;)Lfoundry/common/versioning/VersionNumber; +} + diff --git a/tools/version-number/build.gradle.kts b/tools/version-number/build.gradle.kts new file mode 100644 index 000000000..21b5ba8fb --- /dev/null +++ b/tools/version-number/build.gradle.kts @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2024 Slack Technologies, LLC + * + * 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. + */ +plugins { + alias(libs.plugins.kotlin.jvm) + alias(libs.plugins.mavenPublish) + alias(libs.plugins.lint) +} + +dependencies { implementation(libs.guava) } diff --git a/tools/version-number/gradle.properties b/tools/version-number/gradle.properties new file mode 100644 index 000000000..48d67f665 --- /dev/null +++ b/tools/version-number/gradle.properties @@ -0,0 +1,3 @@ +POM_ARTIFACT_ID=version-number +POM_NAME=VersionNumber +POM_DESCRIPTION=VersionNumber diff --git a/platforms/gradle/agp-handlers/agp-handler-api/src/main/kotlin/foundry/gradle/agp/VersionNumber.kt b/tools/version-number/src/main/kotlin/foundry/common/versioning/VersionNumber.kt similarity index 98% rename from platforms/gradle/agp-handlers/agp-handler-api/src/main/kotlin/foundry/gradle/agp/VersionNumber.kt rename to tools/version-number/src/main/kotlin/foundry/common/versioning/VersionNumber.kt index 8d7deed28..e1dd52a87 100644 --- a/platforms/gradle/agp-handlers/agp-handler-api/src/main/kotlin/foundry/gradle/agp/VersionNumber.kt +++ b/tools/version-number/src/main/kotlin/foundry/common/versioning/VersionNumber.kt @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package foundry.gradle.agp +package foundry.common.versioning import com.google.common.collect.Ordering import java.util.Locale @@ -101,7 +101,7 @@ private constructor( private abstract class AbstractScheme protected constructor(val depth: Int) : Scheme { override fun parse(value: String?): VersionNumber { - if (value == null || value.isEmpty()) { + if (value.isNullOrEmpty()) { return UNKNOWN } val scanner = Scanner(value)