From d48afe89bbaeb77bf6cf3d46b51d57f55962bb6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20K=C3=BCrten?= <sebastian@mobanisto.de> Date: Mon, 4 Apr 2022 13:55:40 +0200 Subject: [PATCH] Building releases happens while detached, so store branch and tag in BuildData --- .../builddata/GenerateBuildDataSourceTask.kt | 43 ++++++++++++++++--- .../org/briarproject/briar/desktop/Main.kt | 7 ++- .../briar/desktop/ui/AboutDialog.kt | 24 ++++++----- 3 files changed, 56 insertions(+), 18 deletions(-) diff --git a/buildSrc/src/main/kotlin/org/briarproject/briar/desktop/builddata/GenerateBuildDataSourceTask.kt b/buildSrc/src/main/kotlin/org/briarproject/briar/desktop/builddata/GenerateBuildDataSourceTask.kt index 8b03677698..ddc4bf777c 100644 --- a/buildSrc/src/main/kotlin/org/briarproject/briar/desktop/builddata/GenerateBuildDataSourceTask.kt +++ b/buildSrc/src/main/kotlin/org/briarproject/briar/desktop/builddata/GenerateBuildDataSourceTask.kt @@ -22,6 +22,7 @@ import org.eclipse.jgit.api.Git import org.eclipse.jgit.lib.Constants import org.eclipse.jgit.lib.Ref import org.eclipse.jgit.revwalk.RevCommit +import org.eclipse.jgit.revwalk.RevWalk import org.eclipse.jgit.submodule.SubmoduleWalk import org.gradle.api.GradleScriptException import org.gradle.api.internal.artifacts.PreResolvedResolvableArtifact @@ -125,7 +126,7 @@ open class GenerateBuildDataSourceTask : AbstractBuildDataTask() { val dirBriar = repositoryCore.directory val gitBriar = Git.open(dirBriar) - // Get head ref and it's name => current hash + // Get head ref and its name => current hash val head = repository.resolve(Constants.HEAD) val gitHash = head.name + if (status.hasUncommittedChanges()) "-dirty" else "" @@ -140,14 +141,40 @@ open class GenerateBuildDataSourceTask : AbstractBuildDataTask() { val commitTime = first.commitTime * 1000L // Get current branch, if any - var gitBranch = "<unknown>" + var gitBranch: String? = null val prefix = "refs/heads/" val fullBranch = repository.fullBranch if (fullBranch.startsWith(prefix)) { gitBranch = fullBranch.substring(prefix.length) } - // Get head ref and it's name => current core hash + // Build list of tags ordered by creation date. We do this to make sure that when we map + // commits to tags below, a commit that has multiple tags pointing to it maps to the latest tag + // (like a beta tag that is later promoted to a release tag). + val walk = RevWalk(repository) + val tagsByCreationDate = git.tagList().call().also { + it.sortBy { tag -> + val revTag = walk.parseTag(tag.objectId) + revTag.taggerIdent.`when` + } + } + + // Build map of commits to tags that point to them + val commitToTag = tagsByCreationDate.associateBy { tag -> + val peeled = repository.refDatabase.peel(tag) + val call = git.log().add(peeled.peeledObjectId).call() + call.iterator().next() + } + + // Get current tag, if any + var gitTag: String? = null + val prefixTags = "refs/tags/" + val tag = commitToTag[first] + if (tag != null && tag.name.startsWith(prefixTags)) { + gitTag = tag.name.substring(prefixTags.length) + } + + // Get head ref and its name => current core hash val coreHead = repositoryCore.resolve(Constants.HEAD) val coreGitHash = coreHead.name @@ -183,7 +210,7 @@ open class GenerateBuildDataSourceTask : AbstractBuildDataTask() { val file = path.resolve("$className.kt") val content = createSource( packageName, className, version, - commitTime, gitHash, gitBranch, + commitTime, gitHash, gitBranch, gitTag, coreGitHash, coreVersion, artifacts ) val input: InputStream = ByteArrayInputStream( @@ -213,11 +240,14 @@ open class GenerateBuildDataSourceTask : AbstractBuildDataTask() { version: String, gitTime: Long, gitHash: String, - gitBranch: String, + gitBranch: String?, + gitTag: String?, coreGitHash: String, coreVersion: String, artifacts: List<VersionedArtifact>, ) = FileBuilder().apply { + val branch = if (gitBranch == null) "null" else "\"$gitBranch\"" + val tag = if (gitTag == null) "null" else "\"$gitTag\"" line("// this file is generated, do not edit") line("package $packageName") line() @@ -227,7 +257,8 @@ open class GenerateBuildDataSourceTask : AbstractBuildDataTask() { line(" val VERSION = \"$version\"") line(" val GIT_TIME = ${gitTime}L") line(" val GIT_HASH = \"$gitHash\"") - line(" val GIT_BRANCH = \"$gitBranch\"") + line(" val GIT_BRANCH: String? = $branch") + line(" val GIT_TAG: String? = $tag") line(" val CORE_HASH = \"$coreGitHash\"") line(" val CORE_VERSION = \"$coreVersion\"") line() diff --git a/src/main/kotlin/org/briarproject/briar/desktop/Main.kt b/src/main/kotlin/org/briarproject/briar/desktop/Main.kt index 013368fba8..016c5fd441 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/Main.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/Main.kt @@ -102,7 +102,12 @@ private class Main : CliktCommand( LOG.i { "Build info:" } LOG.i { " Git hash ${BuildData.GIT_HASH}" } LOG.i { " Commit time ${formatter.format(buildTime)}" } - LOG.i { " Branch ${BuildData.GIT_BRANCH}" } + if (BuildData.GIT_BRANCH != null) + LOG.i { " Branch ${BuildData.GIT_BRANCH}" } + if (BuildData.GIT_TAG != null) + LOG.i { " Tag ${BuildData.GIT_TAG}" } + if (BuildData.GIT_BRANCH == null && BuildData.GIT_TAG == null) + LOG.i { " Neither branch nor tag detected" } val dataDir = getDataDir() val app = diff --git a/src/main/kotlin/org/briarproject/briar/desktop/ui/AboutDialog.kt b/src/main/kotlin/org/briarproject/briar/desktop/ui/AboutDialog.kt index 2b5a910cb7..5899d87ba3 100644 --- a/src/main/kotlin/org/briarproject/briar/desktop/ui/AboutDialog.kt +++ b/src/main/kotlin/org/briarproject/briar/desktop/ui/AboutDialog.kt @@ -52,17 +52,19 @@ fun AboutDialog( val buildTime = Instant.ofEpochMilli(BuildData.GIT_TIME).atZone(ZoneId.systemDefault()).toLocalDateTime() // rows displayed in table - val lines = listOf( - i18n("about.copyright") to "The Briar Project", // NON-NLS - i18n("about.license") to "GNU Affero General Public License v3", // NON-NLS - i18n("about.version") to BuildData.VERSION, - i18n("about.version.core") to BuildData.CORE_VERSION, - "Git branch" to BuildData.GIT_BRANCH, // NON-NLS - "Git hash" to BuildData.GIT_HASH, // NON-NLS - "Commit time" to DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(buildTime), // NON-NLS - i18n("about.website") to "https://briarproject.org", - i18n("about.contact") to "desktop@briarproject.org", // NON-NLS - ) + val lines = buildList<Pair<String, String>> { + add(i18n("about.copyright") to "The Briar Project") // NON-NLS + add(i18n("about.license") to "GNU Affero General Public License v3") // NON-NLS + add(i18n("about.version") to BuildData.VERSION) + add(i18n("about.version.core") to BuildData.CORE_VERSION) + if (BuildData.GIT_BRANCH != null) add("Git branch" to BuildData.GIT_BRANCH) // NON-NLS + if (BuildData.GIT_TAG != null) add("Git tag" to BuildData.GIT_TAG) // NON-NLS + if (BuildData.GIT_BRANCH == null && BuildData.GIT_TAG == null) add("Git branch/tag" to "None detected") // NON-NLS + add("Git hash" to BuildData.GIT_HASH) // NON-NLS + add("Commit time" to DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(buildTime)) // NON-NLS + add(i18n("about.website") to "https://briarproject.org") + add(i18n("about.contact") to "desktop@briarproject.org") // NON-NLS + } BriarDialog(onClose = onClose) { val box = this -- GitLab