From 27f9733f0b8d07a584eb59b75387d3ff1407bd93 Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Fri, 22 Oct 2021 16:41:44 -0700 Subject: [PATCH 01/37] Sync dependency conversion with upstream pyreq2rpm. Improve handling of > operator, preventing post-release from satisfying most rpm requirements. Improve handling of < operator, preventing pre-release from satisfying rpm requirement. Improve handling of != operator with prefix matching, preventing pre-release from satisfying rpm requirements. --- python-rpm-generators.spec | 6 +- pythondistdeps.py | 26 ++++- .../scripts_pythondistdeps/test-data.yaml | 98 +++++++++---------- 3 files changed, 76 insertions(+), 54 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 3a264b0..c61d9c1 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 12 -Release: 8%{?dist} +Release: 9%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,10 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Thu Oct 28 2021 Gordon Messmer - 12-9 +- Sync dependency conversion with upstream pyreq2rpm. +- Improve handling of > and < operators, and != operator with prefix matching + * Fri Jul 23 2021 Fedora Release Engineering - 12-8 - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild diff --git a/pythondistdeps.py b/pythondistdeps.py index e8b5afd..eea2628 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -134,6 +134,9 @@ class RpmVersion(): self.pre = version._version.pre self.dev = version._version.dev self.post = version._version.post + # version.local is ignored as it is not expected to appear + # in public releases + # https://www.python.org/dev/peps/pep-0440/#local-version-identifiers def increment(self): self.version[-1] += 1 @@ -201,18 +204,27 @@ def convert_not_equal(name, operator, version_id): if version_id.endswith('.*'): version_id = version_id[:-2] version = RpmVersion(version_id) - lower_version = RpmVersion(version_id).increment() + version_gt = RpmVersion(version_id).increment() + version_gt_operator = '>=' + # Prevent pre-releases from satisfying a < requirement + version = '{}~'.format(version) else: version = RpmVersion(version_id) - lower_version = version - return '({} < {} or {} > {})'.format( - name, version, name, lower_version) + version_gt = version + version_gt_operator = '>' + return '({} < {} or {} {} {})'.format( + name, version, name, version_gt_operator, version_gt) def convert_ordered(name, operator, version_id): if version_id.endswith('.*'): # PEP 440 does not define semantics for prefix matching # with ordered comparisons + # see: https://github.com/pypa/packaging/issues/320 + # and: https://github.com/pypa/packaging/issues/321 + # This style of specifier is officially "unsupported", + # even though it is processed. Support may be removed + # in version 21.0. version_id = version_id[:-2] version = RpmVersion(version_id) if operator == '>': @@ -223,6 +235,12 @@ def convert_ordered(name, operator, version_id): operator = '<' else: version = RpmVersion(version_id) + # Prevent pre-releases from satisfying a < requirement + if operator == '<' and not version.pre and not version.dev and not version.post: + version = '{}~'.format(version) + # Prevent post-releases from satisfying a > requirement + if operator == '>' and not version.pre and not version.dev and not version.post: + version = '{}.0'.format(version) return '{} {} {}'.format(name, operator, version) diff --git a/tests/data/scripts_pythondistdeps/test-data.yaml b/tests/data/scripts_pythondistdeps/test-data.yaml index afd928e..baad647 100644 --- a/tests/data/scripts_pythondistdeps/test-data.yaml +++ b/tests/data/scripts_pythondistdeps/test-data.yaml @@ -28,7 +28,7 @@ python2.7dist(setuptools) >= 21 python2.7dist(six) >= 1.9 python2.7dist(urllib3) >= 1.24.2 - ((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41 or python2.7dist(websocket-client) > 0.42) with (python2.7dist(websocket-client) < 0.42 or python2.7dist(websocket-client) > 0.43) with python2.7dist(websocket-client) >= 0.32) + ((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41~ or python2.7dist(websocket-client) >= 0.42) with (python2.7dist(websocket-client) < 0.42~ or python2.7dist(websocket-client) >= 0.43) with python2.7dist(websocket-client) >= 0.32) usr/lib/python2.7/site-packages/mistune-0.8.4-py2.7.egg-info: provides: |- python2.7dist(mistune) = 0.8.4 @@ -75,12 +75,12 @@ python2dist(tox) = 3.14 requires: |- python(abi) = 2.7 - (python2.7dist(filelock) < 4 with python2.7dist(filelock) >= 3) - (python2.7dist(importlib-metadata) < 1 with python2.7dist(importlib-metadata) >= 0.12) + (python2.7dist(filelock) < 4~ with python2.7dist(filelock) >= 3) + (python2.7dist(importlib-metadata) < 1~ with python2.7dist(importlib-metadata) >= 0.12) python2.7dist(packaging) >= 14 - (python2.7dist(pluggy) < 1 with python2.7dist(pluggy) >= 0.12) - (python2.7dist(py) < 2 with python2.7dist(py) >= 1.4.17) - (python2.7dist(six) < 2 with python2.7dist(six) >= 1) + (python2.7dist(pluggy) < 1~ with python2.7dist(pluggy) >= 0.12) + (python2.7dist(py) < 2~ with python2.7dist(py) >= 1.4.17) + (python2.7dist(six) < 2~ with python2.7dist(six) >= 1) python2.7dist(toml) >= 0.9.4 python2.7dist(virtualenv) >= 14 usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info: @@ -105,7 +105,7 @@ python(abi) = 3.7 (python3.7dist(lazy-object-proxy) >= 1.4 with python3.7dist(lazy-object-proxy) < 1.5) (python3.7dist(six) >= 1.12 with python3.7dist(six) < 2) - (python3.7dist(typed-ast) < 1.5 with python3.7dist(typed-ast) >= 1.4) + (python3.7dist(typed-ast) < 1.5~ with python3.7dist(typed-ast) >= 1.4) (python3.7dist(wrapt) >= 1.11 with python3.7dist(wrapt) < 1.12) usr/lib/python3.7/site-packages/packaging-19.0.dist-info: provides: |- @@ -148,12 +148,12 @@ python3dist(tox) = 3.14 requires: |- python(abi) = 3.7 - (python3.7dist(filelock) < 4 with python3.7dist(filelock) >= 3) - (python3.7dist(importlib-metadata) < 1 with python3.7dist(importlib-metadata) >= 0.12) + (python3.7dist(filelock) < 4~ with python3.7dist(filelock) >= 3) + (python3.7dist(importlib-metadata) < 1~ with python3.7dist(importlib-metadata) >= 0.12) python3.7dist(packaging) >= 14 - (python3.7dist(pluggy) < 1 with python3.7dist(pluggy) >= 0.12) - (python3.7dist(py) < 2 with python3.7dist(py) >= 1.4.17) - (python3.7dist(six) < 2 with python3.7dist(six) >= 1) + (python3.7dist(pluggy) < 1~ with python3.7dist(pluggy) >= 0.12) + (python3.7dist(py) < 2~ with python3.7dist(py) >= 1.4.17) + (python3.7dist(six) < 2~ with python3.7dist(six) >= 1) python3.7dist(toml) >= 0.9.4 python3.7dist(virtualenv) >= 14 usr/lib/python3.9/site-packages/astroid-2.3.3.dist-info: @@ -205,7 +205,7 @@ python3.9dist(setuptools) >= 21 python3.9dist(six) >= 1.9 python3.9dist(urllib3) >= 1.24.2 - ((python3.9dist(websocket-client) < 0.40 or python3.9dist(websocket-client) > 0.40) with (python3.9dist(websocket-client) < 0.41 or python3.9dist(websocket-client) > 0.42) with (python3.9dist(websocket-client) < 0.42 or python3.9dist(websocket-client) > 0.43) with python3.9dist(websocket-client) >= 0.32) + ((python3.9dist(websocket-client) < 0.40 or python3.9dist(websocket-client) > 0.40) with (python3.9dist(websocket-client) < 0.41~ or python3.9dist(websocket-client) >= 0.42) with (python3.9dist(websocket-client) < 0.42~ or python3.9dist(websocket-client) >= 0.43) with python3.9dist(websocket-client) >= 0.32) usr/lib/python3.9/site-packages/mistune-0.8.4-py3.9.egg-info: provides: |- python3.9dist(mistune) = 0.8.4 @@ -260,11 +260,11 @@ python3dist(tox) = 3.14 requires: |- python(abi) = 3.9 - (python3.9dist(filelock) < 4 with python3.9dist(filelock) >= 3) + (python3.9dist(filelock) < 4~ with python3.9dist(filelock) >= 3) python3.9dist(packaging) >= 14 - (python3.9dist(pluggy) < 1 with python3.9dist(pluggy) >= 0.12) - (python3.9dist(py) < 2 with python3.9dist(py) >= 1.4.17) - (python3.9dist(six) < 2 with python3.9dist(six) >= 1) + (python3.9dist(pluggy) < 1~ with python3.9dist(pluggy) >= 0.12) + (python3.9dist(py) < 2~ with python3.9dist(py) >= 1.4.17) + (python3.9dist(six) < 2~ with python3.9dist(six) >= 1) python3.9dist(toml) >= 0.9.4 python3.9dist(virtualenv) >= 14 usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info: @@ -437,7 +437,7 @@ python2.7dist(setuptools) >= 21 python2.7dist(six) >= 1.9 python2.7dist(urllib3) >= 1.24.2 - ((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41 or python2.7dist(websocket-client) > 0.42) with (python2.7dist(websocket-client) < 0.42 or python2.7dist(websocket-client) > 0.43) with python2.7dist(websocket-client) >= 0.32) + ((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41~ or python2.7dist(websocket-client) >= 0.42) with (python2.7dist(websocket-client) < 0.42~ or python2.7dist(websocket-client) >= 0.43) with python2.7dist(websocket-client) >= 0.32) usr/lib/python2.7/site-packages/mistune-0.8.4-py2.7.egg-info: provides: |- python2.7dist(mistune) = 0.8.4 @@ -489,7 +489,7 @@ python(abi) = 3.7 (python3.7dist(lazy-object-proxy) >= 1.4 with python3.7dist(lazy-object-proxy) < 1.5) (python3.7dist(six) >= 1.12 with python3.7dist(six) < 2) - (python3.7dist(typed-ast) < 1.5 with python3.7dist(typed-ast) >= 1.4) + (python3.7dist(typed-ast) < 1.5~ with python3.7dist(typed-ast) >= 1.4) (python3.7dist(wrapt) >= 1.11 with python3.7dist(wrapt) < 1.12) usr/lib/python3.7/site-packages/packaging-19.0.dist-info: provides: python3.7dist(packaging) = 19 @@ -554,11 +554,11 @@ python3dist(tox) = 3.14 requires: |- python(abi) = 3.9 - (python3.9dist(filelock) < 4 with python3.9dist(filelock) >= 3) + (python3.9dist(filelock) < 4~ with python3.9dist(filelock) >= 3) python3.9dist(packaging) >= 14 - (python3.9dist(pluggy) < 1 with python3.9dist(pluggy) >= 0.12) - (python3.9dist(py) < 2 with python3.9dist(py) >= 1.4.17) - (python3.9dist(six) < 2 with python3.9dist(six) >= 1) + (python3.9dist(pluggy) < 1~ with python3.9dist(pluggy) >= 0.12) + (python3.9dist(py) < 2~ with python3.9dist(py) >= 1.4.17) + (python3.9dist(six) < 2~ with python3.9dist(six) >= 1) python3.9dist(toml) >= 0.9.4 python3.9dist(virtualenv) >= 14 usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info: @@ -611,12 +611,12 @@ python2dist(tox) = 3.14 requires: |- python(abi) = 2.7 - (python2.7dist(filelock) < 4 with python2.7dist(filelock) >= 3) - (python2.7dist(importlib-metadata) < 1 with python2.7dist(importlib-metadata) >= 0.12) + (python2.7dist(filelock) < 4~ with python2.7dist(filelock) >= 3) + (python2.7dist(importlib-metadata) < 1~ with python2.7dist(importlib-metadata) >= 0.12) python2.7dist(packaging) >= 14 - (python2.7dist(pluggy) < 1 with python2.7dist(pluggy) >= 0.12) - (python2.7dist(py) < 2 with python2.7dist(py) >= 1.4.17) - (python2.7dist(six) < 2 with python2.7dist(six) >= 1) + (python2.7dist(pluggy) < 1~ with python2.7dist(pluggy) >= 0.12) + (python2.7dist(py) < 2~ with python2.7dist(py) >= 1.4.17) + (python2.7dist(six) < 2~ with python2.7dist(six) >= 1) python2.7dist(toml) >= 0.9.4 python2.7dist(virtualenv) >= 14 usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info: @@ -653,12 +653,12 @@ provides: python3.7dist(tox) = 3.14 requires: |- python(abi) = 3.7 - (python3.7dist(filelock) < 4 with python3.7dist(filelock) >= 3) - (python3.7dist(importlib-metadata) < 1 with python3.7dist(importlib-metadata) >= 0.12) + (python3.7dist(filelock) < 4~ with python3.7dist(filelock) >= 3) + (python3.7dist(importlib-metadata) < 1~ with python3.7dist(importlib-metadata) >= 0.12) python3.7dist(packaging) >= 14 - (python3.7dist(pluggy) < 1 with python3.7dist(pluggy) >= 0.12) - (python3.7dist(py) < 2 with python3.7dist(py) >= 1.4.17) - (python3.7dist(six) < 2 with python3.7dist(six) >= 1) + (python3.7dist(pluggy) < 1~ with python3.7dist(pluggy) >= 0.12) + (python3.7dist(py) < 2~ with python3.7dist(py) >= 1.4.17) + (python3.7dist(six) < 2~ with python3.7dist(six) >= 1) python3.7dist(toml) >= 0.9.4 python3.7dist(virtualenv) >= 14 usr/lib64/python2.7/site-packages/scipy-1.2.1.dist-info: @@ -1251,10 +1251,10 @@ (python3.9dist(foobar33) < 2.4.8 or python3.9dist(foobar33) > 2.4.8) (python3.9dist(foobar34) < 2.4.8 or python3.9dist(foobar34) > 2.4.8) (python3.9dist(foobar35) < 2.4.8.1 or python3.9dist(foobar35) > 2.4.8.1) - (python3.9dist(foobar36) < 2.4.8 or python3.9dist(foobar36) > 2.4.9) + (python3.9dist(foobar36) < 2.4.8~ or python3.9dist(foobar36) >= 2.4.9) (python3.9dist(foobar37) < 2 or python3.9dist(foobar37) > 2) (python3.9dist(foobar38) < 2 or python3.9dist(foobar38) > 2) - (python3.9dist(foobar39) < 2 or python3.9dist(foobar39) > 3) + (python3.9dist(foobar39) < 2~ or python3.9dist(foobar39) >= 3) (python3.9dist(foobar4) >= 2 with python3.9dist(foobar4) < 3) (python3.9dist(foobar40) < 2.4.8~b5 or python3.9dist(foobar40) > 2.4.8~b5) (python3.9dist(foobar41) < 2~b5 or python3.9dist(foobar41) > 2~b5) @@ -1263,21 +1263,21 @@ python3.9dist(foobar44) <= 2.4.8 python3.9dist(foobar45) <= 2.4.8 python3.9dist(foobar46) <= 2.4.8.1 - python3.9dist(foobar47) < 2.4.8 + python3.9dist(foobar47) < 2.4.8~ python3.9dist(foobar48) <= 2 python3.9dist(foobar49) <= 2 - python3.9dist(foobar50) < 2 + python3.9dist(foobar50) < 2~ python3.9dist(foobar51) <= 2.4.8~b5 python3.9dist(foobar52) <= 2~b5 python3.9dist(foobar53) <= 2.4.8^post1 python3.9dist(foobar54) <= 2^post1 - python3.9dist(foobar55) < 2.4.8 - python3.9dist(foobar56) < 2.4.8 - python3.9dist(foobar57) < 2.4.8.1 - python3.9dist(foobar58) < 2.4.8 - python3.9dist(foobar59) < 2 - python3.9dist(foobar60) < 2 - python3.9dist(foobar61) < 2 + python3.9dist(foobar55) < 2.4.8~ + python3.9dist(foobar56) < 2.4.8~ + python3.9dist(foobar57) < 2.4.8.1~ + python3.9dist(foobar58) < 2.4.8~ + python3.9dist(foobar59) < 2~ + python3.9dist(foobar60) < 2~ + python3.9dist(foobar61) < 2~ python3.9dist(foobar62) < 2.4.8~b5 python3.9dist(foobar63) < 2~b5 python3.9dist(foobar64) < 2.4.8^post1 @@ -1294,13 +1294,13 @@ python3.9dist(foobar74) >= 2~b5 python3.9dist(foobar75) >= 2.4.8^post1 python3.9dist(foobar76) >= 2^post1 - python3.9dist(foobar77) > 2.4.8 - python3.9dist(foobar78) > 2.4.8 - python3.9dist(foobar79) > 2.4.8.1 + python3.9dist(foobar77) > 2.4.8.0 + python3.9dist(foobar78) > 2.4.8.0 + python3.9dist(foobar79) > 2.4.8.1.0 (python3.9dist(foobar8) >= 2~b5 with python3.9dist(foobar8) < 2.1) python3.9dist(foobar80) >= 2.4.8 - python3.9dist(foobar81) > 2 - python3.9dist(foobar82) > 2 + python3.9dist(foobar81) > 2.0 + python3.9dist(foobar82) > 2.0 python3.9dist(foobar83) >= 2 python3.9dist(foobar84) > 2.4.8~b5 python3.9dist(foobar85) > 2~b5 From a3ad67b505f1fb8a6463cc7eabc10edd85c890cb Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Fri, 29 Oct 2021 20:00:41 -0700 Subject: [PATCH 02/37] Additional fix for dev releases. --- python-rpm-generators.spec | 5 +- pythondistdeps.py | 8 +- .../scripts_pythondistdeps/test-data.yaml | 88 +++++++++---------- 3 files changed, 52 insertions(+), 49 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index c61d9c1..ef80ad4 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 12 -Release: 9%{?dist} +Release: 10%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri Oct 29 2021 Gordon Messmer - 12-10 +- Additional fix for dev releases. + * Thu Oct 28 2021 Gordon Messmer - 12-9 - Sync dependency conversion with upstream pyreq2rpm. - Improve handling of > and < operators, and != operator with prefix matching diff --git a/pythondistdeps.py b/pythondistdeps.py index eea2628..2e4c9c3 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -206,8 +206,8 @@ def convert_not_equal(name, operator, version_id): version = RpmVersion(version_id) version_gt = RpmVersion(version_id).increment() version_gt_operator = '>=' - # Prevent pre-releases from satisfying a < requirement - version = '{}~'.format(version) + # Prevent dev and pre-releases from satisfying a < requirement + version = '{}~~'.format(version) else: version = RpmVersion(version_id) version_gt = version @@ -235,9 +235,9 @@ def convert_ordered(name, operator, version_id): operator = '<' else: version = RpmVersion(version_id) - # Prevent pre-releases from satisfying a < requirement + # Prevent dev and pre-releases from satisfying a < requirement if operator == '<' and not version.pre and not version.dev and not version.post: - version = '{}~'.format(version) + version = '{}~~'.format(version) # Prevent post-releases from satisfying a > requirement if operator == '>' and not version.pre and not version.dev and not version.post: version = '{}.0'.format(version) diff --git a/tests/data/scripts_pythondistdeps/test-data.yaml b/tests/data/scripts_pythondistdeps/test-data.yaml index baad647..7050e60 100644 --- a/tests/data/scripts_pythondistdeps/test-data.yaml +++ b/tests/data/scripts_pythondistdeps/test-data.yaml @@ -28,7 +28,7 @@ python2.7dist(setuptools) >= 21 python2.7dist(six) >= 1.9 python2.7dist(urllib3) >= 1.24.2 - ((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41~ or python2.7dist(websocket-client) >= 0.42) with (python2.7dist(websocket-client) < 0.42~ or python2.7dist(websocket-client) >= 0.43) with python2.7dist(websocket-client) >= 0.32) + ((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41~~ or python2.7dist(websocket-client) >= 0.42) with (python2.7dist(websocket-client) < 0.42~~ or python2.7dist(websocket-client) >= 0.43) with python2.7dist(websocket-client) >= 0.32) usr/lib/python2.7/site-packages/mistune-0.8.4-py2.7.egg-info: provides: |- python2.7dist(mistune) = 0.8.4 @@ -75,12 +75,12 @@ python2dist(tox) = 3.14 requires: |- python(abi) = 2.7 - (python2.7dist(filelock) < 4~ with python2.7dist(filelock) >= 3) - (python2.7dist(importlib-metadata) < 1~ with python2.7dist(importlib-metadata) >= 0.12) + (python2.7dist(filelock) < 4~~ with python2.7dist(filelock) >= 3) + (python2.7dist(importlib-metadata) < 1~~ with python2.7dist(importlib-metadata) >= 0.12) python2.7dist(packaging) >= 14 - (python2.7dist(pluggy) < 1~ with python2.7dist(pluggy) >= 0.12) - (python2.7dist(py) < 2~ with python2.7dist(py) >= 1.4.17) - (python2.7dist(six) < 2~ with python2.7dist(six) >= 1) + (python2.7dist(pluggy) < 1~~ with python2.7dist(pluggy) >= 0.12) + (python2.7dist(py) < 2~~ with python2.7dist(py) >= 1.4.17) + (python2.7dist(six) < 2~~ with python2.7dist(six) >= 1) python2.7dist(toml) >= 0.9.4 python2.7dist(virtualenv) >= 14 usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info: @@ -105,7 +105,7 @@ python(abi) = 3.7 (python3.7dist(lazy-object-proxy) >= 1.4 with python3.7dist(lazy-object-proxy) < 1.5) (python3.7dist(six) >= 1.12 with python3.7dist(six) < 2) - (python3.7dist(typed-ast) < 1.5~ with python3.7dist(typed-ast) >= 1.4) + (python3.7dist(typed-ast) < 1.5~~ with python3.7dist(typed-ast) >= 1.4) (python3.7dist(wrapt) >= 1.11 with python3.7dist(wrapt) < 1.12) usr/lib/python3.7/site-packages/packaging-19.0.dist-info: provides: |- @@ -148,12 +148,12 @@ python3dist(tox) = 3.14 requires: |- python(abi) = 3.7 - (python3.7dist(filelock) < 4~ with python3.7dist(filelock) >= 3) - (python3.7dist(importlib-metadata) < 1~ with python3.7dist(importlib-metadata) >= 0.12) + (python3.7dist(filelock) < 4~~ with python3.7dist(filelock) >= 3) + (python3.7dist(importlib-metadata) < 1~~ with python3.7dist(importlib-metadata) >= 0.12) python3.7dist(packaging) >= 14 - (python3.7dist(pluggy) < 1~ with python3.7dist(pluggy) >= 0.12) - (python3.7dist(py) < 2~ with python3.7dist(py) >= 1.4.17) - (python3.7dist(six) < 2~ with python3.7dist(six) >= 1) + (python3.7dist(pluggy) < 1~~ with python3.7dist(pluggy) >= 0.12) + (python3.7dist(py) < 2~~ with python3.7dist(py) >= 1.4.17) + (python3.7dist(six) < 2~~ with python3.7dist(six) >= 1) python3.7dist(toml) >= 0.9.4 python3.7dist(virtualenv) >= 14 usr/lib/python3.9/site-packages/astroid-2.3.3.dist-info: @@ -205,7 +205,7 @@ python3.9dist(setuptools) >= 21 python3.9dist(six) >= 1.9 python3.9dist(urllib3) >= 1.24.2 - ((python3.9dist(websocket-client) < 0.40 or python3.9dist(websocket-client) > 0.40) with (python3.9dist(websocket-client) < 0.41~ or python3.9dist(websocket-client) >= 0.42) with (python3.9dist(websocket-client) < 0.42~ or python3.9dist(websocket-client) >= 0.43) with python3.9dist(websocket-client) >= 0.32) + ((python3.9dist(websocket-client) < 0.40 or python3.9dist(websocket-client) > 0.40) with (python3.9dist(websocket-client) < 0.41~~ or python3.9dist(websocket-client) >= 0.42) with (python3.9dist(websocket-client) < 0.42~~ or python3.9dist(websocket-client) >= 0.43) with python3.9dist(websocket-client) >= 0.32) usr/lib/python3.9/site-packages/mistune-0.8.4-py3.9.egg-info: provides: |- python3.9dist(mistune) = 0.8.4 @@ -260,11 +260,11 @@ python3dist(tox) = 3.14 requires: |- python(abi) = 3.9 - (python3.9dist(filelock) < 4~ with python3.9dist(filelock) >= 3) + (python3.9dist(filelock) < 4~~ with python3.9dist(filelock) >= 3) python3.9dist(packaging) >= 14 - (python3.9dist(pluggy) < 1~ with python3.9dist(pluggy) >= 0.12) - (python3.9dist(py) < 2~ with python3.9dist(py) >= 1.4.17) - (python3.9dist(six) < 2~ with python3.9dist(six) >= 1) + (python3.9dist(pluggy) < 1~~ with python3.9dist(pluggy) >= 0.12) + (python3.9dist(py) < 2~~ with python3.9dist(py) >= 1.4.17) + (python3.9dist(six) < 2~~ with python3.9dist(six) >= 1) python3.9dist(toml) >= 0.9.4 python3.9dist(virtualenv) >= 14 usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info: @@ -437,7 +437,7 @@ python2.7dist(setuptools) >= 21 python2.7dist(six) >= 1.9 python2.7dist(urllib3) >= 1.24.2 - ((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41~ or python2.7dist(websocket-client) >= 0.42) with (python2.7dist(websocket-client) < 0.42~ or python2.7dist(websocket-client) >= 0.43) with python2.7dist(websocket-client) >= 0.32) + ((python2.7dist(websocket-client) < 0.40 or python2.7dist(websocket-client) > 0.40) with (python2.7dist(websocket-client) < 0.41~~ or python2.7dist(websocket-client) >= 0.42) with (python2.7dist(websocket-client) < 0.42~~ or python2.7dist(websocket-client) >= 0.43) with python2.7dist(websocket-client) >= 0.32) usr/lib/python2.7/site-packages/mistune-0.8.4-py2.7.egg-info: provides: |- python2.7dist(mistune) = 0.8.4 @@ -489,7 +489,7 @@ python(abi) = 3.7 (python3.7dist(lazy-object-proxy) >= 1.4 with python3.7dist(lazy-object-proxy) < 1.5) (python3.7dist(six) >= 1.12 with python3.7dist(six) < 2) - (python3.7dist(typed-ast) < 1.5~ with python3.7dist(typed-ast) >= 1.4) + (python3.7dist(typed-ast) < 1.5~~ with python3.7dist(typed-ast) >= 1.4) (python3.7dist(wrapt) >= 1.11 with python3.7dist(wrapt) < 1.12) usr/lib/python3.7/site-packages/packaging-19.0.dist-info: provides: python3.7dist(packaging) = 19 @@ -554,11 +554,11 @@ python3dist(tox) = 3.14 requires: |- python(abi) = 3.9 - (python3.9dist(filelock) < 4~ with python3.9dist(filelock) >= 3) + (python3.9dist(filelock) < 4~~ with python3.9dist(filelock) >= 3) python3.9dist(packaging) >= 14 - (python3.9dist(pluggy) < 1~ with python3.9dist(pluggy) >= 0.12) - (python3.9dist(py) < 2~ with python3.9dist(py) >= 1.4.17) - (python3.9dist(six) < 2~ with python3.9dist(six) >= 1) + (python3.9dist(pluggy) < 1~~ with python3.9dist(pluggy) >= 0.12) + (python3.9dist(py) < 2~~ with python3.9dist(py) >= 1.4.17) + (python3.9dist(six) < 2~~ with python3.9dist(six) >= 1) python3.9dist(toml) >= 0.9.4 python3.9dist(virtualenv) >= 14 usr/lib/python3.9/site-packages/urllib3-1.25.7-py3.9.egg-info: @@ -611,12 +611,12 @@ python2dist(tox) = 3.14 requires: |- python(abi) = 2.7 - (python2.7dist(filelock) < 4~ with python2.7dist(filelock) >= 3) - (python2.7dist(importlib-metadata) < 1~ with python2.7dist(importlib-metadata) >= 0.12) + (python2.7dist(filelock) < 4~~ with python2.7dist(filelock) >= 3) + (python2.7dist(importlib-metadata) < 1~~ with python2.7dist(importlib-metadata) >= 0.12) python2.7dist(packaging) >= 14 - (python2.7dist(pluggy) < 1~ with python2.7dist(pluggy) >= 0.12) - (python2.7dist(py) < 2~ with python2.7dist(py) >= 1.4.17) - (python2.7dist(six) < 2~ with python2.7dist(six) >= 1) + (python2.7dist(pluggy) < 1~~ with python2.7dist(pluggy) >= 0.12) + (python2.7dist(py) < 2~~ with python2.7dist(py) >= 1.4.17) + (python2.7dist(six) < 2~~ with python2.7dist(six) >= 1) python2.7dist(toml) >= 0.9.4 python2.7dist(virtualenv) >= 14 usr/lib/python2.7/site-packages/urllib3-1.25.7-py2.7.egg-info: @@ -653,12 +653,12 @@ provides: python3.7dist(tox) = 3.14 requires: |- python(abi) = 3.7 - (python3.7dist(filelock) < 4~ with python3.7dist(filelock) >= 3) - (python3.7dist(importlib-metadata) < 1~ with python3.7dist(importlib-metadata) >= 0.12) + (python3.7dist(filelock) < 4~~ with python3.7dist(filelock) >= 3) + (python3.7dist(importlib-metadata) < 1~~ with python3.7dist(importlib-metadata) >= 0.12) python3.7dist(packaging) >= 14 - (python3.7dist(pluggy) < 1~ with python3.7dist(pluggy) >= 0.12) - (python3.7dist(py) < 2~ with python3.7dist(py) >= 1.4.17) - (python3.7dist(six) < 2~ with python3.7dist(six) >= 1) + (python3.7dist(pluggy) < 1~~ with python3.7dist(pluggy) >= 0.12) + (python3.7dist(py) < 2~~ with python3.7dist(py) >= 1.4.17) + (python3.7dist(six) < 2~~ with python3.7dist(six) >= 1) python3.7dist(toml) >= 0.9.4 python3.7dist(virtualenv) >= 14 usr/lib64/python2.7/site-packages/scipy-1.2.1.dist-info: @@ -1251,10 +1251,10 @@ (python3.9dist(foobar33) < 2.4.8 or python3.9dist(foobar33) > 2.4.8) (python3.9dist(foobar34) < 2.4.8 or python3.9dist(foobar34) > 2.4.8) (python3.9dist(foobar35) < 2.4.8.1 or python3.9dist(foobar35) > 2.4.8.1) - (python3.9dist(foobar36) < 2.4.8~ or python3.9dist(foobar36) >= 2.4.9) + (python3.9dist(foobar36) < 2.4.8~~ or python3.9dist(foobar36) >= 2.4.9) (python3.9dist(foobar37) < 2 or python3.9dist(foobar37) > 2) (python3.9dist(foobar38) < 2 or python3.9dist(foobar38) > 2) - (python3.9dist(foobar39) < 2~ or python3.9dist(foobar39) >= 3) + (python3.9dist(foobar39) < 2~~ or python3.9dist(foobar39) >= 3) (python3.9dist(foobar4) >= 2 with python3.9dist(foobar4) < 3) (python3.9dist(foobar40) < 2.4.8~b5 or python3.9dist(foobar40) > 2.4.8~b5) (python3.9dist(foobar41) < 2~b5 or python3.9dist(foobar41) > 2~b5) @@ -1263,21 +1263,21 @@ python3.9dist(foobar44) <= 2.4.8 python3.9dist(foobar45) <= 2.4.8 python3.9dist(foobar46) <= 2.4.8.1 - python3.9dist(foobar47) < 2.4.8~ + python3.9dist(foobar47) < 2.4.8~~ python3.9dist(foobar48) <= 2 python3.9dist(foobar49) <= 2 - python3.9dist(foobar50) < 2~ + python3.9dist(foobar50) < 2~~ python3.9dist(foobar51) <= 2.4.8~b5 python3.9dist(foobar52) <= 2~b5 python3.9dist(foobar53) <= 2.4.8^post1 python3.9dist(foobar54) <= 2^post1 - python3.9dist(foobar55) < 2.4.8~ - python3.9dist(foobar56) < 2.4.8~ - python3.9dist(foobar57) < 2.4.8.1~ - python3.9dist(foobar58) < 2.4.8~ - python3.9dist(foobar59) < 2~ - python3.9dist(foobar60) < 2~ - python3.9dist(foobar61) < 2~ + python3.9dist(foobar55) < 2.4.8~~ + python3.9dist(foobar56) < 2.4.8~~ + python3.9dist(foobar57) < 2.4.8.1~~ + python3.9dist(foobar58) < 2.4.8~~ + python3.9dist(foobar59) < 2~~ + python3.9dist(foobar60) < 2~~ + python3.9dist(foobar61) < 2~~ python3.9dist(foobar62) < 2.4.8~b5 python3.9dist(foobar63) < 2~b5 python3.9dist(foobar64) < 2.4.8^post1 From 2c2f8bd98495cabb0ecfbed9ea4747660f48bb37 Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Sun, 19 Dec 2021 14:08:05 -0800 Subject: [PATCH 03/37] Handle legacy version specifiers that would previously raise exceptions. --- python-rpm-generators.spec | 5 ++++- pythondistdeps.py | 29 ++++++++++++++++++++++------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index ef80ad4..64bc193 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 12 -Release: 10%{?dist} +Release: 11%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Sun Dec 19 2021 Gordon Messmer - 12-11 +- Handle legacy version specifiers that would previously raise exceptions. + * Fri Oct 29 2021 Gordon Messmer - 12-10 - Additional fix for dev releases. diff --git a/pythondistdeps.py b/pythondistdeps.py index 2e4c9c3..8ae142d 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -138,6 +138,9 @@ class RpmVersion(): # in public releases # https://www.python.org/dev/peps/pep-0440/#local-version-identifiers + def is_legacy(self): + return isinstance(self.version, str) + def increment(self): self.version[-1] += 1 self.pre = None @@ -146,7 +149,7 @@ class RpmVersion(): return self def __str__(self): - if isinstance(self.version, str): + if self.is_legacy(): return self.version if self.epoch: rpm_epoch = str(self.epoch) + ':' @@ -172,6 +175,11 @@ def convert_compatible(name, operator, version_id): print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr) exit(65) # os.EX_DATAERR version = RpmVersion(version_id) + if version.is_legacy(): + # LegacyVersions are not supported in this context + print("*** INVALID_REQUIREMENT_ERROR___SEE_STDERR ***") + print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr) + exit(65) # os.EX_DATAERR if len(version.version) == 1: print("*** INVALID_REQUIREMENT_ERROR___SEE_STDERR ***") print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr) @@ -204,6 +212,11 @@ def convert_not_equal(name, operator, version_id): if version_id.endswith('.*'): version_id = version_id[:-2] version = RpmVersion(version_id) + if version.is_legacy(): + # LegacyVersions are not supported in this context + print("*** INVALID_REQUIREMENT_ERROR___SEE_STDERR ***") + print('Invalid requirement: {} {} {}'.format(name, operator, version_id), file=stderr) + exit(65) # os.EX_DATAERR version_gt = RpmVersion(version_id).increment() version_gt_operator = '>=' # Prevent dev and pre-releases from satisfying a < requirement @@ -235,12 +248,14 @@ def convert_ordered(name, operator, version_id): operator = '<' else: version = RpmVersion(version_id) - # Prevent dev and pre-releases from satisfying a < requirement - if operator == '<' and not version.pre and not version.dev and not version.post: - version = '{}~~'.format(version) - # Prevent post-releases from satisfying a > requirement - if operator == '>' and not version.pre and not version.dev and not version.post: - version = '{}.0'.format(version) + # For backwards compatibility, fallback to previous behavior with LegacyVersions + if not version.is_legacy(): + # Prevent dev and pre-releases from satisfying a < requirement + if operator == '<' and not version.pre and not version.dev and not version.post: + version = '{}~~'.format(version) + # Prevent post-releases from satisfying a > requirement + if operator == '>' and not version.pre and not version.dev and not version.post: + version = '{}.0'.format(version) return '{} {} {}'.format(name, operator, version) From 2ff265d8fdb00b9b573662db9e8d487efdf52f5f Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 21 Jan 2022 15:19:07 +0000 Subject: [PATCH 04/37] - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- python-rpm-generators.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 64bc193..7a6c39b 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 12 -Release: 11%{?dist} +Release: 12%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri Jan 21 2022 Fedora Release Engineering - 12-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild + * Sun Dec 19 2021 Gordon Messmer - 12-11 - Handle legacy version specifiers that would previously raise exceptions. From fbd2f8726560b96106cda4748f665573c807cbe2 Mon Sep 17 00:00:00 2001 From: Tomas Orsava Date: Thu, 20 Jan 2022 19:03:13 +0100 Subject: [PATCH 05/37] Fix typo in lua comment --- pythonname.attr | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonname.attr b/pythonname.attr index 85969d7..9cd580a 100644 --- a/pythonname.attr +++ b/pythonname.attr @@ -8,7 +8,7 @@ local provides = python.python_altprovides_once(name, evr) -- provides is either an array/table or nil -- nil means the function was already called with the same arguments: - -- either with another file in %1 or manually via %py_provide + -- either with another file in %1 or manually via %py_provides if provides then for i, provide in ipairs(provides) do print(provide .. ' ') From b1fa63bf02b03b2120d32eb91ca2911d4ec77beb Mon Sep 17 00:00:00 2001 From: Tomas Orsava Date: Mon, 29 Nov 2021 12:31:48 +0100 Subject: [PATCH 06/37] From `python3-foo` packages automatically generate `python3.X-foo` Obsoletes tags on CentOS/RHEL --- python-rpm-generators.spec | 8 ++++++-- pythonname.attr | 23 +++++++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 7a6c39b..fd88df1 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 12 -Release: 12%{?dist} +Release: 13%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -25,7 +25,7 @@ Requires: python3-packaging # We have parametric macro generators, we need RPM 4.16 (4.15.90+ is 4.16 alpha) Requires: rpm > 4.15.90-0 # This contains the Lua functions we use: -Requires: python-srpm-macros >= 3.8-5 +Requires: python-srpm-macros >= 3.10-15 %description -n python3-rpm-generators %{summary}. @@ -47,6 +47,10 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Wed Jan 26 2022 Tomas Orsava - 12-13 +- From `python3-foo` packages automatically generate `python3.X-foo` Obsoletes + tags on CentOS/RHEL + * Fri Jan 21 2022 Fedora Release Engineering - 12-12 - Rebuilt for https://fedoraproject.org/wiki/Fedora_36_Mass_Rebuild diff --git a/pythonname.attr b/pythonname.attr index 9cd580a..07d8df5 100644 --- a/pythonname.attr +++ b/pythonname.attr @@ -16,4 +16,27 @@ end } +%__pythonname_obsoletes() %{?rhel:%{lua: + -- On CentOS/RHEL we automatically generate Obsoletes tags in the form: + -- package python3-foo -> Obsoletes: python3.XY-foo + -- This provides a clean upgrade path between major versions of CentOS/RHEL. + -- In Fedora this is not needed as we don't ship ecosystem packages + -- for alternative Python interpreters. + local python = require 'fedora.srpm.python' + -- this macro is called for each file in a package, the path being in %1 + -- but we don't need to know the path, so we would get for each file: Macro %1 defined but not used within scope + -- in here, we expand %name conditionally on %1 to suppress the warning + local name = rpm.expand('%{?1:%{name}}') + local evr = rpm.expand('%{?epoch:%{epoch}:}%{version}-%{release}') + local obsoletes = python.python_altobsoletes_once(name, evr) + -- obsoletes is either an array/table or nil + -- nil means the function was already called with the same arguments: + -- either with another file in %1 or manually via %py_provides + if obsoletes then + for i, obsolete in ipairs(obsoletes) do + print(obsolete .. ' ') + end + end +}} + %__pythonname_path ^/ From e18b8c952cc55b4808a952c9b731a54ac194c3f6 Mon Sep 17 00:00:00 2001 From: Tomas Orsava Date: Wed, 2 Feb 2022 11:32:20 +0100 Subject: [PATCH 07/37] Add tests for automatically not generating Obsoletes tags on Fedora --- tests/pythonname.sh | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/tests/pythonname.sh b/tests/pythonname.sh index ab2024a..b21058c 100755 --- a/tests/pythonname.sh +++ b/tests/pythonname.sh @@ -34,3 +34,43 @@ test $(rpm -qp --provides ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | grep echo "Provides for python3-py_provides" rpm -qp --provides ${RPMDIR}/python3-py_provides-0-0.noarch.rpm test $(rpm -qp --provides ${RPMDIR}/python3-py_provides-0-0.noarch.rpm | grep python-py_provides | wc -l) -eq 1 + + +echo "Obsoletes for python${X_Y}-foo" +rpm -qp --obsoletes ${RPMDIR}/python${X_Y}-foo-0-0.noarch.rpm +test $(rpm -qp --obsoletes ${RPMDIR}/python${X_Y}-foo-0-0.noarch.rpm | wc -l) -eq 0 + +echo "Obsoletes for python3-foo" +rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm +# In ELN/RHEL the pythonX.Y-* Obsoletes is generated, but not in Fedora, so we check for it explicitly. +rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm | grep -q '^python'${X_Y}'-py_provides < 0-0$' && exit 1 || true +test $(rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm | wc -l) -eq 0 + +echo "Obsoletes for python2-foo" +rpm -qp --obsoletes ${RPMDIR}/python2-foo-0-0.noarch.rpm +test $(rpm -qp --obsoletes ${RPMDIR}/python2-foo-0-0.noarch.rpm | wc -l) -eq 0 + +echo "Obsoletes for python-foo" +rpm -qp --obsoletes ${RPMDIR}/python-foo-0-0.noarch.rpm +test $(rpm -qp --obsoletes ${RPMDIR}/python-foo-0-0.noarch.rpm | wc -l) -eq 0 + +echo "Obsoletes for python3.5-foo" +rpm -qp --obsoletes ${RPMDIR}/python3.5-foo-0-0.noarch.rpm +test $(rpm -qp --obsoletes ${RPMDIR}/python3.5-foo-0-0.noarch.rpm | wc -l) -eq 0 + +echo "Obsoletes for python3-python_provide" +rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm +# The deprecated %python_provide macro always obsoletes python-foo +rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | grep -q '^python-python_provide < 0-0$' +# In ELN/RHEL the pythonX.Y-* Obsoletes is generated, but not in Fedora, so we check for it explicitly. +rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | grep -q '^python'${X_Y}'-python_provide < 0-0$' && exit 1 || true +test $(rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | grep python-python_provide | wc -l) -eq 1 +test $(rpm -qp --obsoletes ${RPMDIR}/python3-python_provide-0-0.noarch.rpm | wc -l) -eq 1 + +echo "Obsoletes for python3-py_provides" +rpm -qp --obsoletes ${RPMDIR}/python3-py_provides-0-0.noarch.rpm +rpm -qp --obsoletes ${RPMDIR}/python3-py_provides-0-0.noarch.rpm | grep -q '^python-py_provides < 0-0$' && exit 1 || true +# In ELN/RHEL the pythonX.Y-* Obsoletes is generated, but not in Fedora, so we check for it explicitly. +rpm -qp --obsoletes ${RPMDIR}/python3-py_provides-0-0.noarch.rpm | grep -q '^python'${X_Y}'-py_provides < 0-0$' && exit 1 || true +test $(rpm -qp --obsoletes ${RPMDIR}/python3-py_provides-0-0.noarch.rpm | wc -l) -eq 0 + From ecd2f8b3f858d5c6307042c4978577bfe2a9bb6a Mon Sep 17 00:00:00 2001 From: Charalampos Stratakis Date: Tue, 1 Feb 2022 21:22:28 +0100 Subject: [PATCH 08/37] Add rpminspect file --- rpminspect.yaml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 rpminspect.yaml diff --git a/rpminspect.yaml b/rpminspect.yaml new file mode 100644 index 0000000..4589e70 --- /dev/null +++ b/rpminspect.yaml @@ -0,0 +1,7 @@ +# completely disabled inspections: +inspections: + # there is no upstream and the files are changed from time to time + addedfiles: off + changedfiles: off + filesize: off + upstream: off From 76e71def2c27d6948167a31b9644a3678277e423 Mon Sep 17 00:00:00 2001 From: Sandro Mani Date: Mon, 24 Jan 2022 11:23:14 +0100 Subject: [PATCH 09/37] Add namespace option to pythodistdeps.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Miro Hrončok --- python-rpm-generators.spec | 5 +++- pythondistdeps.py | 23 +++++++++++-------- .../scripts_pythondistdeps/test-data.yaml | 8 +++++++ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index fd88df1..fbaff88 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 12 -Release: 13%{?dist} +Release: 14%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Thu Feb 10 2022 Sandro Mani - 12-14 +- Add namespace option to pythodistdeps.py to allow mingw-python generatros + * Wed Jan 26 2022 Tomas Orsava - 12-13 - From `python3-foo` packages automatically generate `python3.X-foo` Obsoletes tags on CentOS/RHEL diff --git a/pythondistdeps.py b/pythondistdeps.py index 8ae142d..92be3a5 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -326,6 +326,7 @@ def main(): parser.add_argument('--require-extras-subpackages', action='store_true', help="If there is a dependency on a package with extras functionality, require the extras subpackage") parser.add_argument('--package-name', action='store', help="Name of the RPM package that's being inspected. Required for extras requires/provides to work.") + parser.add_argument('--namespace', action='store', help="Namespace for the printed Requires, Provides, Recommends and Conflicts") parser.add_argument('files', nargs=argparse.REMAINDER, help="Files from the RPM package that are to be inspected, can also be supplied on stdin") args = parser.parse_args() @@ -374,6 +375,8 @@ def main(): package_name_parts = args.package_name.rpartition('+') extras_subpackage = package_name_parts[2].lower() or None + namespace = (args.namespace + "({})") if args.namespace else "{}" + for f in (args.files or stdin.readlines()): f = f.strip() lower = f.lower() @@ -430,31 +433,31 @@ def main(): extras_suffix = f"[{extras_subpackage}]" if extras_subpackage else "" # If egg/dist metadata says package name is python, we provide python(abi) if dist.normalized_name == 'python': - name = 'python(abi)' + name = namespace.format('python(abi)') if name not in py_deps: py_deps[name] = [] py_deps[name].append(('==', dist.py_version)) if not args.legacy or not args.majorver_only: if normalized_names_provide_legacy: - name = 'python{}dist({}{})'.format(dist.py_version, dist.legacy_normalized_name, extras_suffix) + name = namespace.format('python{}dist({}{})').format(dist.py_version, dist.legacy_normalized_name, extras_suffix) if name not in py_deps: py_deps[name] = [] if normalized_names_provide_pep503: - name_ = 'python{}dist({}{})'.format(dist.py_version, dist.normalized_name, extras_suffix) + name_ = namespace.format('python{}dist({}{})').format(dist.py_version, dist.normalized_name, extras_suffix) if name_ not in py_deps: py_deps[name_] = [] if args.majorver_provides or args.majorver_only or \ (args.majorver_provides_versions and dist.py_version in args.majorver_provides_versions): if normalized_names_provide_legacy: - pymajor_name = 'python{}dist({}{})'.format(pyver_major, dist.legacy_normalized_name, extras_suffix) + pymajor_name = namespace.format('python{}dist({}{})').format(pyver_major, dist.legacy_normalized_name, extras_suffix) if pymajor_name not in py_deps: py_deps[pymajor_name] = [] if normalized_names_provide_pep503: - pymajor_name_ = 'python{}dist({}{})'.format(pyver_major, dist.normalized_name, extras_suffix) + pymajor_name_ = namespace.format('python{}dist({}{})').format(pyver_major, dist.normalized_name, extras_suffix) if pymajor_name_ not in py_deps: py_deps[pymajor_name_] = [] if args.legacy or args.legacy_provides: - legacy_name = 'pythonegg({})({})'.format(pyver_major, dist.legacy_normalized_name) + legacy_name = namespace.format('pythonegg({})({})').format(pyver_major, dist.legacy_normalized_name) if legacy_name not in py_deps: py_deps[legacy_name] = [] if dist.version: @@ -477,7 +480,7 @@ def main(): if spec not in py_deps[legacy_name]: py_deps[legacy_name].append(spec) if args.requires or (args.recommends and dist.extras): - name = 'python(abi)' + name = namespace.format('python(abi)') # If egg/dist metadata says package name is python, we don't add dependency on python(abi) if dist.normalized_name == 'python': py_abi = False @@ -524,12 +527,12 @@ def main(): dep_normalized_name = dep.legacy_normalized_name if args.legacy: - name = 'pythonegg({})({})'.format(pyver_major, dep.legacy_normalized_name) + name = namespace.format('pythonegg({})({})').format(pyver_major, dep.legacy_normalized_name) else: if args.majorver_only: - name = 'python{}dist({}{})'.format(pyver_major, dep_normalized_name, extras_suffix) + name = namespace.format('python{}dist({}{})').format(pyver_major, dep_normalized_name, extras_suffix) else: - name = 'python{}dist({}{})'.format(dist.py_version, dep_normalized_name, extras_suffix) + name = namespace.format('python{}dist({}{})').format(dist.py_version, dep_normalized_name, extras_suffix) if dep.marker and not args.recommends and not extras_subpackage: if not dep.marker.evaluate(get_marker_env(dist, '')): diff --git a/tests/data/scripts_pythondistdeps/test-data.yaml b/tests/data/scripts_pythondistdeps/test-data.yaml index 7050e60..54e5b66 100644 --- a/tests/data/scripts_pythondistdeps/test-data.yaml +++ b/tests/data/scripts_pythondistdeps/test-data.yaml @@ -762,6 +762,14 @@ python3.9dist(simplejson) = 3.16 python3dist(simplejson) = 3.16 requires: python(abi) = 3.9 +--requires --namespace mingw64: + --provides --namespace mingw64: + usr/lib/python3.9/site-packages/taskotron_python_versions-0.1.dev6.dist-info: + provides: mingw64(python3.9dist(taskotron-python-versions)) = 0.1~~dev6 + requires: |- + mingw64(python(abi)) = 3.9 + mingw64(python3.9dist(libarchive-c)) + mingw64(python3.9dist(python-bugzilla)) --requires --console-scripts-nodep-setuptools-since 3.7: --provides --console-scripts-nodep-setuptools-since 3.6: usr/lib/python3.9/site-packages/zope.component-4.3.0-py3.9.egg-info: From 0bd051d51473d62519bc6e03cafdf323c5345e7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Fri, 27 May 2022 12:49:09 +0200 Subject: [PATCH 10/37] Don't include all requirements with True-evaluating markers in extras subpackages The idea is that the extra subpackage only has requirements specific to that extra. The logic however only excluded requirements without markers, but requirements with *a* marker that was correct leaked to all extras subpackages. E.g. with the following requirements: Requires-Dist: base-dependency Requires-Dist: base-dependency-with-matching-marker ; python_version < "3.15" Requires-Dist: base-dependency-with-unmatching-marker ; python_version < "3.8" Provides-Extra: an-extra Requires-Dist: extra-only-dependency-with-matching-marker ; extra == 'an-extra' and python_version < "3.15" Requires-Dist: extra-only-dependency-with-unmatching-marker ; extra == 'an-extra' and python_version < "3.8" On Python 3.10, the base package generated the following requirements: python3.10dist(base-dependency) python3.10dist(base-dependency-with-matching-marker) And for the [an-extra] extra: python3.10dist(base-dependency-with-matching-marker) <--- REDUNDANT, WRONG python3.10dist(extra-only-dependency-with-matching-marker) Now we no longer just check if the marker evaluates to True, but we also check that the same marker evaluates to False when the extra is not given. A real package with this issue is build[virtualenv] 0.8.0, which we use for tests. The package has: Requires-Dist: tomli (>=1.0.0) ; python_version < "3.11" And on Python 3.10, it generated the following dependency for python3-build+virtualenv-0.8.0-2.fc37.noarch.rpm: python3.10dist(tomli) >= 1 Now it no longer does. This is asserted in tests. Fixes https://bugzilla.redhat.com/show_bug.cgi?id=2090186 Upstream PR: https://github.com/rpm-software-management/python-rpm-packaging/pull/16 --- python-rpm-generators.spec | 6 +++++- pythondistdeps.py | 9 ++++++++- tests/data/scripts_pythondistdeps/test-data.yaml | 9 +++++++++ tests/data/scripts_pythondistdeps/test-requires.yaml | 3 +++ 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index fbaff88..933683f 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 12 -Release: 14%{?dist} +Release: 15%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,10 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri May 27 2022 Miro Hrončok - 12-15 +- Don't include all requirements with True-evaluating markers in extras subpackages +- Fixes: rhbz#2090186 + * Thu Feb 10 2022 Sandro Mani - 12-14 - Add namespace option to pythodistdeps.py to allow mingw-python generatros diff --git a/pythondistdeps.py b/pythondistdeps.py index 92be3a5..b825c35 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -112,10 +112,17 @@ class Distribution(PathDistribution): def requirements_for_extra(self, extra): extra_deps = [] + # we are only interested in dependencies with extra == 'our_extra' marker for req in self.requirements: + # no marker at all, nothing to evaluate if not req.marker: continue - if req.marker.evaluate(get_marker_env(self, extra)): + # does the marker include extra == 'our_extra'? + # we can only evaluate the marker as a whole, + # so we evaluate it twice (using 2 different marker_envs) + # and see if it only evaluates to True with our extra + if (req.marker.evaluate(get_marker_env(self, extra)) and + not req.marker.evaluate(get_marker_env(self, None))): extra_deps.append(req) return extra_deps diff --git a/tests/data/scripts_pythondistdeps/test-data.yaml b/tests/data/scripts_pythondistdeps/test-data.yaml index 54e5b66..6a8152d 100644 --- a/tests/data/scripts_pythondistdeps/test-data.yaml +++ b/tests/data/scripts_pythondistdeps/test-data.yaml @@ -1353,4 +1353,13 @@ python3.9dist(zope-component[security]) python3.9dist(zope-component[zcml]) python3.9dist(zope-testing) +--requires --normalized-names-format pep503 --require-extras-subpackages --package-name python3-build+virtualenv: + --provides --majorver-provides --normalized-names-format pep503 --package-name python3-build+virtualenv: + usr/lib/python3.10/site-packages/build-0.8.0.dist-info: + provides: |- + python3.10dist(build[virtualenv]) = 0.8 + python3dist(build[virtualenv]) = 0.8 + requires: |- + python(abi) = 3.10 + python3.10dist(virtualenv) >= 20.0.35 diff --git a/tests/data/scripts_pythondistdeps/test-requires.yaml b/tests/data/scripts_pythondistdeps/test-requires.yaml index d876674..ade5043 100644 --- a/tests/data/scripts_pythondistdeps/test-requires.yaml +++ b/tests/data/scripts_pythondistdeps/test-requires.yaml @@ -100,3 +100,6 @@ dnspython: '2.1.0': ['3.9'] wheel: '2.1.0': ['3.9'] +build: + wheel: + '0.8.0': ['3.10'] From cf65060b7e8aabacd6e183518da3bf6a952395e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Wed, 20 Apr 2022 13:07:09 +0200 Subject: [PATCH 11/37] https://fedoraproject.org/wiki/Changes/PythonDistPEP503ProvidesOnly --- python-rpm-generators.spec | 7 +++++-- pythondist.attr | 2 +- tests/pythondist.sh | 10 +++++----- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 933683f..9a7c8ed 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs -Version: 12 -Release: 15%{?dist} +Version: 13 +Release: 1%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Thu Jun 02 2022 Miro Hrončok - 13-1 +- https://fedoraproject.org/wiki/Changes/PythonDistPEP503ProvidesOnly + * Fri May 27 2022 Miro Hrončok - 12-15 - Don't include all requirements with True-evaluating markers in extras subpackages - Fixes: rhbz#2090186 diff --git a/pythondist.attr b/pythondist.attr index 747cc32..7170bdb 100644 --- a/pythondist.attr +++ b/pythondist.attr @@ -1,3 +1,3 @@ -%__pythondist_provides %{_rpmconfigdir}/pythondistdeps.py --provides --normalized-names-format pep503 --package-name %{name} --normalized-names-provide-both --majorver-provides-versions %{__default_python3_version} +%__pythondist_provides %{_rpmconfigdir}/pythondistdeps.py --provides --normalized-names-format pep503 --package-name %{name} --majorver-provides-versions %{__default_python3_version} %__pythondist_requires %{_rpmconfigdir}/pythondistdeps.py --requires --normalized-names-format pep503 --package-name %{name} %{?!_python_no_extras_requires:--require-extras-subpackages} --console-scripts-nodep-setuptools-since 3.10 %__pythondist_path ^/usr/lib(64)?/python[3-9]\\.[[:digit:]]+/site-packages/[^/]+\\.(dist-info|egg-info|egg-link)$ diff --git a/tests/pythondist.sh b/tests/pythondist.sh index 4f2e15d..51f5511 100755 --- a/tests/pythondist.sh +++ b/tests/pythondist.sh @@ -8,9 +8,9 @@ spectool -g -R pythondist.spec rpmbuild -ba pythondist.spec -rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' +rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' -rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope\.component)' +rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope\.component)' && exit 1 || true rpm -qp --provides ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope-component)' rpm -qp --requires ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^python'$X_Y'dist(zope-event)' @@ -19,7 +19,7 @@ rpm -qp --requires ${RPMDIR}/python3-zope-component-4.3.0-0.noarch.rpm | grep '^ rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' && exit 1 || true -rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope\.component)' +rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope\.component)' && exit 1 || true rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope-component)' rpm -qp --requires ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope-event)' @@ -28,7 +28,7 @@ rpm -qp --requires ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep if [ "$X_Y" != "3.9" ]; then rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' && exit 1 || true -rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope\.component)' +rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope\.component)' && exit 1 || true rpm -qp --provides ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope-component)' rpm -qp --requires ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope-event)' @@ -38,7 +38,7 @@ fi if [ "$X_Y" != "3.10" ]; then rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope\.component)' && exit 1 || true rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3dist(zope-component)' && exit 1 || true -rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope\.component)' +rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope\.component)' && exit 1 || true rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope-component)' rpm -qp --requires ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope-event)' From 7b3e3b30de218e4c33034b85781fd8e344ff113d Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 22 Jul 2022 22:07:02 +0000 Subject: [PATCH 12/37] Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- python-rpm-generators.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 9a7c8ed..e5dee70 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 13 -Release: 1%{?dist} +Release: 2%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri Jul 22 2022 Fedora Release Engineering - 13-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild + * Thu Jun 02 2022 Miro Hrončok - 13-1 - https://fedoraproject.org/wiki/Changes/PythonDistPEP503ProvidesOnly From 197a88bf932fd7f552724a0bb1eecc31c906eb7d Mon Sep 17 00:00:00 2001 From: Karolina Surma Date: Thu, 22 Dec 2022 16:48:53 +0100 Subject: [PATCH 13/37] https://fedoraproject.org/wiki/Changes/Prevent-Providing-python3dist(pkg)=0 --- python-rpm-generators.spec | 7 +++- pythondist.attr | 2 +- pythondistdeps.py | 18 +++++++++ .../scripts_pythondistdeps/test-data.yaml | 37 ++++++++++++++++++- .../scripts_pythondistdeps/test-requires.yaml | 4 ++ 5 files changed, 64 insertions(+), 4 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index e5dee70..1f42b8e 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs -Version: 13 -Release: 2%{?dist} +Version: 14 +Release: 1%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Thu Dec 22 2022 Karolina Surma - 14-1 +- https://fedoraproject.org/wiki/Changes/Prevent-Providing-python3dist(pkg)=0 + * Fri Jul 22 2022 Fedora Release Engineering - 13-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_37_Mass_Rebuild diff --git a/pythondist.attr b/pythondist.attr index 7170bdb..42ae7ad 100644 --- a/pythondist.attr +++ b/pythondist.attr @@ -1,3 +1,3 @@ -%__pythondist_provides %{_rpmconfigdir}/pythondistdeps.py --provides --normalized-names-format pep503 --package-name %{name} --majorver-provides-versions %{__default_python3_version} +%__pythondist_provides %{_rpmconfigdir}/pythondistdeps.py --provides --normalized-names-format pep503 --package-name %{name} --majorver-provides-versions %{__default_python3_version} %{?!_python_dist_allow_version_zero:--fail-if-zero} %__pythondist_requires %{_rpmconfigdir}/pythondistdeps.py --requires --normalized-names-format pep503 --package-name %{name} %{?!_python_no_extras_requires:--require-extras-subpackages} --console-scripts-nodep-setuptools-since 3.10 %__pythondist_path ^/usr/lib(64)?/python[3-9]\\.[[:digit:]]+/site-packages/[^/]+\\.(dist-info|egg-info|egg-link)$ diff --git a/pythondistdeps.py b/pythondistdeps.py index b825c35..ec80125 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -155,6 +155,9 @@ class RpmVersion(): self.post = None return self + def is_zero(self): + return self.__str__() == '0' + def __str__(self): if self.is_legacy(): return self.version @@ -334,9 +337,13 @@ def main(): help="If there is a dependency on a package with extras functionality, require the extras subpackage") parser.add_argument('--package-name', action='store', help="Name of the RPM package that's being inspected. Required for extras requires/provides to work.") parser.add_argument('--namespace', action='store', help="Namespace for the printed Requires, Provides, Recommends and Conflicts") + parser.add_argument('--fail-if-zero', action='store_true', help='Fail the script if the automatically generated Provides version was 0, which usually indicates a packaging error.') parser.add_argument('files', nargs=argparse.REMAINDER, help="Files from the RPM package that are to be inspected, can also be supplied on stdin") args = parser.parse_args() + if args.fail_if_zero and not args.provides: + raise parser.error('--fail-if-zero only works with --provides') + py_abi = args.requires py_deps = {} @@ -470,6 +477,17 @@ def main(): if dist.version: version = dist.version spec = ('==', version) + if args.fail_if_zero: + if RpmVersion(version).is_zero(): + print('*** PYTHON_PROVIDED_VERSION_NORMALIZES_TO_ZERO___SEE_STDERR ***') + print(f'\nError: The version in the Python package metadata {version} normalizes to zero.\n' + 'It\'s likely a packaging error caused by missing version information\n' + '(e.g. when using a version control system snapshot as a source).\n' + 'Try providing the version information manually when building the Python package,\n' + 'for example by setting the SETUPTOOLS_SCM_PRETEND_VERSION environment variable if the package uses setuptools_scm.\n' + 'If you are confident that the version of the Python package is intentionally zero,\n' + 'you may %define the _python_dist_allow_version_zero macro in the spec file to disable this check.\n', file=stderr) + exit(65) # os.EX_DATAERR if normalized_names_provide_legacy: if spec not in py_deps[name]: diff --git a/tests/data/scripts_pythondistdeps/test-data.yaml b/tests/data/scripts_pythondistdeps/test-data.yaml index 6a8152d..f1116a5 100644 --- a/tests/data/scripts_pythondistdeps/test-data.yaml +++ b/tests/data/scripts_pythondistdeps/test-data.yaml @@ -1362,4 +1362,39 @@ requires: |- python(abi) = 3.10 python3.10dist(virtualenv) >= 20.0.35 - +--requires --fail-if-zero: + --provides --majorver-provides --fail-if-zero: + usr/lib/python3.11/site-packages/importlib_metadata-0.0-py3.11.egg-info: + stderr: + provides: |- + Error: The version in the Python package metadata 0.0 normalizes to zero. + It's likely a packaging error caused by missing version information + (e.g. when using a version control system snapshot as a source). + Try providing the version information manually when building the Python package, + for example by setting the SETUPTOOLS_SCM_PRETEND_VERSION environment variable if the package uses setuptools_scm. + If you are confident that the version of the Python package is intentionally zero, + you may %define the _python_dist_allow_version_zero macro in the spec file to disable this check. + requires: '*error: --fail-if-zero only works with --provides*' + stdout: + provides: '*** PYTHON_PROVIDED_VERSION_NORMALIZES_TO_ZERO___SEE_STDERR ***' + requires: '' +--requires: + --provides --majorver-provides: + usr/lib/python3.11/site-packages/importlib_metadata-0.0-py3.11.egg-info: + provides: |- + python3.11dist(importlib-metadata) = 0 + python3dist(importlib-metadata) = 0 + requires: |- + python(abi) = 3.11 + python3.11dist(setuptools) + python3.11dist(wheel) +--requires: + --provides --majorver-provides --fail-if-zero: + usr/lib/python3.11/site-packages/importlib_metadata-0.1-py3.11.egg-info: + provides: |- + python3.11dist(importlib-metadata) = 0.1 + python3dist(importlib-metadata) = 0.1 + requires: |- + python(abi) = 3.11 + python3.11dist(setuptools) + python3.11dist(wheel) diff --git a/tests/data/scripts_pythondistdeps/test-requires.yaml b/tests/data/scripts_pythondistdeps/test-requires.yaml index ade5043..35314a5 100644 --- a/tests/data/scripts_pythondistdeps/test-requires.yaml +++ b/tests/data/scripts_pythondistdeps/test-requires.yaml @@ -103,3 +103,7 @@ dnspython: build: wheel: '0.8.0': ['3.10'] +importlib_metadata: + sdist: + '0.0': ['3.11'] + '0.1': ['3.11'] From 78c739cfd1f8a93ea029f3a5e36d5838331914cd Mon Sep 17 00:00:00 2001 From: Karolina Surma Date: Wed, 4 Jan 2023 18:05:28 +0100 Subject: [PATCH 14/37] Update the test data sources --- .gitignore | 1 + sources | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 78062d7..1f380c9 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /tests/__pycache__/ /tests/data/scripts_pythondistdeps/usr/ /test-sources-2021-03-11.tar.gz +/test-sources-2023-01-04.tar.gz diff --git a/sources b/sources index d8fedb8..7d51236 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (test-sources-2021-03-11.tar.gz) = 6f34c8151625be489a6a4d56d1fd3d39b7908bd31402c9703cb65918385320dfad35f35a32920c816fb85a829f44aaf04dc1d0654ccf512e26e87e95dbf87430 +SHA512 (test-sources-2023-01-04.tar.gz) = ca25c35970e91adeaed0873c045f4335c33b96a4ef4c56a36bfb2fd9e1d4799142cf0513abb066479fdb14d2d184b3b825c1d90119ac8e8d0e9aa1a4423701d1 From 9d7ca941e7b2f80fba83a0a923e682f4bf9b9603 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 20 Jan 2023 17:03:50 +0000 Subject: [PATCH 15/37] Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- python-rpm-generators.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 1f42b8e..5596407 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 1%{?dist} +Release: 2%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri Jan 20 2023 Fedora Release Engineering - 14-2 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild + * Thu Dec 22 2022 Karolina Surma - 14-1 - https://fedoraproject.org/wiki/Changes/Prevent-Providing-python3dist(pkg)=0 From 1bdd94dd1d9c6fa08999ea02eda850569d065c95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Thu, 19 Jan 2023 17:36:21 +0100 Subject: [PATCH 16/37] CI: Include stdout/stderr in test failures --- tests/test_scripts_pythondistdeps.py | 5 +++++ tests/tests.yml | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/tests/test_scripts_pythondistdeps.py b/tests/test_scripts_pythondistdeps.py index 79f0c6f..7a7f57a 100644 --- a/tests/test_scripts_pythondistdeps.py +++ b/tests/test_scripts_pythondistdeps.py @@ -53,6 +53,11 @@ def run_pythondistdeps(provides_params, requires_params, dist_egg_info_path, exp requires = subprocess.run((sys.executable, PYTHONDISTDEPS_PATH, *shlex.split(requires_params)), input=files, capture_output=True, check=False, encoding="utf-8") + print(provides_params, provides.stdout, sep=':\n', file=sys.stdout) + print(requires_params, requires.stdout, sep=':\n', file=sys.stdout) + print(provides_params, provides.stderr, sep=':\n', file=sys.stderr) + print(requires_params, requires.stderr, sep=':\n', file=sys.stderr) + if expect_failure: if provides.returncode == 0 or requires.returncode == 0: raise RuntimeError(f"pythondistdeps.py did not exit with a non-zero code as expected.\n" diff --git a/tests/tests.yml b/tests/tests.yml index 668ff36..54a0aaf 100644 --- a/tests/tests.yml +++ b/tests/tests.yml @@ -36,7 +36,7 @@ - pytest: dir: ./tests # Use update-test-sources.sh to update the test data - run: python3 -m pytest --capture=no -vvv + run: python3 -m pytest -vvv required_packages: - rpm-build - rpmdevtools From 500fda1e6db830271a34dcb63cd1b1a50fa322ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Thu, 19 Jan 2023 17:44:36 +0100 Subject: [PATCH 17/37] CI: Remove tests for non-PEP440 versions packaging 22+ no longer supports them, so neither can we. --- .../PKG-INFO | 2 +- .../requires.txt | 8 -------- tests/data/scripts_pythondistdeps/test-data.yaml | 12 ++---------- 3 files changed, 3 insertions(+), 19 deletions(-) rename tests/data/scripts_pythondistdeps/{pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info => pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info}/PKG-INFO (97%) rename tests/data/scripts_pythondistdeps/{pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info => pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info}/requires.txt (92%) diff --git a/tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info/PKG-INFO b/tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info/PKG-INFO similarity index 97% rename from tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info/PKG-INFO rename to tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info/PKG-INFO index a99b21c..cf262f7 100644 --- a/tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info/PKG-INFO +++ b/tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: pyreq2rpm.tests -Version: 2020.04.07.024dab0 +Version: 2020.04.07.024 Summary: Test package to verify conversion of dependencies from pip/python to rpm format, data taken from pyreq2rpm Author: Tomas Orsava (author of this metapackage) Home-page: https://github.com/gordonmessmer/pyreq2rpm diff --git a/tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info/requires.txt b/tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info/requires.txt similarity index 92% rename from tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info/requires.txt rename to tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info/requires.txt index 338afcc..1b5da2d 100644 --- a/tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info/requires.txt +++ b/tests/data/scripts_pythondistdeps/pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info/requires.txt @@ -45,10 +45,8 @@ foobar43!=2.0.post1 foobar44<=2.4.8 foobar45<=2.4.8.0 foobar46<=2.4.8.1 -foobar47<=2.4.8.* foobar48<=2.0 foobar49<=2 -foobar50<=2.* foobar51<=2.4.8b5 foobar52<=2.0.0b5 foobar53<=2.4.8.post1 @@ -56,10 +54,8 @@ foobar54<=2.0.post1 foobar55<2.4.8 foobar56<2.4.8.0 foobar57<2.4.8.1 -foobar58<2.4.8.* foobar59<2.0 foobar60<2 -foobar61<2.* foobar62<2.4.8b5 foobar63<2.0.0b5 foobar64<2.4.8.post1 @@ -67,10 +63,8 @@ foobar65<2.0.post1 foobar66>=2.4.8 foobar67>=2.4.8.0 foobar68>=2.4.8.1 -foobar69>=2.4.8.* foobar70>=2.0 foobar71>=2 -foobar72>=2.* foobar73>=2.4.8b5 foobar74>=2.0.0b5 foobar75>=2.4.8.post1 @@ -78,10 +72,8 @@ foobar76>=2.0.post1 foobar77>2.4.8 foobar78>2.4.8.0 foobar79>2.4.8.1 -foobar80>2.4.8.* foobar81>2.0 foobar82>2 -foobar83>2.* foobar84>2.4.8b5 foobar85>2.0.0b5 foobar86>2.4.8.post1 diff --git a/tests/data/scripts_pythondistdeps/test-data.yaml b/tests/data/scripts_pythondistdeps/test-data.yaml index f1116a5..aa0bcdc 100644 --- a/tests/data/scripts_pythondistdeps/test-data.yaml +++ b/tests/data/scripts_pythondistdeps/test-data.yaml @@ -1224,8 +1224,8 @@ stdout: provides: '*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***' requires: '*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***' - pyreq2rpm.tests-2020.04.07.024dab0-py3.9.egg-info: - provides: python3.9dist(pyreq2rpm-tests) = 2020.04.07.024dab0 + pyreq2rpm.tests-2020.04.07.024-py3.9.egg-info: + provides: python3.9dist(pyreq2rpm-tests) = 2020.4.7.24 requires: |- python(abi) = 3.9 ((python3.9dist(babel) < 2 or python3.9dist(babel) > 2) with python3.9dist(babel) >= 1.3) @@ -1271,10 +1271,8 @@ python3.9dist(foobar44) <= 2.4.8 python3.9dist(foobar45) <= 2.4.8 python3.9dist(foobar46) <= 2.4.8.1 - python3.9dist(foobar47) < 2.4.8~~ python3.9dist(foobar48) <= 2 python3.9dist(foobar49) <= 2 - python3.9dist(foobar50) < 2~~ python3.9dist(foobar51) <= 2.4.8~b5 python3.9dist(foobar52) <= 2~b5 python3.9dist(foobar53) <= 2.4.8^post1 @@ -1282,10 +1280,8 @@ python3.9dist(foobar55) < 2.4.8~~ python3.9dist(foobar56) < 2.4.8~~ python3.9dist(foobar57) < 2.4.8.1~~ - python3.9dist(foobar58) < 2.4.8~~ python3.9dist(foobar59) < 2~~ python3.9dist(foobar60) < 2~~ - python3.9dist(foobar61) < 2~~ python3.9dist(foobar62) < 2.4.8~b5 python3.9dist(foobar63) < 2~b5 python3.9dist(foobar64) < 2.4.8^post1 @@ -1293,11 +1289,9 @@ python3.9dist(foobar66) >= 2.4.8 python3.9dist(foobar67) >= 2.4.8 python3.9dist(foobar68) >= 2.4.8.1 - python3.9dist(foobar69) >= 2.4.8 (python3.9dist(foobar7) >= 2.4.8~b5 with python3.9dist(foobar7) < 2.5) python3.9dist(foobar70) >= 2 python3.9dist(foobar71) >= 2 - python3.9dist(foobar72) >= 2 python3.9dist(foobar73) >= 2.4.8~b5 python3.9dist(foobar74) >= 2~b5 python3.9dist(foobar75) >= 2.4.8^post1 @@ -1306,10 +1300,8 @@ python3.9dist(foobar78) > 2.4.8.0 python3.9dist(foobar79) > 2.4.8.1.0 (python3.9dist(foobar8) >= 2~b5 with python3.9dist(foobar8) < 2.1) - python3.9dist(foobar80) >= 2.4.8 python3.9dist(foobar81) > 2.0 python3.9dist(foobar82) > 2.0 - python3.9dist(foobar83) >= 2 python3.9dist(foobar84) > 2.4.8~b5 python3.9dist(foobar85) > 2~b5 python3.9dist(foobar86) > 2.4.8^post1 From 279638a969f7c9f142c7a969d6aafbe0215ede3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Tue, 7 Mar 2023 17:16:58 +0100 Subject: [PATCH 18/37] Avoid needless pkg_resources import in pythonbundles.py --- python-rpm-generators.spec | 5 ++++- pythonbundles.py | 5 ----- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 5596407..fc8c7ee 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 2%{?dist} +Release: 3%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Tue Mar 07 2023 Miro Hrončok - 14-3 +- Avoid needless pkg_resources import in pythonbundles.py + * Fri Jan 20 2023 Fedora Release Engineering - 14-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild diff --git a/pythonbundles.py b/pythonbundles.py index 6242e20..9c58f6c 100755 --- a/pythonbundles.py +++ b/pythonbundles.py @@ -15,12 +15,7 @@ import pathlib import sys -# inject parse_version import to pythondistdeps -# not the nicest API, but :/ -from pkg_resources import parse_version import pythondistdeps -pythondistdeps.parse_version = parse_version - def generate_bundled_provides(paths, namespace): provides = set() From 079b71a567cf8d81314e18938b54f521d555cec9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Tue, 7 Mar 2023 17:35:06 +0100 Subject: [PATCH 19/37] Ignore environment markers in pythonbundles.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use packaging.requirements instead of a naïve split on ==. --- python-rpm-generators.spec | 1 + pythonbundles.py | 12 ++++++++++-- .../pkg_resources_setuptools.out | 1 + tests/data/scripts_pythonbundles/setuptools.in | 1 + tests/data/scripts_pythonbundles/setuptools.out | 1 + 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index fc8c7ee..580eb06 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -49,6 +49,7 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %changelog * Tue Mar 07 2023 Miro Hrončok - 14-3 - Avoid needless pkg_resources import in pythonbundles.py +- Ignore environment markers in pythonbundles.py * Fri Jan 20 2023 Fedora Release Engineering - 14-2 - Rebuilt for https://fedoraproject.org/wiki/Fedora_38_Mass_Rebuild diff --git a/pythonbundles.py b/pythonbundles.py index 9c58f6c..8adc36f 100755 --- a/pythonbundles.py +++ b/pythonbundles.py @@ -15,6 +15,8 @@ import pathlib import sys +from packaging import requirements + import pythondistdeps def generate_bundled_provides(paths, namespace): @@ -33,8 +35,14 @@ def generate_bundled_provides(paths, namespace): continue line = line.strip() if line: - name, _, version = line.partition('==') - name = pythondistdeps.normalize_name(name) + requirement = requirements.Requirement(line) + for spec in requirement.specifier: + if spec.operator == '==': + version = spec.version + break + else: + raise ValueError('pythonbundles.py only handles exactly one == requirement') + name = pythondistdeps.normalize_name(requirement.name) bundled_name = f"bundled({namespace}({name}))" python_provide = pythondistdeps.convert(bundled_name, '==', version) provides.add(f'Provides: {python_provide}') diff --git a/tests/data/scripts_pythonbundles/pkg_resources_setuptools.out b/tests/data/scripts_pythonbundles/pkg_resources_setuptools.out index cc2d710..0d41629 100644 --- a/tests/data/scripts_pythonbundles/pkg_resources_setuptools.out +++ b/tests/data/scripts_pythonbundles/pkg_resources_setuptools.out @@ -3,3 +3,4 @@ Provides: bundled(python3dist(ordered-set)) = 3.1.1 Provides: bundled(python3dist(packaging)) = 16.8 Provides: bundled(python3dist(pyparsing)) = 2.2.1 Provides: bundled(python3dist(six)) = 1.10 +Provides: bundled(python3dist(tomli)) = 1.2.3 diff --git a/tests/data/scripts_pythonbundles/setuptools.in b/tests/data/scripts_pythonbundles/setuptools.in index d7d2beb..64ee9d3 100644 --- a/tests/data/scripts_pythonbundles/setuptools.in +++ b/tests/data/scripts_pythonbundles/setuptools.in @@ -1,3 +1,4 @@ packaging==16.8 pyparsing==2.2.1 ordered-set==3.1.1 +tomli==1.2.3;python_version<"3.11" diff --git a/tests/data/scripts_pythonbundles/setuptools.out b/tests/data/scripts_pythonbundles/setuptools.out index 0acb887..ec452db 100644 --- a/tests/data/scripts_pythonbundles/setuptools.out +++ b/tests/data/scripts_pythonbundles/setuptools.out @@ -1,3 +1,4 @@ Provides: bundled(python3dist(ordered-set)) = 3.1.1 Provides: bundled(python3dist(packaging)) = 16.8 Provides: bundled(python3dist(pyparsing)) = 2.2.1 +Provides: bundled(python3dist(tomli)) = 1.2.3 From 2b230d8b53a71b42052f7ef0e2f0f87c51b5b7f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Mon, 13 Mar 2023 15:49:45 +0100 Subject: [PATCH 20/37] CI: Assert pythonbundles also ignores [extras] See https://bugzilla.redhat.com/show_bug.cgi?id=2140230#c12 to #c14. --- tests/data/scripts_pythonbundles/pipenv.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/data/scripts_pythonbundles/pipenv.in b/tests/data/scripts_pythonbundles/pipenv.in index de5797a..7735210 100644 --- a/tests/data/scripts_pythonbundles/pipenv.in +++ b/tests/data/scripts_pythonbundles/pipenv.in @@ -31,7 +31,7 @@ requirementslib==1.5.11 distlib==0.3.0 packaging==20.3 pyparsing==2.4.7 - plette==0.2.3 + plette[validation]==0.2.3 tomlkit==0.5.11 shellingham==1.3.2 six==1.14.0 From 2b8d03b0b153b90e64e3206c2d28c4bf765defc0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Tue, 18 Apr 2023 10:07:17 +0200 Subject: [PATCH 21/37] CI: Add `rpm -qa | sort` for easier inspectability --- tests/tests.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/tests.yml b/tests/tests.yml index 54a0aaf..bd27cda 100644 --- a/tests/tests.yml +++ b/tests/tests.yml @@ -18,6 +18,9 @@ roles: - role: standard-test-basic tests: + - rpm_qa: + dir: . + run: rpm -qa | sort - pythonabi: dir: . run: ./pythonabi.sh From d6993270c2a89e3d4b44da712f5f5fec630fb866 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Wed, 19 Apr 2023 14:34:31 +0200 Subject: [PATCH 22/37] CI: Run pytest via script to make it easier to reuse it in python-packaging --- tests/download_data_and_run_pytest.sh | 14 ++++++++++++++ tests/tests.yml | 9 +++------ 2 files changed, 17 insertions(+), 6 deletions(-) create mode 100755 tests/download_data_and_run_pytest.sh diff --git a/tests/download_data_and_run_pytest.sh b/tests/download_data_and_run_pytest.sh new file mode 100755 index 0000000..8dca398 --- /dev/null +++ b/tests/download_data_and_run_pytest.sh @@ -0,0 +1,14 @@ +#!/usr/bin/bash -eux +# Use update-test-sources.sh to update the test data + +# When the tests run in python-rpm-generators, +# the structure on disk does not match the dist-git repository. +# We apparently must use the standard-test-source role to grab the sources. +# OTOH in other packages, we must use fedpkg(-minimal). +# The --force flag is required in full-blown fedpkg (the source is unused in spec), +# and it is ignored in fedpkg-minimal (all sources are always downloaded). +test -f test-sources-*.tar.gz || fedpkg sources --force + +tar -xvf test-sources-*.tar.gz -C ./tests/data/scripts_pythondistdeps/ +cd tests/ +python3 -m pytest -vvv diff --git a/tests/tests.yml b/tests/tests.yml index bd27cda..22b2cb7 100644 --- a/tests/tests.yml +++ b/tests/tests.yml @@ -33,16 +33,13 @@ - console_script: dir: . run: ./console_script.sh - - prepare-test-data: - dir: . - run: tar -xvf test-sources-*.tar.gz -C ./tests/data/scripts_pythondistdeps/ - pytest: - dir: ./tests - # Use update-test-sources.sh to update the test data - run: python3 -m pytest -vvv + dir: . + run: ./download_data_and_run_pytest.sh required_packages: - rpm-build - rpmdevtools + - fedpkg-minimal - python3-devel - python3-pip - python3-pytest From 47a0b37ac072262826ce1481673067d675d0b885 Mon Sep 17 00:00:00 2001 From: Kalev Lember Date: Thu, 20 Apr 2023 04:10:35 +0200 Subject: [PATCH 23/37] Generate provides for /app-installed flatpak builds The generator deliberately does not use %{_prefix} in order to avoid generating provides for packages that set a custom prefix. This is done to ensure that provides are only generated for paths where the Python interpreter actually loads modules from. As we can't use %{_prefix} (which would make it all much simpler), this commit adds a conditional to look in /app only when the %flatpak macro is defined, and /usr otherwise. This should fix provides generation for /app-installed flatpak builds. --- python-rpm-generators.spec | 5 ++++- python.attr | 14 +++++++++----- pythondist.attr | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 580eb06..8f0a75b 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 3%{?dist} +Release: 4%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Mon Apr 17 2023 Kalev Lember - 14-4 +- Generate provides for /app-installed flatpak builds + * Tue Mar 07 2023 Miro Hrončok - 14-3 - Avoid needless pkg_resources import in pythonbundles.py - Ignore environment markers in pythonbundles.py diff --git a/python.attr b/python.attr index 1793d3c..cf5ae39 100644 --- a/python.attr +++ b/python.attr @@ -5,8 +5,10 @@ -- python(abi) = MAJOR.MINOR -- (Don't match against -config tools e.g. /usr/bin/python2.6-config) local path = rpm.expand('%1') - if path:match('/usr/bin/python%d+%.%d+$') then - local provides = path:gsub('.*/usr/bin/python(%d+%.%d+)', 'python(abi) = %1') + -- Use /usr prefix by default, and /app for flatpak builds + local prefix = rpm.expand('%{?!flatpak:/usr}%{?flatpak:/app}') + if path:match(prefix .. '/bin/python%d+%.%d+$') then + local provides = path:gsub('.*' .. prefix .. '/bin/python(%d+%.%d+)', 'python(abi) = %1') print(provides) end } @@ -18,10 +20,12 @@ -- generating a line of the form: -- python(abi) = MAJOR.MINOR local path = rpm.expand('%1') - if path:match('/usr/lib%d*/python%d+%.%d+/.*') then - local requires = path:gsub('.*/usr/lib%d*/python(%d+%.%d+)/.*', 'python(abi) = %1') + -- Use /usr prefix by default, and /app for flatpak builds + local prefix = rpm.expand('%{?!flatpak:/usr}%{?flatpak:/app}') + if path:match(prefix .. '/lib%d*/python%d+%.%d+/.*') then + local requires = path:gsub('.*' .. prefix .. '/lib%d*/python(%d+%.%d+)/.*', 'python(abi) = %1') print(requires) end } -%__python_path ^((%{_prefix}/lib(64)?/python[[:digit:]]+\\.[[:digit:]]+/.*\\.(py[oc]?|so))|(%{_bindir}/python[[:digit:]]+\\.[[:digit:]]+))$ +%__python_path ^((%{?!flatpak:/usr}%{?flatpak:/app}/lib(64)?/python[[:digit:]]+\\.[[:digit:]]+/.*\\.(py[oc]?|so))|(%{_bindir}/python[[:digit:]]+\\.[[:digit:]]+))$ diff --git a/pythondist.attr b/pythondist.attr index 42ae7ad..ede3a51 100644 --- a/pythondist.attr +++ b/pythondist.attr @@ -1,3 +1,3 @@ %__pythondist_provides %{_rpmconfigdir}/pythondistdeps.py --provides --normalized-names-format pep503 --package-name %{name} --majorver-provides-versions %{__default_python3_version} %{?!_python_dist_allow_version_zero:--fail-if-zero} %__pythondist_requires %{_rpmconfigdir}/pythondistdeps.py --requires --normalized-names-format pep503 --package-name %{name} %{?!_python_no_extras_requires:--require-extras-subpackages} --console-scripts-nodep-setuptools-since 3.10 -%__pythondist_path ^/usr/lib(64)?/python[3-9]\\.[[:digit:]]+/site-packages/[^/]+\\.(dist-info|egg-info|egg-link)$ +%__pythondist_path ^%{?!flatpak:/usr}%{?flatpak:/app}/lib(64)?/python[3-9]\\.[[:digit:]]+/site-packages/[^/]+\\.(dist-info|egg-info|egg-link)$ From e348b87fd9899d9f5938b8f2b1b0223ecb47f778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Fri, 5 May 2023 13:31:19 +0200 Subject: [PATCH 24/37] License: Clarify pythonbundles.py license MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit See https://gitlab.com/fedora/legal/fedora-license-data/-/issues/214 The script was only ever contributed to by me and Tomas Orsava. $ git log --format='%aN <%aE>' pythonbundles.py | sort -u Miro Hrončok Tomas Orsava This license clarification is: Signed-off-by: Miro Hrončok Signed-off-by: Tomas Orsava --- pythonbundles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pythonbundles.py b/pythonbundles.py index 8adc36f..b0e5ecf 100755 --- a/pythonbundles.py +++ b/pythonbundles.py @@ -4,7 +4,7 @@ # This program is free software. # # It is placed in the public domain or under the CC0-1.0-Universal license, -# whichever is more permissive. +# whichever you choose. # # Alternatively, it may be redistributed and/or modified under the terms of # the LGPL version 2.1 (or later) or GPL version 2 (or later). From 50768e7a3de34a2800aa3c24f9d8526316a0fab4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Fri, 5 May 2023 14:14:41 +0200 Subject: [PATCH 25/37] Declare the license via a complex SPDX expression rather than "effective license" --- python-rpm-generators.spec | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 8f0a75b..0324781 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,19 +1,28 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 4%{?dist} +Release: 5%{?dist} -# Originally all those files were part of RPM, so license is kept here -License: GPLv2+ Url: https://src.fedoraproject.org/python-rpm-generators -# Commit is the last change in following files + +# Originally the following files were part of RPM, so the license is inherited: GPL-2.0-or-later +# The COPYING file is grabbed from the last commit that changed the files Source0: https://raw.githubusercontent.com/rpm-software-management/rpm/102eab50b3d0d6546dfe082eac0ade21e6b3dbf1/COPYING Source1: python.attr Source2: pythondist.attr +# This was crafted in-place as a fork of python.attr, hence also GPL-2.0-or-later Source3: pythonname.attr +# This one is also originally from RPM, but it has its own license declaration: LGPL-2.1-or-later Source4: pythondistdeps.py +# This was crafted in-place with the following license declaration: +# LicenseRef-Fedora-Public-Domain OR CC0-1.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +# Note that CC0-1.0 is not allowed for code in Fedora, so we skip it in the package License tag Source5: pythonbundles.py +# See individual licenses above Source declarations +# Originally, this was simplified to GPL-2.0-or-later, but "effective license" analysis is no longer allowed +License: GPL-2.0-or-later AND LGPL-2.1-or-later AND (LicenseRef-Fedora-Public-Domain OR LGPL-2.1-or-later OR GPL-2.0-or-later) + BuildArch: noarch %description @@ -47,6 +56,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri May 05 2023 Miro Hrončok - 14-5 +- Declare the license via a complex SPDX expression rather than "effective license" + * Mon Apr 17 2023 Kalev Lember - 14-4 - Generate provides for /app-installed flatpak builds From f9b21eca49ad6b273790ec145097b46cc2d06d92 Mon Sep 17 00:00:00 2001 From: Todd Zullinger Date: Wed, 24 May 2023 12:58:14 -0400 Subject: [PATCH 26/37] Fix URL tag The Pagure instance at src.fedoraproject.org requires namespaces. This project is in the rpms namespace. Update the URL tag accordingly. --- python-rpm-generators.spec | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 0324781..9410a67 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,9 +1,9 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 5%{?dist} +Release: 6%{?dist} -Url: https://src.fedoraproject.org/python-rpm-generators +Url: https://src.fedoraproject.org/rpms/python-rpm-generators # Originally the following files were part of RPM, so the license is inherited: GPL-2.0-or-later # The COPYING file is grabbed from the last commit that changed the files @@ -56,6 +56,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Wed May 24 2023 Todd Zullinger - 14-6 +- Fix URL tag + * Fri May 05 2023 Miro Hrončok - 14-5 - Declare the license via a complex SPDX expression rather than "effective license" From 8fe27ad070c104baac7e523fe241001892c24b46 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 21 Jul 2023 13:45:10 +0000 Subject: [PATCH 27/37] Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild Signed-off-by: Fedora Release Engineering --- python-rpm-generators.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 9410a67..2e46270 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 6%{?dist} +Release: 7%{?dist} Url: https://src.fedoraproject.org/rpms/python-rpm-generators @@ -56,6 +56,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri Jul 21 2023 Fedora Release Engineering - 14-7 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild + * Wed May 24 2023 Todd Zullinger - 14-6 - Fix URL tag From 52372a464c70ebb29a285410327520c44e707135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Tue, 3 Oct 2023 12:07:49 +0200 Subject: [PATCH 28/37] Avoid DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors The warning only happened on corrupted metadata. The warning originates in https://github.com/python/importlib_metadata/commit/880a6219a16911817214827020f272b4b03b54b4 --- python-rpm-generators.spec | 5 ++++- pythondistdeps.py | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 2e46270..8e76f05 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 7%{?dist} +Release: 8%{?dist} Url: https://src.fedoraproject.org/rpms/python-rpm-generators @@ -56,6 +56,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Tue Oct 03 2023 Miro Hrončok - 14-8 +- Avoid DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors + * Fri Jul 21 2023 Fedora Release Engineering - 14-7 - Rebuilt for https://fedoraproject.org/wiki/Fedora_39_Mass_Rebuild diff --git a/pythondistdeps.py b/pythondistdeps.py index ec80125..b43ed39 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -94,8 +94,8 @@ class Distribution(PathDistribution): # that it works also on previous Python/importlib_metadata versions. @property def name(self): - """Return the 'Name' metadata for the distribution package.""" - return self.metadata['Name'] + """Return the 'Name' metadata for the distribution package or None.""" + return self.metadata.get('Name') def _parse_py_version(self, path): # Try to parse the Python version from the path the metadata From 592400f58bd11940aaddac443847fcc560910f0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Fri, 6 Oct 2023 11:59:15 +0200 Subject: [PATCH 29/37] Remove a no longer needed workaround for RPM <= 4.16 warning This removes an ugly hack that was used to get rid of: warning: Macro %1 defined but not used within scope I've noticed the %_pythonname_obsoletes generator does not expand %1 on non-RHELs and yet the warning is not shown. When debugging the missing warning, I've noticed it is never shown at all. According to RPM upstream, the warning was an undesired artifact: https://github.com/rpm-software-management/rpm/discussions/2501 It was purposefully removed starting with RPM 4.17. --- pythonname.attr | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/pythonname.attr b/pythonname.attr index 07d8df5..205570a 100644 --- a/pythonname.attr +++ b/pythonname.attr @@ -1,9 +1,6 @@ %__pythonname_provides() %{lua: local python = require 'fedora.srpm.python' - -- this macro is called for each file in a package, the path being in %1 - -- but we don't need to know the path, so we would get for each file: Macro %1 defined but not used within scope - -- in here, we expand %name conditionally on %1 to suppress the warning - local name = rpm.expand('%{?1:%{name}}') + local name = rpm.expand('%{name}') local evr = rpm.expand('%{?epoch:%{epoch}:}%{version}-%{release}') local provides = python.python_altprovides_once(name, evr) -- provides is either an array/table or nil @@ -23,10 +20,7 @@ -- In Fedora this is not needed as we don't ship ecosystem packages -- for alternative Python interpreters. local python = require 'fedora.srpm.python' - -- this macro is called for each file in a package, the path being in %1 - -- but we don't need to know the path, so we would get for each file: Macro %1 defined but not used within scope - -- in here, we expand %name conditionally on %1 to suppress the warning - local name = rpm.expand('%{?1:%{name}}') + local name = rpm.expand('%{name}') local evr = rpm.expand('%{?epoch:%{epoch}:}%{version}-%{release}') local obsoletes = python.python_altobsoletes_once(name, evr) -- obsoletes is either an array/table or nil From f3d6832f4d970041fd2297d6f7eece18bbf7a374 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Mon, 22 Jan 2024 06:41:25 +0000 Subject: [PATCH 30/37] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- python-rpm-generators.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 8e76f05..bed427f 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 8%{?dist} +Release: 9%{?dist} Url: https://src.fedoraproject.org/rpms/python-rpm-generators @@ -56,6 +56,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Mon Jan 22 2024 Fedora Release Engineering - 14-9 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Tue Oct 03 2023 Miro Hrončok - 14-8 - Avoid DeprecationWarning: Implicit None on return values is deprecated and will raise KeyErrors From 223b71bb5e6d767ecfb3757c61ed09a38b756e8c Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 26 Jan 2024 10:19:05 +0000 Subject: [PATCH 31/37] Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild --- python-rpm-generators.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index bed427f..492cb8a 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 9%{?dist} +Release: 10%{?dist} Url: https://src.fedoraproject.org/rpms/python-rpm-generators @@ -56,6 +56,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri Jan 26 2024 Fedora Release Engineering - 14-10 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild + * Mon Jan 22 2024 Fedora Release Engineering - 14-9 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild From 02ef9fde40ad2db7d33bbfda9dc1aabc24b72de8 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 19 Jul 2024 15:32:13 +0000 Subject: [PATCH 32/37] Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild --- python-rpm-generators.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 492cb8a..d014a53 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 10%{?dist} +Release: 11%{?dist} Url: https://src.fedoraproject.org/rpms/python-rpm-generators @@ -56,6 +56,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri Jul 19 2024 Fedora Release Engineering - 14-11 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + * Fri Jan 26 2024 Fedora Release Engineering - 14-10 - Rebuilt for https://fedoraproject.org/wiki/Fedora_40_Mass_Rebuild From 91729cf8a0ad0d4b96865c61521b149169771765 Mon Sep 17 00:00:00 2001 From: Karolina Surma Date: Mon, 19 Aug 2024 14:24:39 +0200 Subject: [PATCH 33/37] CI: Look for the correct obsolete name in tests --- tests/pythonname.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/pythonname.sh b/tests/pythonname.sh index b21058c..f737a1f 100755 --- a/tests/pythonname.sh +++ b/tests/pythonname.sh @@ -43,7 +43,7 @@ test $(rpm -qp --obsoletes ${RPMDIR}/python${X_Y}-foo-0-0.noarch.rpm | wc -l) -e echo "Obsoletes for python3-foo" rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm # In ELN/RHEL the pythonX.Y-* Obsoletes is generated, but not in Fedora, so we check for it explicitly. -rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm | grep -q '^python'${X_Y}'-py_provides < 0-0$' && exit 1 || true +rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm | grep -q '^python'${X_Y}'-foo < 0-0$' && exit 1 || true test $(rpm -qp --obsoletes ${RPMDIR}/python3-foo-0-0.noarch.rpm | wc -l) -eq 0 echo "Obsoletes for python2-foo" From 03fc0de4acadafa264c319159953cd05a1fcee97 Mon Sep 17 00:00:00 2001 From: Karolina Surma Date: Wed, 6 Nov 2024 12:31:33 +0100 Subject: [PATCH 34/37] Add centpkg to use in CentOS Stream If tests are run in this repository, they exist. Other packages in Fedora require fedpkg-minimal to download the sources. We also want to run this test in CentOS Stream where fedpkg-minimal is not available, hence adding centpkg invocation. The change will have no effect in this repository, but is essential for the smooth tests run of other components. --- tests/download_data_and_run_pytest.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/download_data_and_run_pytest.sh b/tests/download_data_and_run_pytest.sh index 8dca398..79d54b5 100755 --- a/tests/download_data_and_run_pytest.sh +++ b/tests/download_data_and_run_pytest.sh @@ -4,10 +4,11 @@ # When the tests run in python-rpm-generators, # the structure on disk does not match the dist-git repository. # We apparently must use the standard-test-source role to grab the sources. -# OTOH in other packages, we must use fedpkg(-minimal). -# The --force flag is required in full-blown fedpkg (the source is unused in spec), -# and it is ignored in fedpkg-minimal (all sources are always downloaded). -test -f test-sources-*.tar.gz || fedpkg sources --force +# OTOH in other packages, we must use fedpkg(-minimal) or centpkg(-minimal), +# depending on the destination OS. +# The --force flag is required in full-blown fedpkg/centpkg (the source is unused in spec), +# and it is ignored in fedpkg/centpkg-minimal (all sources are always downloaded). +test -f test-sources-*.tar.gz || fedpkg sources --force || centpkg sources --force tar -xvf test-sources-*.tar.gz -C ./tests/data/scripts_pythondistdeps/ cd tests/ From db95d6e73506cf68fe981d1e01058a809026bdd8 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Sat, 18 Jan 2025 18:59:56 +0000 Subject: [PATCH 35/37] Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild --- python-rpm-generators.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index d014a53..36e283c 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 11%{?dist} +Release: 12%{?dist} Url: https://src.fedoraproject.org/rpms/python-rpm-generators @@ -56,6 +56,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Sat Jan 18 2025 Fedora Release Engineering - 14-12 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild + * Fri Jul 19 2024 Fedora Release Engineering - 14-11 - Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild From 0bb99dc9e9765a8c8b190f84976cd3b1ce8cbb6e Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 25 Jul 2025 10:14:53 +0000 Subject: [PATCH 36/37] Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild --- python-rpm-generators.spec | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 36e283c..599eb0c 100644 --- a/python-rpm-generators.spec +++ b/python-rpm-generators.spec @@ -1,7 +1,7 @@ Name: python-rpm-generators Summary: Dependency generators for Python RPMs Version: 14 -Release: 12%{?dist} +Release: 13%{?dist} Url: https://src.fedoraproject.org/rpms/python-rpm-generators @@ -56,6 +56,9 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Fri Jul 25 2025 Fedora Release Engineering - 14-13 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_43_Mass_Rebuild + * Sat Jan 18 2025 Fedora Release Engineering - 14-12 - Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild From b284634b222306626f32861772984c4d4cb21479 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luk=C3=A1=C5=A1=20Zachar?= Date: Mon, 28 Jul 2025 17:46:02 +0200 Subject: [PATCH 37/37] Drop STI and use tmt instead Resolves: rhbz#2383043 --- .fmf/version | 1 + plan.fmf | 45 +++++++++++++++++++++++++++++++++++++++++++++ tests/tests.yml | 48 ------------------------------------------------ 3 files changed, 46 insertions(+), 48 deletions(-) create mode 100644 .fmf/version create mode 100644 plan.fmf delete mode 100644 tests/tests.yml diff --git a/.fmf/version b/.fmf/version new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/.fmf/version @@ -0,0 +1 @@ +1 diff --git a/plan.fmf b/plan.fmf new file mode 100644 index 0000000..d2c549f --- /dev/null +++ b/plan.fmf @@ -0,0 +1,45 @@ +execute: + how: tmt + +discover: + - name: same_repo + how: shell + dist-git-source: true + dist-git-download-only: true + tests: + - name: pythonabi + path: /tests + test: ./pythonabi.sh + - name: pythonname + path: /tests + test: ./pythonname.sh + - name: pythondist + path: /tests + test: ./pythondist.sh + - name: console_script + path: /tests + test: ./console_script.sh + - name: pytest + test: cd $TMT_SOURCE_DIR && ./tests/download_data_and_run_pytest.sh + +prepare: + - name: Install dependencies + how: install + package: + - rpm-build + - rpmdevtools + - fedpkg-minimal + - python3-devel + - python3-pip + - python3-pytest + - python3-pyyaml + - python3-setuptools + - python3-wheel + - dnf + - name: Update packages + how: shell + script: dnf upgrade -y + - name: rpm_qa + order: 100 + how: shell + script: rpm -qa | sort | tee $TMT_PLAN_DATA/rpmqa.txt diff --git a/tests/tests.yml b/tests/tests.yml deleted file mode 100644 index 22b2cb7..0000000 --- a/tests/tests.yml +++ /dev/null @@ -1,48 +0,0 @@ ---- -- hosts: localhost - tags: - - classic - tasks: - - dnf: - name: "*" - state: latest - -- hosts: localhost - tags: - - classic - pre_tasks: - - import_role: - name: standard-test-source - vars: - fetch_only: True - roles: - - role: standard-test-basic - tests: - - rpm_qa: - dir: . - run: rpm -qa | sort - - pythonabi: - dir: . - run: ./pythonabi.sh - - pythonname: - dir: . - run: ./pythonname.sh - - pythondist: - dir: . - run: ./pythondist.sh - - console_script: - dir: . - run: ./console_script.sh - - pytest: - dir: . - run: ./download_data_and_run_pytest.sh - required_packages: - - rpm-build - - rpmdevtools - - fedpkg-minimal - - python3-devel - - python3-pip - - python3-pytest - - python3-pyyaml - - python3-setuptools - - python3-wheel