1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
import argparse
import subprocess
import re
def compute_version_from_file(file):
try:
with open(file) as f:
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 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 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")
args = p.parse_args()
version = compute_version(args.version_file, args.git_repo, args.git)
print(version)
if __name__ == "__main__":
main()
|