From 6c964e28ee874fade0b5514f5d00b6ad583b2b89 Mon Sep 17 00:00:00 2001 From: JFronny Date: Sun, 26 May 2024 11:37:36 +0200 Subject: [PATCH] fix(autoversion): try to support configuration cache --- .../gitlab/jfronny/scripts/BumpVersionTask.kt | 35 +++++++++++++++++++ .../io/gitlab/jfronny/scripts/CopyTextTask.kt | 22 ++++++++++++ .../io/gitlab/jfronny/scripts/SharedProps.kt | 17 +++++++-- .../src/main/kotlin/jf.autoversion.gradle.kts | 28 +++++---------- 4 files changed, 79 insertions(+), 23 deletions(-) create mode 100644 convention/src/main/kotlin/io/gitlab/jfronny/scripts/BumpVersionTask.kt create mode 100644 convention/src/main/kotlin/io/gitlab/jfronny/scripts/CopyTextTask.kt diff --git a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/BumpVersionTask.kt b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/BumpVersionTask.kt new file mode 100644 index 0000000..753a827 --- /dev/null +++ b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/BumpVersionTask.kt @@ -0,0 +1,35 @@ +package io.gitlab.jfronny.scripts + +import org.eclipse.jgit.api.Git +import org.gradle.api.DefaultTask +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.InputDirectory +import org.gradle.api.tasks.TaskAction + +abstract class BumpVersionTask : DefaultTask() { + init { + description = "Bumps the version by parsing commits since the last tag and creating a new tag based on them" + } + + @get:InputDirectory abstract val gitDir: DirectoryProperty + @get:Input abstract val isRelease: Property + @get:Input abstract val nextVersionType: Property + @get:Input abstract val nextRelease: Property + @get:Input abstract val lastRelease: Property + + @TaskAction + fun action() { + if (!gitDir.asFile.get().exists()) throw IllegalStateException("Cannot bump without repository") + if (isRelease.get()) throw IllegalStateException("Cannot bump while 'release' is set") + val vt = nextVersionType + .map { VersionType.byName(it) ?: throw IllegalStateException("Unrecognized version type: $this") } + .getOrThrow { IllegalStateException("bumpVersion requires you to set -PversionType=release|beta|alpha") } + val name = nextRelease.get().withType(vt).toString() + Git.open(gitDir.asFile.get()).use { git -> + git.tag().setName(name).call() + logger.warn("Created release $name (last was ${lastRelease.get()}). Make sure to push it!") + } + } +} \ No newline at end of file diff --git a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/CopyTextTask.kt b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/CopyTextTask.kt new file mode 100644 index 0000000..26cc229 --- /dev/null +++ b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/CopyTextTask.kt @@ -0,0 +1,22 @@ +package io.gitlab.jfronny.scripts + +import org.gradle.api.DefaultTask +import org.gradle.api.provider.Property +import org.gradle.api.tasks.Input +import org.gradle.api.tasks.TaskAction +import java.awt.Toolkit +import java.awt.datatransfer.StringSelection + +abstract class CopyTextTask : DefaultTask() { + init { + description = "Copies a piece of text to the system clipboard" + } + + @get:Input abstract val text: Property + + @TaskAction + fun action() { + Toolkit.getDefaultToolkit().systemClipboard.setContents(StringSelection(project.versionS), null) + println("Copied version number: ${project.versionS}") + } +} \ No newline at end of file diff --git a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/SharedProps.kt b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/SharedProps.kt index 826dbcd..bf31f60 100644 --- a/convention/src/main/kotlin/io/gitlab/jfronny/scripts/SharedProps.kt +++ b/convention/src/main/kotlin/io/gitlab/jfronny/scripts/SharedProps.kt @@ -4,6 +4,7 @@ import org.gradle.api.Action import org.gradle.api.DefaultTask import org.gradle.api.Project import org.gradle.api.Task +import org.gradle.api.provider.Provider import org.gradle.api.tasks.TaskContainer import org.gradle.kotlin.dsl.extra import org.gradle.kotlin.dsl.named @@ -46,12 +47,22 @@ var Project.flavour: String val TaskContainer.deployDebug: Task get() = findByName("deployDebug") ?: register("deployDebug").get().dependsOn(named("build").get()) val TaskContainer.deployRelease: Task get() = findByName("deployRelease") ?: register("deployRelease").get().dependsOn(deployDebug) -fun Project.prop(name: String, default: String? = null): String = - if (default == null || hasProperty(name)) property(name).toString() +fun Project.prop(name: String): String = property(name).toString() + +fun Project.prop(name: String, default: String): String = + if (hasProperty(name)) prop(name) + else default + +fun Project.prop(name: String, default: String?): String? = + if (hasProperty(name)) prop(name) else default // Utility to run actions on values fun T.runAction(action: Action?): T { action?.execute(this!!) return this -} \ No newline at end of file +} + +fun Provider.getOrThrow(exception: () -> Exception): T = + if (!isPresent) throw exception() + else get() diff --git a/convention/src/main/kotlin/jf.autoversion.gradle.kts b/convention/src/main/kotlin/jf.autoversion.gradle.kts index b86c863..6aa0ac0 100644 --- a/convention/src/main/kotlin/jf.autoversion.gradle.kts +++ b/convention/src/main/kotlin/jf.autoversion.gradle.kts @@ -1,7 +1,5 @@ import io.gitlab.jfronny.scripts.* import org.eclipse.jgit.api.Git -import java.awt.Toolkit -import java.awt.datatransfer.StringSelection import kotlin.jvm.optionals.getOrDefault val isRelease = project.hasProperty("release") @@ -60,25 +58,15 @@ if (!isRelease) { println(changelog) -tasks.register("copyVersionNumber") { +tasks.register("copyVersionNumber", CopyTextTask::class) { description = "Copy the current version number to the system clipboard" - doLast { - Toolkit.getDefaultToolkit().systemClipboard.setContents(StringSelection(versionS), null) - println("Copied version number: $versionS") - } + text.set(versionS) } -tasks.register("bumpVersion") { - description = "Bump the version by parsing commits since the last tag and creating a new tag based on them" - doLast { - if (!File(projectDir, ".git").exists()) throw IllegalStateException("Cannot bump without repository") - if (isRelease) throw IllegalStateException("Cannot bump while 'release' is set") - if (!project.hasProperty("versionType")) throw IllegalStateException("bumpVersion requires you to set -PversionType=release|beta|alpha") - val vt = prop("nextVersionType").run { VersionType.byName(this) ?: throw IllegalStateException("Unrecognized version type: $this") } - val name = nextRelease!!.withType(vt).toString() - Git.open(projectDir).use { git -> - git.tag().setName(name).call() - logger.warn("Created release $name (last was $lastRelease). Make sure to push it!") - } - } +tasks.register("bumpVersion", BumpVersionTask::class) { + gitDir = File(projectDir, ".git") + isRelease = this@Jf_autoversion_gradle.isRelease + nextVersionType = project.provider { prop("nextVersionType", null) } + nextRelease = project.provider { project.nextRelease } + lastRelease = project.provider { project.lastRelease } }