fix(autoversion): try to support configuration cache
Some checks failed
ci/woodpecker/push/gradle Pipeline failed
ci/woodpecker/push/pages Pipeline was successful

This commit is contained in:
Johannes Frohnmeyer 2024-05-26 11:37:36 +02:00
parent d095a18b2b
commit 6c964e28ee
Signed by: Johannes
GPG Key ID: E76429612C2929F4
4 changed files with 79 additions and 23 deletions

View File

@ -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<Boolean>
@get:Input abstract val nextVersionType: Property<String>
@get:Input abstract val nextRelease: Property<SemanticVersion>
@get:Input abstract val lastRelease: Property<String>
@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!")
}
}
}

View File

@ -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<String>
@TaskAction
fun action() {
Toolkit.getDefaultToolkit().systemClipboard.setContents(StringSelection(project.versionS), null)
println("Copied version number: ${project.versionS}")
}
}

View File

@ -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<DefaultTask>("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> T.runAction(action: Action<T>?): T {
action?.execute(this!!)
return this
}
}
fun <T> Provider<T>.getOrThrow(exception: () -> Exception): T =
if (!isPresent) throw exception()
else get()

View File

@ -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 }
}