[Gradle] Implement AndroidGradlePluginVersion util

^KT-54033 WIP
This commit is contained in:
Sebastian Sellmair
2022-09-19 09:58:27 +02:00
committed by Space
parent 3a39a0d468
commit 32f86d4672
4 changed files with 133 additions and 1 deletions
@@ -91,8 +91,10 @@ dependencies {
if (!kotlinBuildProperties.isInJpsBuildIdeaSync) {
val functionalTestImplementation by configurations.getting
val functionalTestCompileOnly by configurations.getting
functionalTestImplementation("com.android.tools.build:gradle:7.2.1")
functionalTestImplementation("com.android.tools.build:gradle-api:7.2.1")
functionalTestCompileOnly("com.android.tools:common:30.2.1")
functionalTestImplementation(gradleKotlinDsl())
functionalTestImplementation(project(":kotlin-gradle-plugin-kpm-android"))
functionalTestImplementation(project(":kotlin-tooling-metadata"))
@@ -0,0 +1,84 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("DuplicatedCode", "FunctionName")
package org.jetbrains.kotlin.gradle.plugin
import com.android.Version
import java.io.Serializable
import java.util.*
internal fun AndroidGradlePluginVersion(versionString: String): AndroidGradlePluginVersion {
return AndroidGradlePluginVersionOrNull(versionString)
?: throw IllegalArgumentException("Invalid Android Gradle Plugin version: $versionString")
}
internal fun AndroidGradlePluginVersionOrNull(versionString: String): AndroidGradlePluginVersion? {
val baseVersion = versionString.split("-", limit = 2)[0]
val classifier = versionString.split("-", limit = 2).getOrNull(1)
val baseVersionSplit = baseVersion.split(".")
if (!(baseVersionSplit.size == 2 || baseVersionSplit.size == 3)) return null
return AndroidGradlePluginVersion(
major = baseVersionSplit[0].toIntOrNull() ?: return null,
minor = baseVersionSplit[1].toIntOrNull() ?: return null,
patch = baseVersionSplit.getOrNull(2)?.let { it.toIntOrNull() ?: return null } ?: 0,
classifier = classifier
)
}
internal data class AndroidGradlePluginVersion(
val major: Int,
val minor: Int,
val patch: Int = 0,
val classifier: String? = null
) : Comparable<AndroidGradlePluginVersion>, Serializable {
override fun compareTo(other: AndroidGradlePluginVersion): Int {
if (this === other) return 0
(this.major - other.major).takeIf { it != 0 }?.let { return it }
(this.minor - other.minor).takeIf { it != 0 }?.let { return it }
(this.patch - other.patch).takeIf { it != 0 }?.let { return it }
if (this.classifier == null && other.classifier == null) return 0
if (this.classifier == null) return 1
if (other.classifier == null) return -1
val thisClassifierLowercase = this.classifier.toLowerCase(Locale.ROOT)
val otherClassifierLowercase = other.classifier.toLowerCase(Locale.ROOT)
if (thisClassifierLowercase == otherClassifierLowercase) return 0
return thisClassifierLowercase.compareTo(otherClassifierLowercase)
}
override fun toString(): String {
return "$major.$minor.$patch" + if (classifier != null) "-$classifier" else ""
}
companion object {
/**
* The currently applied/accessible Android Gradle Plugin version
*/
val current: AndroidGradlePluginVersion? = try {
AndroidGradlePluginVersion(Version.ANDROID_GRADLE_PLUGIN_VERSION)
} catch (_: LinkageError) {
null
}
}
}
internal operator fun AndroidGradlePluginVersion.compareTo(versionString: String): Int {
return this.compareTo(AndroidGradlePluginVersion(versionString))
}
internal fun AndroidGradlePluginVersion?.isAtLeast(versionString: String): Boolean {
if (this == null) return false
return this >= AndroidGradlePluginVersion(versionString)
}
internal fun AndroidGradlePluginVersion?.isAtLeast(version: AndroidGradlePluginVersion): Boolean {
if (this == null) return false
return this >= version
}
@@ -0,0 +1,46 @@
/*
* Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("FunctionName")
package org.jetbrains.kotlin.gradle
import org.jetbrains.kotlin.gradle.plugin.AndroidGradlePluginVersion
import org.jetbrains.kotlin.gradle.plugin.AndroidGradlePluginVersionOrNull
import org.jetbrains.kotlin.gradle.plugin.isAtLeast
import org.junit.Test
import kotlin.test.*
class AndroidGradlePluginVersionTest {
@Test
fun `test - AndroidGradlePluginVersion current - matches AGP version`() {
assertEquals(com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION, assertNotNull(AndroidGradlePluginVersion.current).toString())
}
@Test
fun `test - compare`() {
assertTrue(AndroidGradlePluginVersion("3.6") <= AndroidGradlePluginVersion("3.6"))
assertTrue(AndroidGradlePluginVersion("3.6") >= AndroidGradlePluginVersion("3.6"))
assertTrue(AndroidGradlePluginVersion("4.2") > AndroidGradlePluginVersion("3.6"))
assertTrue(AndroidGradlePluginVersion("4.2") < AndroidGradlePluginVersion("7.2.1"))
assertTrue(AndroidGradlePluginVersion("7.0.0-alpha01") < AndroidGradlePluginVersion("7.0.0-alpha02"))
assertTrue(AndroidGradlePluginVersion("7.0.0") > AndroidGradlePluginVersion("7.0.0-alpha02"))
}
@Test
fun `test - invalid version string`() {
assertNull(AndroidGradlePluginVersionOrNull("x"))
assertFailsWith<IllegalArgumentException> { AndroidGradlePluginVersion("x") }
}
@Test
fun `test - atLeast`() {
assertFalse(null.isAtLeast("1.0"))
assertTrue(AndroidGradlePluginVersion("1.0").isAtLeast("1.0"))
assertTrue(AndroidGradlePluginVersion("1.0").isAtLeast(AndroidGradlePluginVersion("1.0")))
}
}
@@ -3,7 +3,7 @@
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
@file:Suppress("FunctionName")
@file:Suppress("FunctionName", "DuplicatedCode")
package org.jetbrains.kotlin.tooling.core