From acc76329bd309542e140ff0c87cddf0f231c8cd0 Mon Sep 17 00:00:00 2001 From: Almar Klein Date: Mon, 10 Nov 2025 11:04:53 +0100 Subject: [PATCH] Friendlier behaviour when __version__ and git tag mismatch --- _version.py | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/_version.py b/_version.py index cb88aa7..92ee01a 100644 --- a/_version.py +++ b/_version.py @@ -50,28 +50,34 @@ def get_extended_version() -> str: # Sample first 3 parts of __version__ base_release = ".".join(__version__.split(".")[:3]) - # Check release - if not release: - release = base_release - elif release != base_release: - warning( - f"{project_name} version from git ({release})" - f" and __version__ ({base_release}) don't match." - ) - - # Build the total version - version = release + # Start version string (__version__ string is leading) + version = base_release + tag_prefix = "#" + + if release and release != base_release: + # Can happen between bumping and tagging. And also when merging a + # version bump into a working branch, because we use --first-parent. + release2, _post, _labels = get_version_info_from_git(first_parent=False) + if release2 != base_release: + warning( + f"{project_name} version from git ({release})" + f" and __version__ ({base_release}) don't match." + ) + version += "+from_tag_" + release.replace(".", "_") + tag_prefix = "." + + # Add git info if post and post != "0": version += f".post{post}" if labels: - version += "+" + ".".join(labels) + version += tag_prefix + ".".join(labels) elif labels and labels[-1] == "dirty": - version += "+" + ".".join(labels) + version += tag_prefix + ".".join(labels) return version -def get_version_info_from_git() -> str: +def get_version_info_from_git(*, first_parent: bool = True) -> str: """ Get (release, post, labels) from Git. @@ -80,15 +86,9 @@ def get_version_info_from_git() -> str: git-hash and optionally a dirty flag. """ # Call out to Git - command = [ - "git", - "describe", - "--long", - "--always", - "--tags", - "--dirty", - "--first-parent", - ] + command = ["git", "describe", "--long", "--always", "--tags", "--dirty"] + if first_parent: + command.append("--first-parent") try: p = subprocess.run(command, check=False, cwd=repo_dir, capture_output=True) except Exception as e: