From 238ef0a16290e2084b5567491018fca4bf673b75 Mon Sep 17 00:00:00 2001 From: Hartmut Bauer Date: Sat, 19 Sep 2026 03:03:18 +0200 Subject: [PATCH] Versioning for program modules added --- build.gradle.kts | 4 + gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 2 +- .../net/keinekekse/version/AddVersionTask.kt | 88 +++++++++++++++---- .../net/keinekekse/version/VersionPlugin.kt | 37 +++++++- .../version/VersionPluginExtension.kt | 3 + 6 files changed, 117 insertions(+), 19 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index c76fdf1..5fd4222 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,6 +41,10 @@ gradlePlugin { } } +kotlin { + jvmToolchain(masterLibs.versions.javaVersion.get().toInt()) +} + java { toolchain { languageVersion.set(JavaLanguageVersion.of(masterLibs.versions.javaVersion.get())) diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 23449a2..c61a118 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle.kts b/settings.gradle.kts index 744c1a2..9dc6564 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,7 +7,7 @@ dependencyResolutionManagement { versionCatalogs { create("masterLibs") { - from("net.keinekekse:version-catalog:107") + from("net.keinekekse:version-catalog:141") } } } diff --git a/src/main/kotlin/net/keinekekse/version/AddVersionTask.kt b/src/main/kotlin/net/keinekekse/version/AddVersionTask.kt index ba406b0..758d769 100644 --- a/src/main/kotlin/net/keinekekse/version/AddVersionTask.kt +++ b/src/main/kotlin/net/keinekekse/version/AddVersionTask.kt @@ -5,10 +5,12 @@ import io.github.z4kn4fein.semver.withoutSuffixes import org.gradle.api.DefaultTask import org.gradle.api.file.ConfigurableFileCollection import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.api.tasks.* import java.util.* +@CacheableTask abstract class AddVersionTask : DefaultTask() { // 1. Define what triggers the task (Source Files) @@ -41,6 +43,9 @@ abstract class AddVersionTask : DefaultTask() { @get:Input abstract val versionPackageName: Property + @get:Input + abstract val modules: MapProperty> + @TaskAction fun execute() { val buildNumber = incrementAndGetBuildNumber() @@ -48,17 +53,61 @@ abstract class AddVersionTask : DefaultTask() { } private fun writeClassFile(buildNumber: String) { - val ver = getVersionInfo(buildNumber) - - val file = versionClassFile.get().asFile - file.parentFile.mkdirs() - file.writeText( + var fileContent = """ package ${versionPackageName.get()} import net.keinekekse.version.Version - object VERSION: Version { + """.trimIndent() + + buildVersionObject( + "", + projectVersion.get(), + buildNumber, + displayNameExtra.get(), + copyrightExtra.get(), + projectName.get(), + projectDescription.get() + ) + if (modules.isPresent) { + modules.get().forEach { (moduleName, moduleInfo) -> + fileContent += + buildVersionObject( + moduleName, + moduleInfo["version"] ?: "", + buildNumber, + moduleInfo["displayName"] ?: moduleName, + moduleInfo["copyright"] ?: copyrightExtra.get(), + moduleName, + moduleInfo["description"] ?: "" + ) + } + } + + val file = versionClassFile.get().asFile + file.parentFile.mkdirs() + file.writeText(fileContent) + } + + private fun buildVersionObject( + moduleName: String, + versionString: String, + buildNumber: String, + longName: String, + copy: String, + shortName: String, + desc: String, + ): String { + val ver = getVersionInfo(versionString, buildNumber, longName, copy, shortName, desc) + val module = if (moduleName.isBlank()) { + "" + } else { + "_$moduleName" + } + + return """ + + object VERSION$module: Version { override val version = "${ver.version}" override val fullVersion = "${ver.fullVersion}" override val major = ${ver.major} @@ -73,15 +122,21 @@ abstract class AddVersionTask : DefaultTask() { override val description = "${ver.description}" } """.trimIndent() - ) } - private fun getVersionInfo(buildNumber: String): VersionInfo { + private fun getVersionInfo( + versionString: String, + buildNumber: String, + longName: String, + copy: String, + shortName: String, + desc: String, + ): VersionInfo { val version = - if (Version.parse(projectVersion.get(), strict = false).buildMetadata.isNullOrEmpty()) - Version.parse(projectVersion.get() + "+build.$buildNumber", strict = false) - else Version.parse(projectVersion.get(), strict = false) + if (Version.parse(versionString, strict = false).buildMetadata.isNullOrEmpty()) + Version.parse("$versionString+build.$buildNumber", strict = false) + else Version.parse(versionString, strict = false) println("Source files changed. Setting version to $version") @@ -92,13 +147,14 @@ abstract class AddVersionTask : DefaultTask() { preRelease = version.preRelease ?: "", buildMetadata = version.buildMetadata ?: "", fullVersion = version.toString(), - version = if (version.isPreRelease) version.toString() else + version = if (version.isPreRelease) + "${version.major}.${version.minor}.${version.patch}-${version.preRelease}" else version.withoutSuffixes().toString(), buildDate = java.time.Instant.now().toString(), - displayName = displayNameExtra.get(), - copyright = copyrightExtra.get(), - name = projectName.get(), - description = projectDescription.get() ?: "" + displayName = longName, + copyright = copy, + name = shortName, + description = desc ) } diff --git a/src/main/kotlin/net/keinekekse/version/VersionPlugin.kt b/src/main/kotlin/net/keinekekse/version/VersionPlugin.kt index 270c45e..ec5230a 100644 --- a/src/main/kotlin/net/keinekekse/version/VersionPlugin.kt +++ b/src/main/kotlin/net/keinekekse/version/VersionPlugin.kt @@ -36,6 +36,18 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension * versionConfig { * versionClassFile.set(layout.projectDirectory.file("src/main/kotlin/Version.kt")) * versionPackageName.set("net.keinekekse") + * + * // Optional Versionen von Teilbereichen des Programms + * modules.set( + * mapOf( + * "books" to mapOf( // -> object VERSION_books + * "version" to libs.versions.books.get(), + * "displayName" to "Books-DB", + * "copyright" to "Copyright (c) 2026 Hartmut Bauer", // null => extra["copyright] + * "description" to "Books + Comics Database" // null => "" + * ) + * ) + * ) * } * ``` * @@ -45,7 +57,7 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension * import net.keinekekse.version.Version // -> util-Lib * * object VERSION: Version { - * override val version = "1.0.0-beta.1+build.13" // für Release-Ver: major.minor.patch + * override val version = "1.0.0-beta.1 // für Release-Ver: major.minor.patch * override val fullVersion = "1.0.0-beta.1+build.13" * override val major = 1 * override val minor = 0 @@ -58,6 +70,20 @@ import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension * override val name = "program-name" * override val description = "Program description" * } + * object VERSION_books: Version { + * override val version = "0.1.0-alpha.1" + * override val fullVersion = "0.1.0-alpha.1+build.11" + * override val major = 0 + * override val minor = 1 + * override val patch = 0 + * override val preRelease = "alpha.1" + * override val buildMetadata = "build.11" + * override val buildDate = "2026-09-19T00:18:40.584742Z" + * override val displayName = "Books-DB" + * override val copyright = "Copyright (c) 2026 Hartmut Bauer" + * override val name = "books" + * override val description = "Books + Comics Database" + * } * ``` * * @@ -123,6 +149,15 @@ class VersionPlugin : Plugin { if (it.has("copyright")) it.get("copyright")?.toString() else "" } }) + if (extension.modules.isPresent) { + modules.set(extension.modules) + extension.modules.get().forEach { (moduleName, moduleInfo) -> +// project.extensions.create("${moduleName}Version", VersionPluginExtension::class.java).apply { +// versionClassFile.set(project.layout.buildDirectory.file("generated/sources/version/${moduleName}/kotlin/${project.name}-version.kt")) +// modules.set(moduleInfo) +// } + } + } } // 1. Handle Kotlin/JVM (Standard Project) diff --git a/src/main/kotlin/net/keinekekse/version/VersionPluginExtension.kt b/src/main/kotlin/net/keinekekse/version/VersionPluginExtension.kt index 912a388..9e25d96 100644 --- a/src/main/kotlin/net/keinekekse/version/VersionPluginExtension.kt +++ b/src/main/kotlin/net/keinekekse/version/VersionPluginExtension.kt @@ -1,10 +1,13 @@ package net.keinekekse.version import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property interface VersionPluginExtension { val versionPackageName: Property val versionClassFile: RegularFileProperty + + val modules: MapProperty> }