From 92f0cdae6f8499a163716185b2779a0b14d645e9 Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Wed, 11 Dec 2024 07:48:38 +0100 Subject: [PATCH 1/7] Drop distutils as it is deprecated --- src/rosdistro/vcs.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rosdistro/vcs.py b/src/rosdistro/vcs.py index 76448a1e..795428f4 100644 --- a/src/rosdistro/vcs.py +++ b/src/rosdistro/vcs.py @@ -36,7 +36,7 @@ import re import subprocess -from distutils.version import LooseVersion +from packaging.version import parse class Git(object): @@ -57,7 +57,7 @@ def version_gte(cls, version): if not cls._client_version: result = cls().command('--version') cls._client_version = result['output'].split()[-1] - return LooseVersion(cls._client_version) >= LooseVersion(version) + return parse(cls._client_version) >= parse(version) def ref_is_hash(ref): From 64117da25b1dfcf739e76af3befc8b22eb8e5492 Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Mon, 26 Jan 2026 09:25:22 +0100 Subject: [PATCH 2/7] Fix: handle non-standard git version on windows --- src/rosdistro/vcs.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/rosdistro/vcs.py b/src/rosdistro/vcs.py index 795428f4..3e05fc2c 100644 --- a/src/rosdistro/vcs.py +++ b/src/rosdistro/vcs.py @@ -36,7 +36,7 @@ import re import subprocess -from packaging.version import parse +from packaging.version import parse, InvalidVersion class Git(object): @@ -57,7 +57,17 @@ def version_gte(cls, version): if not cls._client_version: result = cls().command('--version') cls._client_version = result['output'].split()[-1] - return parse(cls._client_version) >= parse(version) + try: + parsed_version = parse(cls._client_version) + except InvalidVersion: + if "windows" in cls._client_version.lower(): + # Git for Windows uses a non-standard version string + cls._client_version = cls._client_version.lower().replace("windows", "post").strip() + parsed_version = parse(cls._client_version) + else: + raise + + return parsed_version >= parse(version) def ref_is_hash(ref): From b64d88b7b4c5bea8bef1768037d02faadc20de71 Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Tue, 27 Jan 2026 10:38:46 +0100 Subject: [PATCH 3/7] Add dependency on packaging --- setup.py | 2 +- stdeb.cfg | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 81514361..9dadfa35 100755 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ # - src/rosdistro/__init__.py # - stdeb.cfg 'version': '1.0.1', - 'install_requires': ['PyYAML', 'setuptools'], + 'install_requires': ['packaging>=17', 'PyYAML', 'setuptools'], 'python_requires': '>=3.6', 'packages': find_packages('src'), 'package_dir': {'': 'src'}, diff --git a/stdeb.cfg b/stdeb.cfg index 1b430c35..5af7e504 100644 --- a/stdeb.cfg +++ b/stdeb.cfg @@ -3,7 +3,7 @@ Debian-Version: 100 ; rosdistro-modules same version as in: ; - setup.py ; - src/rosdistro/__init__.py -Depends3: ca-certificates, python3-rosdistro-modules (>= 1.0.1), python3-setuptools, python3-yaml +Depends3: ca-certificates, python3-packaging (>=17.0.0), python3-rosdistro-modules (>= 1.0.1), python3-setuptools, python3-yaml Conflicts3: python-rosdistro Copyright-File: LICENSE.txt Suite3: focal jammy noble bookworm trixie @@ -12,7 +12,7 @@ X-Python3-Version: >= 3.6 Setup-Env-Vars: SKIP_PYTHON_MODULES=1 [rosdistro_modules] -Depends3: ca-certificates, python3-catkin-pkg-modules, python3-rospkg-modules, python3-setuptools, python3-yaml +Depends3: ca-certificates, python3-catkin-pkg-modules, python3-packaging (>=17.0.0), python3-rospkg-modules, python3-setuptools, python3-yaml Conflicts3: python3-rosdistro (<< 0.6.0) Replaces3: python3-rosdistro (<< 0.6.0) Copyright-File: LICENSE.txt From 4e1bf0e758476ba516698a95d4dac7ff26e20333 Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Fri, 20 Feb 2026 16:02:32 +0100 Subject: [PATCH 4/7] Force packaging==16.8 --- setup.py | 2 +- stdeb.cfg | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 9dadfa35..c1118587 100755 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ # - src/rosdistro/__init__.py # - stdeb.cfg 'version': '1.0.1', - 'install_requires': ['packaging>=17', 'PyYAML', 'setuptools'], + 'install_requires': ['packaging==16.8', 'PyYAML', 'setuptools'], 'python_requires': '>=3.6', 'packages': find_packages('src'), 'package_dir': {'': 'src'}, diff --git a/stdeb.cfg b/stdeb.cfg index 5af7e504..e75d024d 100644 --- a/stdeb.cfg +++ b/stdeb.cfg @@ -3,7 +3,7 @@ Debian-Version: 100 ; rosdistro-modules same version as in: ; - setup.py ; - src/rosdistro/__init__.py -Depends3: ca-certificates, python3-packaging (>=17.0.0), python3-rosdistro-modules (>= 1.0.1), python3-setuptools, python3-yaml +Depends3: ca-certificates, python3-packaging (==16.8.0), python3-rosdistro-modules (>= 1.0.1), python3-setuptools, python3-yaml Conflicts3: python-rosdistro Copyright-File: LICENSE.txt Suite3: focal jammy noble bookworm trixie @@ -12,7 +12,7 @@ X-Python3-Version: >= 3.6 Setup-Env-Vars: SKIP_PYTHON_MODULES=1 [rosdistro_modules] -Depends3: ca-certificates, python3-catkin-pkg-modules, python3-packaging (>=17.0.0), python3-rospkg-modules, python3-setuptools, python3-yaml +Depends3: ca-certificates, python3-catkin-pkg-modules, python3-packaging (==16.8.0), python3-rospkg-modules, python3-setuptools, python3-yaml Conflicts3: python3-rosdistro (<< 0.6.0) Replaces3: python3-rosdistro (<< 0.6.0) Copyright-File: LICENSE.txt From 5f63a4f0a7399d94970f457f3379e65ab45933f9 Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Fri, 20 Feb 2026 16:30:40 +0100 Subject: [PATCH 5/7] test: add version_gte --- src/rosdistro/vcs.py | 36 +++++++++++++++++++++++++----------- test/test_vcs.py | 20 ++++++++++++++++++++ 2 files changed, 45 insertions(+), 11 deletions(-) create mode 100644 test/test_vcs.py diff --git a/src/rosdistro/vcs.py b/src/rosdistro/vcs.py index 3e05fc2c..091bec78 100644 --- a/src/rosdistro/vcs.py +++ b/src/rosdistro/vcs.py @@ -39,6 +39,29 @@ from packaging.version import parse, InvalidVersion +def _version_gte(version: str, required_version: str) -> bool: + """Check if a version string is greater than or equal to a required version. + + Args: + version: The version string to check. + required_version: The required version string. + + Returns: + True if the version is greater than or equal to the required version, False otherwise. + """ + try: + parsed_version = parse(version) + except InvalidVersion: + if "windows" in version.lower(): + # Git for Windows uses a non-standard version string + version = version.lower().replace("windows", "post").strip() + parsed_version = parse(version) + else: + raise + + return parsed_version >= parse(required_version) + + class Git(object): _client_executable = None _client_version = None @@ -57,17 +80,8 @@ def version_gte(cls, version): if not cls._client_version: result = cls().command('--version') cls._client_version = result['output'].split()[-1] - try: - parsed_version = parse(cls._client_version) - except InvalidVersion: - if "windows" in cls._client_version.lower(): - # Git for Windows uses a non-standard version string - cls._client_version = cls._client_version.lower().replace("windows", "post").strip() - parsed_version = parse(cls._client_version) - else: - raise - - return parsed_version >= parse(version) + + return _version_gte(cls._client_version, version) def ref_is_hash(ref): diff --git a/test/test_vcs.py b/test/test_vcs.py new file mode 100644 index 00000000..aac1e721 --- /dev/null +++ b/test/test_vcs.py @@ -0,0 +1,20 @@ +from rosdistro.vcs import _version_gte + +import pytest + +@pytest.mark.parametrize("version, required_version, expected", [ + ("2.50.0", "2.51.0", False), + ("2.51.0", "2.51.0", True), + ("2.52.0", "2.51.0", True), + ("2.51.0-rc1", "2.51.0", False), + ("2.51.0-rc1", "2.51.0-rc1", True), + ("2.51.0-rc1", "2.51.0-rc2", False), + ("2.51.0-rc1", "2.51.0-rc0", True), + ("2.51.0-rc1", "2.51.0-rc0+post1", True), + ("2.51.0-rc1", "2.51.0-rc1+post1", False), + ("2.51.0.windows.1", "2.50.0", True), + ("2.51.0.windows.1", "2.51.0", True), + ("2.51.0.windows.1", "2.52", False), +]) +def test_version_gte(version: str, required_version: str, expected: bool): + assert _version_gte(version, required_version) == expected From 2e9eb554b0c643c768bc1faf8a930df4c6fe0a79 Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Fri, 20 Feb 2026 16:36:18 +0100 Subject: [PATCH 6/7] Support packaging>=16.8 --- src/rosdistro/vcs.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/rosdistro/vcs.py b/src/rosdistro/vcs.py index 091bec78..001ba6b1 100644 --- a/src/rosdistro/vcs.py +++ b/src/rosdistro/vcs.py @@ -37,6 +37,11 @@ import subprocess from packaging.version import parse, InvalidVersion +try: + from packaging.version import LegacyVersion + packaging_lte_22 = True +except ImportError: + packaging_lte_22 = False def _version_gte(version: str, required_version: str) -> bool: @@ -51,6 +56,11 @@ def _version_gte(version: str, required_version: str) -> bool: """ try: parsed_version = parse(version) + if packaging_lte_22: + # In packaging 22.0 and earlier, parse() returns a LegacyVersion for non-standard version strings, + # which will compare greater than any valid version. We want to raise an error instead. + if isinstance(parsed_version, LegacyVersion): + raise InvalidVersion except InvalidVersion: if "windows" in version.lower(): # Git for Windows uses a non-standard version string From 1d6dbbe1603b2ca7fad2b8a3b8aac1499bb46c2b Mon Sep 17 00:00:00 2001 From: Matthijs van der Burgh Date: Fri, 20 Feb 2026 16:42:11 +0100 Subject: [PATCH 7/7] Allow packaging >=16.8.0 --- setup.py | 2 +- stdeb.cfg | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index c1118587..ac8fd1a0 100755 --- a/setup.py +++ b/setup.py @@ -10,7 +10,7 @@ # - src/rosdistro/__init__.py # - stdeb.cfg 'version': '1.0.1', - 'install_requires': ['packaging==16.8', 'PyYAML', 'setuptools'], + 'install_requires': ['packaging>=16.8.0', 'PyYAML', 'setuptools'], 'python_requires': '>=3.6', 'packages': find_packages('src'), 'package_dir': {'': 'src'}, diff --git a/stdeb.cfg b/stdeb.cfg index e75d024d..37045d55 100644 --- a/stdeb.cfg +++ b/stdeb.cfg @@ -3,7 +3,7 @@ Debian-Version: 100 ; rosdistro-modules same version as in: ; - setup.py ; - src/rosdistro/__init__.py -Depends3: ca-certificates, python3-packaging (==16.8.0), python3-rosdistro-modules (>= 1.0.1), python3-setuptools, python3-yaml +Depends3: ca-certificates, python3-packaging (>=16.8.0), python3-rosdistro-modules (>= 1.0.1), python3-setuptools, python3-yaml Conflicts3: python-rosdistro Copyright-File: LICENSE.txt Suite3: focal jammy noble bookworm trixie @@ -12,7 +12,7 @@ X-Python3-Version: >= 3.6 Setup-Env-Vars: SKIP_PYTHON_MODULES=1 [rosdistro_modules] -Depends3: ca-certificates, python3-catkin-pkg-modules, python3-packaging (==16.8.0), python3-rospkg-modules, python3-setuptools, python3-yaml +Depends3: ca-certificates, python3-catkin-pkg-modules, python3-packaging (>=16.8.0), python3-rospkg-modules, python3-setuptools, python3-yaml Conflicts3: python3-rosdistro (<< 0.6.0) Replaces3: python3-rosdistro (<< 0.6.0) Copyright-File: LICENSE.txt