Files
werkator/src/main/kotlin/de/hoennig/gittally/build/ArtifactKeys.kt
T

39 lines
1.4 KiB
Kotlin

package de.hoennig.gittally.build
import java.nio.file.Path
import java.security.MessageDigest
import java.time.Instant
/**
* Legacy-compatible artifact key naming: sanitized name plus a 12-char SHA-256 prefix,
* so keys are filesystem- and URL-safe but still unique for branch names that
* sanitize to the same string.
*/
object ArtifactKeys {
fun branchKey(branch: String): String = "${sanitize(branch)}-${sha256Prefix(branch)}"
/**
* The hash-free key of the permanent `/branches/<key>/…` artifact URLs, e.g.
* `feature/demo` → `feature_demo`. Unlike [branchKey] it is not necessarily
* unique; lookups must reject ambiguous matches.
*/
fun permanentBranchKey(branch: String): String = sanitize(branch)
fun buildKey(
branch: String,
startedAt: Instant,
): String = "${branchKey(branch)}-${sanitize(startedAt.toString())}-${sha256Prefix("$branch\t$startedAt")}"
/** Legacy `repository_key`: the sanitized absolute repository path. */
fun repoKey(repoDir: Path): String = sanitize(repoDir.toAbsolutePath().normalize().toString())
private fun sanitize(value: String): String = value.replace(Regex("[^A-Za-z0-9._-]"), "_")
private fun sha256Prefix(value: String): String =
MessageDigest
.getInstance("SHA-256")
.digest(value.toByteArray())
.joinToString("") { "%02x".format(it) }
.take(12)
}