Essentials/build-logic/src/main/kotlin/GitUtil.kt

46 lines
1.5 KiB
Kotlin

import net.kyori.indra.git.IndraGitExtension
import org.eclipse.jgit.lib.Repository
import org.eclipse.jgit.revwalk.RevWalk
import org.gradle.api.Project
import org.gradle.kotlin.dsl.findByType
object GitUtil {
@JvmStatic
fun commitsSinceLastTag(project: Project): Int? {
val indraGit = project.extensions.findByType(IndraGitExtension::class)?.takeIf {
it.isPresent && it.tags().isNotEmpty()
} ?: return null
val git = indraGit.git() ?: return null
val tags = indraGit.tags()
var depth = 0
val walk = RevWalk(git.repository)
var commit = walk.parseCommit(indraGit.commit())
while (true) {
for (tag in tags) {
if (walk.parseCommit(tag.leaf.objectId) == commit) {
walk.dispose()
return depth
}
}
depth++
commit = walk.parseCommit(commit.parents[0])
}
}
@JvmStatic
fun headBranchName(project: Project): String {
System.getenv("GITHUB_HEAD_REF")?.takeIf { it.isNotEmpty() }
?.let { return it }
System.getenv("GITHUB_REF")?.takeIf { it.isNotEmpty() }
?.let { return it.replaceFirst("refs/heads/", "") }
val indraGit = project.extensions.findByType(IndraGitExtension::class)
?.takeIf { it.isPresent }
val ref = indraGit?.git()?.repository?.exactRef("HEAD")?.target
?: return "detached-head"
return Repository.shortenRefName(ref.name)
}
}