aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2026-03-21 19:56:18 +0100
committerDimitri Staessens <dimitri@ouroboros.rocks>2026-03-21 20:00:20 +0100
commitcb2d33f17a725bb908834bb0f3a4f4fd344efc54 (patch)
treed4cc70e090b8f088bbbf97d844d17bfb593eabba
parentfb667c406053a2121d8d1f16099a8063292b3f45 (diff)
downloadrumba-cb2d33f17a725bb908834bb0f3a4f4fd344efc54.tar.gz
rumba-cb2d33f17a725bb908834bb0f3a4f4fd344efc54.zip
rumba: Fix version compatibility check in IrmPythonHEADmaster
Fix check_version() to use tag-level comparison instead of a patch-range check, making it robust for dev/pre-release versions on both rumba and PyOuroboros. Signed-off-by: Dimitri Staessens <dimitri@ouroboros.rocks>
-rw-r--r--rumba/irm_backend.py33
1 files changed, 21 insertions, 12 deletions
diff --git a/rumba/irm_backend.py b/rumba/irm_backend.py
index e859e21..9e76158 100644
--- a/rumba/irm_backend.py
+++ b/rumba/irm_backend.py
@@ -235,23 +235,32 @@ class IrmPython(IrmBackend):
def _check_version():
"""Verify PyOuroboros is on the same patch level as Rumba.
- Uses PEP 440 ordering so that dev/pre-release versions sort
- correctly: tag 0.23.0 accepts 0.23.1.dev0 (setuptools_scm's
- representation of the first commit after 0.23.0) because
- 0.23.0 <= 0.23.1.dev0 < 0.23.1 in PEP 440.
+ Both versions may be at the tag (e.g. 0.23.0) or past it
+ (e.g. 0.23.1.dev0+g…, setuptools_scm's representation of
+ the first commit after 0.23.0). We recover the tag by
+ subtracting one from the patch for dev releases, then check
+ that both resolve to the same tag.
"""
import importlib.metadata
from rumba._version import version as rumba_ver
- pyouro_ver = Version(importlib.metadata.version("PyOuroboros"))
- floor = Version(rumba_ver)
- parts = [int(x) for x in rumba_ver.split(".")[:3]]
- parts[2] += 1
- ceiling = Version(".".join(str(x) for x in parts))
- if pyouro_ver < floor or pyouro_ver >= ceiling:
+ def _tag(ver_str):
+ v = Version(ver_str)
+ major, minor = v.release[0], v.release[1] if len(v.release) > 1 else 0
+ patch = v.release[2] if len(v.release) > 2 else 0
+ if v.is_devrelease:
+ patch -= 1
+ return "%d.%d.%d" % (major, minor, patch)
+
+ rumba_tag = _tag(rumba_ver)
+ pyouro_ver = importlib.metadata.version("PyOuroboros")
+ pyouro_tag = _tag(pyouro_ver)
+ if pyouro_tag != rumba_tag:
raise RuntimeError(
- "PyOuroboros >= %s, < %s required (lockstep with Rumba), "
- "got %s" % (floor, ceiling, pyouro_ver)
+ "PyOuroboros tag %s != Rumba tag %s "
+ "(lockstep required); raw versions: "
+ "pyouroboros=%s rumba=%s"
+ % (pyouro_tag, rumba_tag, pyouro_ver, rumba_ver)
)
def _get_ipcp_type(self, layer_type):