diff --git a/.github/workflows/updatesnaptests.yml b/.github/workflows/updatesnaptests.yml index 5471b7a..3a72904 100644 --- a/.github/workflows/updatesnaptests.yml +++ b/.github/workflows/updatesnaptests.yml @@ -24,6 +24,8 @@ jobs: python3 -m pip install flake8 python3 -m pip install requests python3 -m pip install pyyaml + python3 -m pip install python-debian + python3 -m pip install packaging - name: Code tests env: GITHUB_USER: ubuntu diff --git a/updatesnap/SnapModule/snapmodule.py b/updatesnap/SnapModule/snapmodule.py index b734274..20fa80b 100644 --- a/updatesnap/SnapModule/snapmodule.py +++ b/updatesnap/SnapModule/snapmodule.py @@ -13,7 +13,8 @@ import requests import yaml -import pkg_resources +import packaging.version +import debian.debian_support class Colors: @@ -119,11 +120,22 @@ def _get_version(self, part_name, entry, entry_format, check): if '%V' in entry_format['format']: if not entry.startswith(entry_format['format'].split('%')[0]): return None - version = pkg_resources.parse_version(entry[len(entry_format['format'].split('%')[0]):]) - if (("lower-than" in entry_format) and - (version >= pkg_resources.parse_version(str(entry_format["lower-than"])))): - return None - return version + try: + version = packaging.version.parse( + entry[len(entry_format['format'].split('%')[0]):]) + if (("lower-than" in entry_format) and + (version >= packaging.version.parse( + str(entry_format["lower-than"])))): + return None + return version + except packaging.version.InvalidVersion: + version = debian.debian_support.Version( + entry[len(entry_format['format'].split('%')[0]):]) + if (("lower-than" in entry_format) and + (version >= debian.debian_support.Version( + str(entry_format["lower-than"])))): + return None + return version major = 0 minor = 0 revision = 0 @@ -147,12 +159,12 @@ def _get_version(self, part_name, entry, entry_format, check): if not entry.startswith(part): return None entry = entry[len(part):] - version = pkg_resources.parse_version(f"{major}.{minor}.{revision}") + version = packaging.version.parse(f"{major}.{minor}.{revision}") if "ignore-version" in entry_format: to_ignore = entry_format["ignore-version"] if isinstance(to_ignore, str): - if version == pkg_resources.parse_version(to_ignore): + if version == packaging.version.parse(to_ignore): return None elif isinstance(to_ignore, list): for ignore_version in to_ignore: @@ -161,7 +173,7 @@ def _get_version(self, part_name, entry, entry_format, check): "contains an element that is not a string.") self._print_error(part_name, self._colors.critical, message) raise ValueError(message) - if version == pkg_resources.parse_version(ignore_version): + if version == packaging.version.parse(ignore_version): return None else: message = (f"The 'ignore-version' entry in {part_name} is neither a string, " @@ -170,7 +182,7 @@ def _get_version(self, part_name, entry, entry_format, check): raise ValueError(message) if (("lower-than" in entry_format) and - (version >= pkg_resources.parse_version(str(entry_format["lower-than"])))): + (version >= packaging.version.parse(str(entry_format["lower-than"])))): return None if self._checkopt("ignore-odd-minor", entry_format) and ((minor % 2) == 1): return None diff --git a/updatesnap/unittests.py b/updatesnap/unittests.py index 65e7a09..3af1448 100755 --- a/updatesnap/unittests.py +++ b/updatesnap/unittests.py @@ -401,6 +401,28 @@ def test_no_source_or_local_source(self): assert data[0] is None assert data[1] is None + def test_version_variation_and_beta_release(self): + # pylint: disable=protected-access + """ tests if a part support valid version variation and beta-release""" + obj = ProcessVersion(silent=True) + obj.set_full_silent() + data = get_version_variation_and_beta_release() + for part in data: + version = obj._get_version( + part['part_name'], part['version'], part['entry_format'], False) + assert version is not None + + def test_invalid_version_variation_and_beta_release(self): + # pylint: disable=protected-access + """ tests if a part filter out invalid version variation and beta-release""" + obj = ProcessVersion(silent=True) + obj.set_full_silent() + data = get_invalid_version_variation_and_beta_release() + for part in data: + version = obj._get_version( + part['part_name'], part['version'], part['entry_format'], False) + assert version is None + class GitPose: """ Helper class. It emulates a GitClass class, to allow to test @@ -818,4 +840,74 @@ def remove_trailing_nls(data): return data +def get_version_variation_and_beta_release(): + """ returns a list of different types of valid version-variation and beta release""" + return [{ + 'part_name': 'part1', + 'version': '1.0b2', + 'entry_format': {'format': '%V'} + }, { + 'part_name': 'part2', + 'version': '20240109', + 'entry_format': {'format': '%V'} + }, { + 'part_name': 'part3', + 'version': 'debian/3.22.10+dfsg0-4', + 'entry_format': {'format': 'debian/%V'} + }, { + 'part_name': 'part4', + 'version': 'debian/0.3-7', + 'entry_format': {'format': 'debian/%V'} + }, { + 'part_name': 'part5', + 'version': 'debian/0.8.9-10', + 'entry_format': {'format': 'debian/%V'} + }, { + 'part_name': 'part6', + 'version': 'debian/27-11', + 'entry_format': {'format': 'debian/%V'} + }, { + 'part_name': 'part7', + 'version': 'debian/20200505dfsg0-2', + 'entry_format': {'format': 'debian/%V'} + }, { + 'part_name': 'part8', + 'version': 'debian/1.4+repack0-6', + 'entry_format': {'format': 'debian/%V'} + }, { + 'part_name': 'part9', + 'version': 'v6', + 'entry_format': {'format': 'v%V'} + }, { + 'part_name': 'part10', + 'version': '3.1a2b3', + 'entry_format': {'format': '%V'} + }, { + 'part_name': 'part10', + 'version': '12.0~beta2', + 'entry_format': {'format': '%V'} + }] + + +def get_invalid_version_variation_and_beta_release(): + """ returns a list of different types of invalid version-variation and beta release""" + return [{ + 'part_name': 'part1', + 'version': '1.2.3', + 'entry_format': {'format': 'debian%V'} + }, { + 'part_name': 'part2', + 'version': '20240109', + 'entry_format': {'format': 'debian%V'} + }, { + 'part_name': 'part3', + 'version': 'debian/3.22.10+dfsg0-4', + 'entry_format': {'format': 'upstream/%V'} + }, { + 'part_name': 'part4', + 'version': '3.1a2b3', + 'entry_format': {'format': 'debian%V'} + }] + + unittest.main()