aboutsummaryrefslogtreecommitdiff
diff options
from:
to:
context:
space:
mode:
authorGravatar Saya Andy <saya.andy@posteo.com> 2026-07-30 12:22:56 +0700
committerGravatar Saya Andy <saya.andy@posteo.com> 2026-07-30 12:22:56 +0700
commit8c1df01ecea5b684dd420bcd5b4e4e25e56c3af8 (patch)
tree9875fd020d90e8ce178e89c0d2f32b27cfc8c836
parentd05975170e81442bde726730b6e2d1c37ea6c560 (diff)
downloadcgitext-8c1df01ecea5b684dd420bcd5b4e4e25e56c3af8.tar.gz
cgitext-8c1df01ecea5b684dd420bcd5b4e4e25e56c3af8.zip
gen-version: report the version as semver with the commit distance
`git describe` produces "v1.3.1-2-gfbb7", which is neither a Semantic Version nor especially readable. Derive the version from the most recent release tag and the number of commits made since it instead, giving "v1.3.1+7", and plain "v1.3.1" when building the tag itself. That is a valid Semantic Version 2.0.0 with the commit distance as build metadata. Note that build metadata is excluded from precedence, so "v1.3.1+7" and "v1.3.1" compare equal; the distance identifies a build rather than ordering it. Tarball builds keep falling back to the version in the Makefile, and release tags are expected to be named vMAJOR.MINOR.PATCH for the result to stay well-formed. Signed-off-by: Saya Andy <saya.andy@posteo.com>
-rwxr-xr-xgen-version.sh18
1 files changed, 16 insertions, 2 deletions
diff --git a/gen-version.sh b/gen-version.sh
index 80cf49a..b493cf5 100755
--- a/gen-version.sh
+++ b/gen-version.sh
@@ -3,10 +3,24 @@
# Get version-info specified in Makefile
V=$1
-# Use `git describe` to get current version if we're inside a git repo
+# When building from a git repository, derive the version from the most recent
+# release tag instead. The result follows Semantic Versioning 2.0.0, using the
+# number of commits made since that tag as build metadata, so seven commits
+# after the v1.3.1 tag gives "v1.3.1+7", while a build of the tag itself gives
+# plain "v1.3.1". Release tags are expected to be named vMAJOR.MINOR.PATCH.
if test "$(git rev-parse --git-dir 2>/dev/null)" = '.git'
then
- V=$(git describe --abbrev=4 HEAD 2>/dev/null)
+ tag=$(git describe --abbrev=0 --match 'v[0-9]*' HEAD 2>/dev/null)
+ if test -n "$tag"
+ then
+ ahead=$(git rev-list --count "$tag..HEAD" 2>/dev/null)
+ if test -n "$ahead" && test "$ahead" -gt 0
+ then
+ V="$tag+$ahead"
+ else
+ V="$tag"
+ fi
+ fi
fi
new="CGIT_VERSION = $V"