From 32d3430eb9e8ef5c354ee294ec6b8de61f05292a Mon Sep 17 00:00:00 2001 From: Ani Sinha Date: Thu, 20 Jul 2023 00:19:25 +0530 Subject: [PATCH 02/11] tools/read-version: fix the tool so that it can handle version parsing errors (#4234) git describe may not return version/tags in the format that the read-version tool expects. Make the tool robust so that it can gracefully handle version strings that are not in the regular format. We use regex to capture the details we care about, but if we cannot find them, we won't traceback and will continue to use version and version_long as expected. Signed-off-by: Ani Sinha (cherry picked from commit 6543c88e0781b3c2e170fdaffbe6ba9f268e986c) --- tools/read-version | 68 +++++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 25 deletions(-) diff --git a/tools/read-version b/tools/read-version index 5a71e6c7..7575683c 100755 --- a/tools/read-version +++ b/tools/read-version @@ -2,6 +2,7 @@ import os import json +import re import subprocess import sys @@ -50,6 +51,37 @@ def is_gitdir(path): return False +def get_version_details(version, version_long): + release = None + extra = None + commit = None + distance = None + + # Should match upstream version number. E.g., 23.1 or 23.1.2 + short_regex = r"(\d+\.\d+\.?\d*)" + # Should match version including upstream version, distance, and commit + # E.g., 23.1.2-10-g12ab34cd + long_regex = r"(\d+\.\d+\.?\d*){1}.*-(\d+)+-g([a-f0-9]{8}){1}.*" + + short_match = re.search(short_regex, version) + long_match = re.search(long_regex, version_long) + if long_match: + release, distance, commit = long_match.groups() + extra = f"-{distance}-g{commit}" + elif short_match: + release = short_match.groups()[0] + + return { + "release": release, + "version": version, + "version_long": version_long, + "extra": extra, + "commit": commit, + "distance": distance, + "is_release_branch_ci": is_release_branch_ci, + } + + use_long = "--long" in sys.argv or os.environ.get("CI_RV_LONG") use_tags = "--tags" in sys.argv or os.environ.get("CI_RV_TAGS") output_json = "--json" in sys.argv @@ -104,33 +136,19 @@ else: version = src_version version_long = "" -# version is X.Y.Z[+xxx.gHASH] -# version_long is None or X.Y.Z-xxx-gHASH -release = version.partition("-")[0] -extra = None -commit = None -distance = None - -if version_long: - info = version_long.partition("-")[2] - extra = f"-{info}" - distance, commit = info.split("-") - # remove the 'g' from gHASH - commit = commit[1:] - -data = { - "release": release, - "version": version, - "version_long": version_long, - "extra": extra, - "commit": commit, - "distance": distance, - "is_release_branch_ci": is_release_branch_ci, -} + +details = get_version_details(version, version_long) if output_json: - sys.stdout.write(json.dumps(data, indent=1) + "\n") + sys.stdout.write(json.dumps(details, indent=1) + "\n") else: - sys.stdout.write(version + "\n") + output = "" + if details["release"]: + output += details["release"] + if details["extra"]: + output += details["extra"] + if not output: + output = src_version + sys.stdout.write(output + "\n") sys.exit(0) -- 2.39.3