Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions tapmoc-gradle-plugin/api/tapmoc-gradle-plugin.api
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,11 @@ public abstract interface class tapmoc/TapmocExtension {
public abstract fun checkDependencies ()V
public abstract fun checkDependencies (Ltapmoc/Severity;)V
public abstract fun checkRuntimeDependencies (Ltapmoc/Severity;)V
public abstract fun gradle (Ljava/lang/String;)V
public abstract fun java (I)V
public abstract fun javaVersionForGradle (Ljava/lang/String;)I
public abstract fun kotlin (Ljava/lang/String;)V
public abstract fun kotlinVersionForGradle (Ljava/lang/String;)Ljava/lang/String;
}

public abstract class tapmoc/TapmocPlugin : org/gradle/api/Plugin {
Expand Down
28 changes: 28 additions & 0 deletions tapmoc-gradle-plugin/src/main/kotlin/tapmoc/TapmocExtension.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,34 @@ interface TapmocExtension {
*/
fun kotlin(version: String)

/**
* Configures the minimal Gradle version supported.
*
* This method:
* - Calls [kotlin] with the compatible Kotlin version as described in the [Gradle compatibility matrix](https://docs.gradle.org/current/userguide/compatibility.html#kotlin).
* - Calls [java] with the compatible Java version as described in the [Gradle compatibility matrix](https://docs.gradle.org/current/userguide/compatibility.html#java_runtime).
*
* @param gradleVersion the Gradle version to target, specified as a string. Example: "8.14".
*/
fun gradle(gradleVersion: String)

/**
* Returns the minimal version of Java required to run the given Gradle version.
*
* Gradle versions between 2.0 and 8.14 require Java 8.
* Gradle 9.0.0 requires Java 17.
*
* See https://docs.gradle.org/current/userguide/compatibility.html#java
*/
fun javaVersionForGradle(gradleVersion: String): Int

/**
* Returns the languageVersion used to compile Kotlin build scripts.
*
* See https://docs.gradle.org/current/userguide/compatibility.html#kotlin
*/
fun kotlinVersionForGradle(gradleVersion: String): String

@Deprecated("Use checkDependencies instead.", ReplaceWith("checkDependencies(severity)"))
fun checkApiDependencies(severity: Severity)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,20 @@ internal abstract class TapmocExtensionImpl(private val project: Project) : Tapm
project.configureKotlinCompatibility(version)
}

override fun gradle(gradleVersion: String) {
val major = parseGradleMajorVersion(gradleVersion)
kotlin(kotlinVersionForGradle(major))
java(javaVersionForGradle(major))
}

override fun javaVersionForGradle(gradleVersion: String): Int {
return javaVersionForGradle(parseGradleMajorVersion(gradleVersion))
}

override fun kotlinVersionForGradle(gradleVersion: String): String {
return kotlinVersionForGradle(parseGradleMajorVersion(gradleVersion))
}

override fun checkDependencies() {
checkDependencies(Severity.ERROR)
}
Expand Down
49 changes: 49 additions & 0 deletions tapmoc-gradle-plugin/src/main/kotlin/tapmoc/internal/gradle.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package tapmoc.internal

internal fun kotlinVersionForGradle(major: Int): String {
/**
* We use `languageVersion` as the compatible Kotlin version.
*
* Note: `languageVersion` is lower than the Kotlin embedded version.
* - Gradle may bump the Kotlin embedded version in Gradle minor releases.
* - The Kotlin `languageVersion` is only bumped in major releases.
*
* This is to avoid the occasional Kotlin source-breaking changes to break existing
* builds in a minor Gradle release.
*
* See https://docs.gradle.org/current/userguide/compatibility.html#kotlin
*
*/
return when {
major >= 9 -> "2.2.0"
major >= 8 -> "1.8.0"
major >= 7 -> "1.4.0"
else -> error("Gradle versions < 7.0 are not supported (found '$major')")
}
}

internal fun javaVersionForGradle(major: Int): Int {
/**
* See https://docs.gradle.org/current/userguide/compatibility.html#java
*/
return when {
major >= 9 -> 17
major >= 5 -> 8
else -> error("Gradle versions < 5 are not supported (found '$major')")
}
}

internal fun parseGradleMajorVersion(gradleVersion: String): Int {
val c = gradleVersion.split('.')
check (c.isNotEmpty()) {
"Tapmoc: gradleVersion should be in the form `major[.minor[.patch]]` (found '$gradleVersion')"
}

val major = c.get(0).toIntOrNull()

check (major != null) {
"Tapmoc: major version must be an integer (found '$major' in '$gradleVersion')"
}

return major
}
9 changes: 4 additions & 5 deletions tests/gradle-plugin/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,14 @@ plugins {
}

tapmoc {
// Gradle 8.3 uses Kotlin 1.9
java(11)
kotlin("1.9.0")
// Gradle 8.3 uses Kotlin languageVersion 1.8
gradle("8.3")
checkDependencies()
}

checkPublication {
jvmTarget.set(11)
kotlinMetadataVersion.set("1.9.0")
jvmTarget.set(8)
kotlinMetadataVersion.set("1.8.0")
}

dependencies {
Expand Down