aboutsummaryrefslogtreecommitdiff
path: root/libdino/version.py
diff options
context:
space:
mode:
authorMarvin W <git@larma.de>2024-08-01 15:33:56 +0200
committerMarvin W <git@larma.de>2025-01-12 20:00:51 +0100
commit613cb5e2d7c3f1469f4f91b86fa982eda472465b (patch)
treeea1315a2c1d48bcc91589aa3cee130eb1d96d533 /libdino/version.py
parenta63b5ccb9a791d78ad7f5811f414ae8dab0c4f15 (diff)
downloaddino-613cb5e2d7c3f1469f4f91b86fa982eda472465b.tar.gz
dino-613cb5e2d7c3f1469f4f91b86fa982eda472465b.zip
Meson: Adjust version generation to match CMake
and be compatible with vala-language-server
Diffstat (limited to 'libdino/version.py')
-rw-r--r--libdino/version.py65
1 files changed, 47 insertions, 18 deletions
diff --git a/libdino/version.py b/libdino/version.py
index d34db6a8..dfbadb76 100644
--- a/libdino/version.py
+++ b/libdino/version.py
@@ -1,36 +1,65 @@
import argparse
import subprocess
-VERSION_VALA = """\
-namespace Dino {{
+import re
-public const string VERSION = "{}";
-}}
-"""
-
-def compute_version(file, git_repo, git):
+def compute_version_from_file(file):
try:
with open(file) as f:
- return f.read().strip()
+ version_from_file = f.read().strip()
+ if version_from_file != "":
+ if version_from_file.startswith("RELEASE "):
+ return version_from_file[8:].strip()
+ if version_from_file.startswith("PRERELEASE "):
+ return version_from_file[11:].strip()
+ return version_from_file
except FileNotFoundError:
pass
- return subprocess.check_output([git, "describe", "--tags"], cwd=git_repo, text=True).strip()
+ return None
+
+
+def compute_version_from_git(git_repo, git):
+ try:
+ git_release_tag = subprocess.check_output([git, "describe", "--tags", "--abbrev=0"],
+ cwd=git_repo, text=True).strip()
+ if re.match("^v?([0-9]+[.]?[0-9]*[.]?[0-9]*)(-[.0-9A-Za-z-]+)?([+][.0-9A-Za-z-]+)?$", git_release_tag) is None:
+ return None
+ git_describe = subprocess.check_output([git, "describe", "--tags"], cwd=git_repo, text=True).strip()
+ if git_release_tag == git_describe:
+ return git_release_tag
+ matches = re.match("^.*-([0-9]+)-g([0-9a-f]+)$", git_describe)
+ if matches is None:
+ return None
+ git_tag_offset = matches.groups()[0]
+ git_commit_hash = matches.groups()[1]
+ git_commit_time = subprocess.check_output([git, "show", "--format=%cd", "--date=format:%Y%m%d", "-s"],
+ cwd=git_repo, text=True).strip()
+ return "%s~git%s.%s.%s" % (git_release_tag, git_tag_offset, git_commit_time, git_commit_hash)
+ except subprocess.CalledProcessError:
+ pass
+ return None
+
+
+def compute_version(file, git_repo, git):
+ version_from_file = compute_version_from_file(file)
+ if version_from_file is not None:
+ return version_from_file
+ version_from_git = compute_version_from_git(git_repo, git)
+ if version_from_git is not None:
+ return version_from_git
+ return ""
-def generate_version_vala(version):
- if "\\" in version or "\"" in version:
- raise ValueError(f"invalid version {version!r}")
- return VERSION_VALA.format(version)
def main():
p = argparse.ArgumentParser(description="Compute the Dino version")
p.add_argument("--git-repo", help="Path to checked out git repository")
p.add_argument("--git", help="Path to git executable", default="git")
- p.add_argument("version_file", metavar="VERSION_FILE", help="Use this file's contents as version if the file exists")
- p.add_argument("output", metavar="OUTPUT", help="Vala file to output to")
+ p.add_argument("version_file", metavar="VERSION_FILE",
+ help="Use this file's contents as version if the file exists")
args = p.parse_args()
- out = generate_version_vala(compute_version(args.version_file, args.git_repo, args.git))
- with open(args.output, "w") as f:
- f.write(out)
+ version = compute_version(args.version_file, args.git_repo, args.git)
+ print(version)
+
if __name__ == "__main__":
main()