diff --git a/kotlin-preprocessors/build.gradle.kts b/kotlin-preprocessors/build.gradle.kts index 27f039b..b691366 100644 --- a/kotlin-preprocessors/build.gradle.kts +++ b/kotlin-preprocessors/build.gradle.kts @@ -1,28 +1,31 @@ -import org.ajoberstar.grgit.Commit -import org.ajoberstar.grgit.Grgit +import versioning.GitTagValueSource +import versioning.GitHashValueSource plugins { kotlin("jvm") `kotlin-dsl` - id("org.ajoberstar.grgit") version "5.3.2" id("com.utopia-rise.maven-central-publish") id("com.gradle.plugin-publish") version "1.2.0" `java-gradle-plugin` } -val baseVersion = "0.1.4" +val baseVersion = "0.2.1" -val grgit = Grgit.open(mapOf("currentDir" to project.rootDir)) +val exactTag = providers.of(GitTagValueSource::class) { + parameters.workDir.set(layout.projectDirectory) +} + +val shortHash = providers.of(GitHashValueSource::class) { + parameters.workDir.set(layout.projectDirectory) + parameters.abbrev.set(7) +} -val currentCommit: Commit = grgit.head() -// check if the current commit is tagged -var tagOnCurrentCommit = grgit.tag.list().firstOrNull { tag -> tag.commit.id == currentCommit.id } -var releaseMode = tagOnCurrentCommit != null +logger.lifecycle("Current tag is: ${exactTag.orNull}") +logger.lifecycle("Current commit hash is: ${shortHash.orNull}") -version = if (!releaseMode) { - "$baseVersion-${currentCommit.abbreviatedId}-SNAPSHOT" -} else { - requireNotNull(tagOnCurrentCommit).name +val tagValue = exactTag.get() +version = tagValue.ifBlank { + "$baseVersion-${shortHash.get()}-SNAPSHOT" } group = "com.utopia-rise" diff --git a/kotlin-preprocessors/buildSrc/src/main/kotlin/versioning/GitHashValueSource.kt b/kotlin-preprocessors/buildSrc/src/main/kotlin/versioning/GitHashValueSource.kt new file mode 100644 index 0000000..62e96a1 --- /dev/null +++ b/kotlin-preprocessors/buildSrc/src/main/kotlin/versioning/GitHashValueSource.kt @@ -0,0 +1,33 @@ +package versioning + +import org.gradle.api.GradleException +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.provider.ValueSourceParameters +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity + +abstract class GitHashValueSource : GitValueSource() { + interface Params : ValueSourceParameters { + @get:InputDirectory + @get:PathSensitive(PathSensitivity.RELATIVE) + val workDir: DirectoryProperty + + @get:Input + val abbrev: Property + } + + override fun obtain(): String { + val workDir = parameters.workDir.asFile.get() + val abbrev = parameters.abbrev.orNull ?: 7 + + val shortHead = runGitCommand(workDir, "rev-parse", "--short=$abbrev", "HEAD") + if (shortHead.exitCode == 0) { + val hash = shortHead.output.trim() + if (hash.matches(Regex("[0-9a-fA-F]{4,40}"))) return hash + } + throw GradleException("Failed to obtain short git hash (exit=${shortHead.exitCode}, out=${shortHead.output.trim()})") + } +} \ No newline at end of file diff --git a/kotlin-preprocessors/buildSrc/src/main/kotlin/versioning/GitTagValueSource.kt b/kotlin-preprocessors/buildSrc/src/main/kotlin/versioning/GitTagValueSource.kt new file mode 100644 index 0000000..a962ae0 --- /dev/null +++ b/kotlin-preprocessors/buildSrc/src/main/kotlin/versioning/GitTagValueSource.kt @@ -0,0 +1,26 @@ +package versioning + +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.ValueSourceParameters +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.PathSensitive +import org.gradle.api.tasks.PathSensitivity + +abstract class GitTagValueSource : GitValueSource() { + interface Params : ValueSourceParameters { + @get:InputDirectory + @get:PathSensitive(PathSensitivity.RELATIVE) + val workDir: DirectoryProperty + } + + override fun obtain(): String { + val workDir = parameters.workDir.asFile.get() + + val exactTag = runGitCommand(workDir, "describe", "--tags", "--exact-match") + return if (exactTag.exitCode == 0) { + exactTag.output.trim() + } else { + "" + } + } +} \ No newline at end of file diff --git a/kotlin-preprocessors/buildSrc/src/main/kotlin/versioning/GitValueSource.kt b/kotlin-preprocessors/buildSrc/src/main/kotlin/versioning/GitValueSource.kt new file mode 100644 index 0000000..61ca615 --- /dev/null +++ b/kotlin-preprocessors/buildSrc/src/main/kotlin/versioning/GitValueSource.kt @@ -0,0 +1,23 @@ +package versioning + +import org.gradle.api.provider.ValueSource +import org.gradle.api.provider.ValueSourceParameters +import java.io.File + +abstract class GitValueSource : ValueSource { + protected fun runGitCommand(workingDir: File, vararg args: String): Result { + return try { + val pb = ProcessBuilder(listOf("git") + args.toList()) + pb.directory(workingDir) + pb.redirectErrorStream(true) + val proc = pb.start() + val output = proc.inputStream.bufferedReader().readText() + val exit = proc.waitFor() + Result(exit, output) + } catch (e: Exception) { + Result(1, e.message ?: e::class.java.name) + } + } + + protected data class Result(val exitCode: Int, val output: String) +} \ No newline at end of file diff --git a/kotlin-preprocessors/settings.gradle.kts b/kotlin-preprocessors/settings.gradle.kts index 44c2006..a2e7852 100644 --- a/kotlin-preprocessors/settings.gradle.kts +++ b/kotlin-preprocessors/settings.gradle.kts @@ -1,3 +1,7 @@ rootProject.name = "kotlin-preprocessors" +plugins { + // downloads missing jdk for `jvmToolchain` see: https://docs.gradle.org/current/userguide/toolchains.html#sub:download_repositories + id("org.gradle.toolchains.foojay-resolver-convention") version("1.0.0") // https://github.com/gradle/foojay-toolchains/tags +} diff --git a/kotlin-preprocessors/src/main/kotlin/com/utopiarise/kotlin/preprocessors/gradle/PreProcessorPlugin.kt b/kotlin-preprocessors/src/main/kotlin/com/utopiarise/kotlin/preprocessors/gradle/PreProcessorPlugin.kt index afd53b6..42e7e10 100644 --- a/kotlin-preprocessors/src/main/kotlin/com/utopiarise/kotlin/preprocessors/gradle/PreProcessorPlugin.kt +++ b/kotlin-preprocessors/src/main/kotlin/com/utopiarise/kotlin/preprocessors/gradle/PreProcessorPlugin.kt @@ -75,7 +75,7 @@ class PreProcessorPlugin : Plugin { description = "Generate definitions for kotlin as constants." } - val generatedKotlinDefinitionsDirectory = project.buildDir.resolve("definitions") + val generatedKotlinDefinitionsDirectory = project.layout.buildDirectory.asFile.get().resolve("definitions") project .kotlinExtension