From 0a12aa5a2f1cb1a1003e5098108a6c5aa2040ce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Mon, 15 Mar 2021 18:59:40 +0100 Subject: [PATCH 01/44] Do not generate setuptools requirement for console_scripts on Python 3.10+ See https://fedoraproject.org/wiki/Changes/Reduce_dependencies_on_python3-setuptools --- python-rpm-generators.spec | 6 +++- pythondist.attr | 2 +- pythondistdeps.py | 35 +++++++++++++----- tests/console_script.sh | 17 +++++++++ .../scripts_pythondistdeps/test-data.yaml | 24 +++++++++---- .../scripts_pythondistdeps/test-requires.yaml | 2 +- tests/isort.spec | 36 +++++++++++++++++++ tests/tests.yml | 3 ++ 8 files changed, 107 insertions(+), 18 deletions(-) create mode 100755 tests/console_script.sh create mode 100644 tests/isort.spec diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 24994bf..16a48b8 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: 4%{?dist} +Release: 5%{?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 +* Wed Mar 31 2021 Miro Hrončok - 12-5 +- Do not generate setuptools requirement for console_scripts on Python 3.10+ +- See https://fedoraproject.org/wiki/Changes/Reduce_dependencies_on_python3-setuptools + * Thu Mar 11 2021 Tomas Orsava - 12-4 - scripts/pythondistdeps: Treat extras names case-insensitively and always output them in lower case (#1936875) diff --git a/pythondist.attr b/pythondist.attr index f849ba1..747cc32 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_requires %{_rpmconfigdir}/pythondistdeps.py --requires --normalized-names-format pep503 --package-name %{name} %{?!_python_no_extras_requires:--require-extras-subpackages} +%__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 f38f726..17f49f3 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -276,6 +276,12 @@ if __name__ == "__main__": help='Provide both `pep503` and `legacy-dots` format of normalized names (useful for a transition period)') parser.add_argument('-L', '--legacy-provides', action='store_true', help='Print extra legacy pythonegg Provides') parser.add_argument('-l', '--legacy', action='store_true', help='Print legacy pythonegg Provides/Requires instead') + parser.add_argument('--console-scripts-nodep-setuptools-since', action='store', + help='An optional Python version (X.Y), at least 3.8. ' + 'For that version and any newer version, ' + 'a dependency on "setuptools" WILL NOT be generated for packages with console_scripts/gui_scripts entry points. ' + 'By setting this flag, you guarantee that setuptools >= 47.2.0 is used ' + 'during the build of packages for this and any newer Python version.') 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.") @@ -305,6 +311,15 @@ if __name__ == "__main__": # At least one type of normalization must be provided assert normalized_names_provide_pep503 or normalized_names_provide_legacy + if args.console_scripts_nodep_setuptools_since: + nodep_setuptools_pyversion = parse(args.console_scripts_nodep_setuptools_since) + if nodep_setuptools_pyversion < parse("3.8"): + print("Only version 3.8+ is supported in --console-scripts-nodep-setuptools-since", file=stderr) + print("*** PYTHON_EXTRAS_ARGUMENT_ERROR___SEE_STDERR ***") + exit(65) # os.EX_DATAERR + else: + nodep_setuptools_pyversion = None + # Is this script being run for an extras subpackage? extras_subpackage = None if args.package_name and '+' in args.package_name: @@ -438,15 +453,17 @@ if __name__ == "__main__": else: deps = dist.requirements - # console_scripts/gui_scripts entry points need pkg_resources from setuptools - if (dist.entry_points and - (lower.endswith('.egg') or - lower.endswith('.egg-info'))): - groups = {ep.group for ep in dist.entry_points} - if {"console_scripts", "gui_scripts"} & groups: - # stick them first so any more specific requirement - # overrides it - deps.insert(0, Requirement('setuptools')) + # console_scripts/gui_scripts entry points needed pkg_resources from setuptools + # on new Python/setuptools versions, this is no longer required + if nodep_setuptools_pyversion is None or parse(dist.py_version) < nodep_setuptools_pyversion: + if (dist.entry_points and + (lower.endswith('.egg') or + lower.endswith('.egg-info'))): + groups = {ep.group for ep in dist.entry_points} + if {"console_scripts", "gui_scripts"} & groups: + # stick them first so any more specific requirement + # overrides it + deps.insert(0, Requirement('setuptools')) # add requires/recommends based on egg/dist metadata for dep in deps: # Even if we're requiring `foo[bar]`, also require `foo` diff --git a/tests/console_script.sh b/tests/console_script.sh new file mode 100755 index 0000000..892fd4b --- /dev/null +++ b/tests/console_script.sh @@ -0,0 +1,17 @@ +#!/usr/bin/bash -eux +RPMDIR=$(rpm --eval '%_topdir')/RPMS/noarch +RPMPKG="${RPMDIR}/isort-5.7.0-0.noarch.rpm" + +mkdir -p $(rpm --eval '%_topdir')/SOURCES/ + +spectool -g -R isort.spec + +for py_version in 3.6 3.7 3.8 3.9; do + rpmbuild -ba --define "python3_test_version ${py_version}" isort.spec + rpm -qp --requires ${RPMPKG} | grep "python${py_version}dist(setuptools)" +done + +for py_version in 3.10 3.11; do + rpmbuild -ba --define "python3_test_version ${py_version}" isort.spec + rpm -qp --requires ${RPMPKG} | grep "python${py_version}dist(setuptools)" && exit 1 || true +done diff --git a/tests/data/scripts_pythondistdeps/test-data.yaml b/tests/data/scripts_pythondistdeps/test-data.yaml index 35c72a8..0a81eaa 100644 --- a/tests/data/scripts_pythondistdeps/test-data.yaml +++ b/tests/data/scripts_pythondistdeps/test-data.yaml @@ -762,7 +762,16 @@ python3.9dist(simplejson) = 3.16 python3dist(simplejson) = 3.16 requires: python(abi) = 3.9 ---requires --normalized-names-format legacy-dots: +--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: + stderr: + provides: Only version 3.8+ is supported in --console-scripts-nodep-setuptools-since + requires: Only version 3.8+ is supported in --console-scripts-nodep-setuptools-since + stdout: + provides: '*** PYTHON_EXTRAS_ARGUMENT_ERROR___SEE_STDERR ***' + requires: '*** PYTHON_EXTRAS_ARGUMENT_ERROR___SEE_STDERR ***' +--requires --normalized-names-format legacy-dots --console-scripts-nodep-setuptools-since 3.10: --provides --majorver-provides --normalized-names-format legacy-dots: usr/lib/python2.7/site-packages/zope.component-4.3.0-py2.7.egg-info: provides: |- @@ -800,16 +809,19 @@ provides: |- python3.10dist(setuptools) = 41.6 python3dist(setuptools) = 41.6 - requires: |- - python(abi) = 3.10 - python3.10dist(setuptools) + requires: python(abi) = 3.10 usr/lib/python3.11/site-packages/pip-20.0.2-py3.11.egg-info: provides: |- python3.11dist(pip) = 20.0.2 python3dist(pip) = 20.0.2 + requires: python(abi) = 3.11 + usr/lib/python3.8/site-packages/pip-20.0.2-py3.8.egg-info: + provides: |- + python3.8dist(pip) = 20.0.2 + python3dist(pip) = 20.0.2 requires: |- - python(abi) = 3.11 - python3.11dist(setuptools) + python(abi) = 3.8 + python3.8dist(setuptools) usr/lib/python3.9/site-packages/zope.component-4.3.0-py3.9.egg-info: provides: |- python3.9dist(zope.component) = 4.3 diff --git a/tests/data/scripts_pythondistdeps/test-requires.yaml b/tests/data/scripts_pythondistdeps/test-requires.yaml index 32d70f2..d876674 100644 --- a/tests/data/scripts_pythondistdeps/test-requires.yaml +++ b/tests/data/scripts_pythondistdeps/test-requires.yaml @@ -8,7 +8,7 @@ pip: '19.1.1': ['2.7', '3.7'] '20.0.2': ['3.9'] sdist: - '20.0.2': ['3.11'] + '20.0.2': ['3.8', '3.11'] packaging: wheel: '19.0': ['2.7', '3.7'] diff --git a/tests/isort.spec b/tests/isort.spec new file mode 100644 index 0000000..74514d4 --- /dev/null +++ b/tests/isort.spec @@ -0,0 +1,36 @@ +Name: isort +Version: 5.7.0 +Release: 0 +Summary: A Python package with a console_scripts entrypoint +License: MIT +Source0: %{pypi_source} +BuildArch: noarch +BuildRequires: python3-devel +BuildRequires: python3-setuptools + +# Turn off Python bytecode compilation because the build would fail without Python %%{python3_test_version} +%define __brp_python_bytecompile %{nil} + +%description +... + +%prep +%autosetup + +%build +%py3_build + +%install +%py3_install + +# A fake installation by a different Python version: +%if "%{python3_version}" != "%{python3_test_version}" +mv %{buildroot}%{_prefix}/lib/python%{python3_version} \ + %{buildroot}%{_prefix}/lib/python%{python3_test_version} +mv %{buildroot}%{_prefix}/lib/python%{python3_test_version}/site-packages/%{name}-%{version}-py%{python3_version}.egg-info \ + %{buildroot}%{_prefix}/lib/python%{python3_test_version}/site-packages/%{name}-%{version}-py%{python3_test_version}.egg-info +%endif + +%files +%{_bindir}/%{name}* +%{_prefix}/lib/python%{python3_test_version}/site-packages/%{name}* diff --git a/tests/tests.yml b/tests/tests.yml index a79a5f1..668ff36 100644 --- a/tests/tests.yml +++ b/tests/tests.yml @@ -27,6 +27,9 @@ - pythondist: dir: . run: ./pythondist.sh + - console_script: + dir: . + run: ./console_script.sh - prepare-test-data: dir: . run: tar -xvf test-sources-*.tar.gz -C ./tests/data/scripts_pythondistdeps/ From 20f8b2c7756e8086bda06227e9dcc8e2c755077b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Mon, 19 Apr 2021 22:56:25 +0200 Subject: [PATCH 02/44] Fix python(abi) generator (the one written in Python) There were three problems: - sys.version was not imported - sys.version[:3] is not reliable on Python 3.10+ - distutils is deprecated on Python 3.10+ We were not hit by the missing import in Fedora because we only run the script on .dist-info/.egg-info/.egg and not on .py files, so this if-branch never runs. But when the script was fed with a .py path, it errored: Traceback (most recent call last): File "/usr/lib/rpm/pythondistdeps.py", line 344, in purelib = get_python_lib(standard_lib=0, plat_specific=0).split(version[:3])[0] NameError: name 'version' is not defined The sys.version[:3] thing kinda works for Python 3.10+ because *in this particular case* splitting on '3.1' and taking the prefix yields the same results as splitting on '3.10', but I consider that mere coincidence. Finally, since the distutils import happened at module-level, we got the Deprecation warning in all Fedora's Python packages: /usr/lib/rpm/pythondistdeps.py:16: DeprecationWarning: The distutils package is deprecated and slated for removal in Python 3.12 Backported from https://github.com/rpm-software-management/python-rpm-packaging/commit/d12e039037 --- python-rpm-generators.spec | 7 ++++++- pythondistdeps.py | 9 +++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 16a48b8..072883b 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: 5%{?dist} +Release: 6%{?dist} # Originally all those files were part of RPM, so license is kept here License: GPLv2+ @@ -47,6 +47,11 @@ install -Dpm0755 -t %{buildroot}%{_rpmconfigdir} *.py %{_rpmconfigdir}/pythonbundles.py %changelog +* Mon Apr 19 2021 Miro Hrončok - 12-6 +- Get rid of distutils deprecation warning (by not using it) +- The distutils module is deprecated in Python 3.10+ +- https://www.python.org/dev/peps/pep-0632/ + * Wed Mar 31 2021 Miro Hrončok - 12-5 - Do not generate setuptools requirement for console_scripts on Python 3.10+ - See https://fedoraproject.org/wiki/Changes/Reduce_dependencies_on_python3-setuptools diff --git a/pythondistdeps.py b/pythondistdeps.py index 17f49f3..8be1a4d 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -13,10 +13,10 @@ from __future__ import print_function import argparse -from distutils.sysconfig import get_python_lib from os.path import dirname, sep import re -from sys import argv, stdin, stderr +from sys import argv, stdin, stderr, version_info +from sysconfig import get_path from warnings import warn from packaging.requirements import Requirement as Requirement_ @@ -341,8 +341,9 @@ if __name__ == "__main__": if py_abi and (lower.endswith('.py') or lower.endswith('.pyc') or lower.endswith('.pyo')): if name not in py_deps: py_deps[name] = [] - purelib = get_python_lib(standard_lib=0, plat_specific=0).split(version[:3])[0] - platlib = get_python_lib(standard_lib=0, plat_specific=1).split(version[:3])[0] + running_python_version = '{}.{}'.format(*version_info[:2]) + purelib = get_path('purelib').split(running_python_version)[0] + platlib = get_path('platlib').split(running_python_version)[0] for lib in (purelib, platlib): if lib in f: spec = ('==', f.split(lib)[1].split(sep)[0]) From 27d363833e8df0188df0cd6b9eb2bd79e61a2238 Mon Sep 17 00:00:00 2001 From: Tomas Orsava Date: Tue, 25 May 2021 12:46:21 +0200 Subject: [PATCH 03/44] pythondistdeps.py: Detect and error when metadata is corrupted --- pythondistdeps.py | 8 ++++++++ .../corrupted.dist-info/corrupted | 1 + tests/data/scripts_pythondistdeps/test-data.yaml | 9 +++++++++ tests/test_scripts_pythondistdeps.py | 16 +++++++++++++++- 4 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 tests/data/scripts_pythondistdeps/corrupted.dist-info/corrupted diff --git a/pythondistdeps.py b/pythondistdeps.py index 8be1a4d..25ca6cb 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -73,6 +73,14 @@ class Requirement(Requirement_): class Distribution(PathDistribution): def __init__(self, path): super(Distribution, self).__init__(Path(path)) + + # Check that the initialization went well and metadata are not missing or corrupted + # name is the most important attribute, if it doesn't exist, import failed + if not self.name or not isinstance(self.name, str): + print("*** PYTHON_METADATA_FAILED_TO_PARSE_ERROR___SEE_STDERR ***") + print('Error: Python metadata at `{}` are missing or corrupted.'.format(path), file=stderr) + exit(65) # os.EX_DATAERR + self.normalized_name = normalize_name(self.name) self.legacy_normalized_name = legacy_normalize_name(self.name) self.requirements = [Requirement(r) for r in self.requires or []] diff --git a/tests/data/scripts_pythondistdeps/corrupted.dist-info/corrupted b/tests/data/scripts_pythondistdeps/corrupted.dist-info/corrupted new file mode 100644 index 0000000..b04b2ba --- /dev/null +++ b/tests/data/scripts_pythondistdeps/corrupted.dist-info/corrupted @@ -0,0 +1 @@ +Corrupted dist-info metadata diff --git a/tests/data/scripts_pythondistdeps/test-data.yaml b/tests/data/scripts_pythondistdeps/test-data.yaml index 0a81eaa..afd928e 100644 --- a/tests/data/scripts_pythondistdeps/test-data.yaml +++ b/tests/data/scripts_pythondistdeps/test-data.yaml @@ -1207,6 +1207,15 @@ python3.9dist(zope-testing) --requires --normalized-names-format pep503 --require-extras-subpackages: --provides --normalized-names-format pep503: + corrupted.dist-info: + stderr: + provides: |- + Error: Python metadata at `*/corrupted.dist-info` are missing or corrupted. + requires: |- + Error: Python metadata at `*/corrupted.dist-info` are missing or corrupted. + 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 requires: |- diff --git a/tests/test_scripts_pythondistdeps.py b/tests/test_scripts_pythondistdeps.py index 3636f1c..79f0c6f 100644 --- a/tests/test_scripts_pythondistdeps.py +++ b/tests/test_scripts_pythondistdeps.py @@ -29,6 +29,7 @@ from pathlib import Path +from fnmatch import fnmatch import pytest import shlex import shutil @@ -224,8 +225,21 @@ def fixture_check_and_install_test_data(): def test_pythondistdeps(provides_params, requires_params, dist_egg_info_path, expected): """Runs pythondistdeps with the given parameters and dist-info/egg-info path, compares the results with the expected results""" + expect_failure = "stderr" in expected - assert expected == run_pythondistdeps(provides_params, requires_params, dist_egg_info_path, expect_failure) + tested = run_pythondistdeps(provides_params, requires_params, dist_egg_info_path, expect_failure) + + if expect_failure: + for k1, k2 in ((k1, k2) for k1 in expected.keys() for k2 in expected[k1].keys()): + if k1 == "stderr": + # Some stderr messages contain full file paths. To get around + # this, asterisk is used in the test-data and we compare with + # fnmatch that understands Unix-style wildcards. + assert fnmatch(tested[k1][k2], expected[k1][k2]) + else: + assert expected[k1][k2] == tested[k1][k2] + else: + assert expected == tested if __name__ == "__main__": From cc489bde7a3a06354aa4e5c1dad3e3f9dbdb6564 Mon Sep 17 00:00:00 2001 From: Tomas Orsava Date: Tue, 25 May 2021 17:56:00 +0200 Subject: [PATCH 04/44] pythondistdeps.py: Catch all exceptions and terminate build if one is raised --- python-rpm-generators.spec | 6 +++++- pythondistdeps.py | 17 ++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/python-rpm-generators.spec b/python-rpm-generators.spec index 072883b..6011515 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: 6%{?dist} +Release: 7%{?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 +* Tue May 25 2021 Tomas Orsava - 12-7 +- pythondistdeps.py: Detect missing or corrupted metadata +- pythondistdeps.py: Catch all exceptions and terminate the build if one is raised + * Mon Apr 19 2021 Miro Hrončok - 12-6 - Get rid of distutils deprecation warning (by not using it) - The distutils module is deprecated in Python 3.10+ diff --git a/pythondistdeps.py b/pythondistdeps.py index 25ca6cb..e8b5afd 100755 --- a/pythondistdeps.py +++ b/pythondistdeps.py @@ -260,10 +260,10 @@ def get_marker_env(dist, extra): "extra": extra} -if __name__ == "__main__": +def main(): """To allow this script to be importable (and its classes/functions - reused), actions are performed only when run as a main script.""" - + reused), actions are defined in the main function and are performed only + when run as a main script.""" parser = argparse.ArgumentParser(prog=argv[0]) group = parser.add_mutually_exclusive_group(required=True) group.add_argument('-P', '--provides', action='store_true', help='Print Provides') @@ -552,3 +552,14 @@ if __name__ == "__main__": else: # Print out unversioned provides, requires, recommends, conflicts print(name) + + +if __name__ == "__main__": + """To allow this script to be importable (and its classes/functions + reused), actions are performed only when run as a main script.""" + try: + main() + except Exception as exc: + print("*** PYTHONDISTDEPS_GENERATORS_FAILED ***", flush=True) + raise RuntimeError("Error: pythondistdeps.py generator encountered an unhandled exception and was terminated.") from exc + From 04ae9b96f2acb7c7c5adbaf4aca7a27745c45d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Fri, 18 Jun 2021 18:49:37 +0200 Subject: [PATCH 05/44] CI: Adapt pythondist.spec for Python 3.10 being the main Python version Preserves comaptbility with Python 3.9. --- tests/pythondist.sh | 11 +++++++++++ tests/pythondist.spec | 25 +++++++++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/tests/pythondist.sh b/tests/pythondist.sh index 556f5e8..4f2e15d 100755 --- a/tests/pythondist.sh +++ b/tests/pythondist.sh @@ -25,7 +25,17 @@ rpm -qp --provides ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep rpm -qp --requires ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope-event)' rpm -qp --requires ${RPMDIR}/python3.7-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.7dist(zope-interface)' +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)' +rpm -qp --requires ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope-event)' +rpm -qp --requires ${RPMDIR}/python3.9-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.9dist(zope-interface)' +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)' @@ -33,3 +43,4 @@ rpm -qp --provides ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep rpm -qp --requires ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope-event)' rpm -qp --requires ${RPMDIR}/python3.10-zope-component-4.3.0-0.noarch.rpm | grep '^python3\.10dist(zope-interface)' +fi diff --git a/tests/pythondist.spec b/tests/pythondist.spec index 672e04a..960c716 100644 --- a/tests/pythondist.spec +++ b/tests/pythondist.spec @@ -24,10 +24,19 @@ Summary: ... %description -n python3.7-zope-component ... +%if v"%{python3_version}" != v"3.9" +%package -n python3.9-zope-component +Summary: ... +%description -n python3.9-zope-component +... +%endif + +%if v"%{python3_version}" != v"3.10" %package -n python3.10-zope-component Summary: ... %description -n python3.10-zope-component ... +%endif %prep %autosetup -n zope.component-%{version} @@ -42,9 +51,17 @@ mkdir -p %{buildroot}/usr/lib/python3.7/site-packages cp -a %{buildroot}%{python3_sitelib}/zope.component-%{version}-py%{python3_version}.egg-info \ %{buildroot}/usr/lib/python3.7/site-packages/zope.component-%{version}-py3.7.egg-info +%if v"%{python3_version}" != v"3.9" +mkdir -p %{buildroot}/usr/lib/python3.9/site-packages +cp -a %{buildroot}%{python3_sitelib}/zope.component-%{version}-py%{python3_version}.egg-info \ + %{buildroot}/usr/lib/python3.9/site-packages/zope.component-%{version}-py3.9.egg-info +%endif + +%if v"%{python3_version}" != v"3.10" mkdir -p %{buildroot}/usr/lib/python3.10/site-packages cp -a %{buildroot}%{python3_sitelib}/zope.component-%{version}-py%{python3_version}.egg-info \ %{buildroot}/usr/lib/python3.10/site-packages/zope.component-%{version}-py3.10.egg-info +%endif %files -n python3-zope-component %license LICENSE.txt @@ -54,6 +71,14 @@ cp -a %{buildroot}%{python3_sitelib}/zope.component-%{version}-py%{python3_versi %license LICENSE.txt /usr/lib/python3.7/site-packages/zope.component-%{version}-py3.7.egg-info/ +%if v"%{python3_version}" != v"3.9" +%files -n python3.9-zope-component +%license LICENSE.txt +/usr/lib/python3.9/site-packages/zope.component-%{version}-py3.9.egg-info/ +%endif + +%if v"%{python3_version}" != v"3.10" %files -n python3.10-zope-component %license LICENSE.txt /usr/lib/python3.10/site-packages/zope.component-%{version}-py3.10.egg-info/ +%endif From 9bd2a43a74fda68e75b85b26b6e71e51226c752f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= Date: Mon, 21 Jun 2021 11:35:48 +0200 Subject: [PATCH 06/44] Support multiple vendor files in pythonbundles.py Not bumping the release, will happily wait until it bubbles trough. --- pythonbundles.py | 41 ++++++++++--------- .../pkg_resources_setuptools.out | 5 +++ .../data/scripts_pythonbundles/setuptools.in | 3 ++ .../data/scripts_pythonbundles/setuptools.out | 3 ++ tests/test_scripts_pythonbundles.py | 22 +++++++++- 5 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 tests/data/scripts_pythonbundles/pkg_resources_setuptools.out create mode 100644 tests/data/scripts_pythonbundles/setuptools.in create mode 100644 tests/data/scripts_pythonbundles/setuptools.out diff --git a/pythonbundles.py b/pythonbundles.py index 96e817e..6242e20 100755 --- a/pythonbundles.py +++ b/pythonbundles.py @@ -22,26 +22,27 @@ import pythondistdeps pythondistdeps.parse_version = parse_version -def generate_bundled_provides(path, namespace): +def generate_bundled_provides(paths, namespace): provides = set() - for line in path.read_text().splitlines(): - line, _, comment = line.partition('#') - if comment.startswith('egg='): - # not a real comment - # e.g. git+https://github.com/monty/spam.git@master#egg=spam&... - egg, *_ = comment.strip().partition(' ') - egg, *_ = egg.strip().partition('&') - name = pythondistdeps.normalize_name(egg[4:]) - provides.add(f'Provides: bundled({namespace}({name}))') - continue - line = line.strip() - if line: - name, _, version = line.partition('==') - name = pythondistdeps.normalize_name(name) - bundled_name = f"bundled({namespace}({name}))" - python_provide = pythondistdeps.convert(bundled_name, '==', version) - provides.add(f'Provides: {python_provide}') + for path in paths: + for line in path.read_text().splitlines(): + line, _, comment = line.partition('#') + if comment.startswith('egg='): + # not a real comment + # e.g. git+https://github.com/monty/spam.git@master#egg=spam&... + egg, *_ = comment.strip().partition(' ') + egg, *_ = egg.strip().partition('&') + name = pythondistdeps.normalize_name(egg[4:]) + provides.add(f'Provides: bundled({namespace}({name}))') + continue + line = line.strip() + if line: + name, _, version = line.partition('==') + name = pythondistdeps.normalize_name(name) + bundled_name = f"bundled({namespace}({name}))" + python_provide = pythondistdeps.convert(bundled_name, '==', version) + provides.add(f'Provides: {python_provide}') return provides @@ -70,7 +71,7 @@ if __name__ == '__main__': parser = argparse.ArgumentParser(prog=sys.argv[0], formatter_class=argparse.ArgumentDefaultsHelpFormatter) - parser.add_argument('vendored', metavar='VENDORED.TXT', + parser.add_argument('vendored', metavar='VENDORED.TXT', nargs='+', type=pathlib.Path, help='Upstream information about vendored libraries') parser.add_argument('-c', '--compare-with', action='store', help='A string value to compare with and verify') @@ -78,7 +79,7 @@ if __name__ == '__main__': help='What namespace of provides will used', default='python3dist') args = parser.parse_args() - provides = generate_bundled_provides(pathlib.Path(args.vendored), args.namespace) + provides = generate_bundled_provides(args.vendored, args.namespace) if args.compare_with: given = args.compare_with.splitlines() diff --git a/tests/data/scripts_pythonbundles/pkg_resources_setuptools.out b/tests/data/scripts_pythonbundles/pkg_resources_setuptools.out new file mode 100644 index 0000000..cc2d710 --- /dev/null +++ b/tests/data/scripts_pythonbundles/pkg_resources_setuptools.out @@ -0,0 +1,5 @@ +Provides: bundled(python3dist(appdirs)) = 1.4.3 +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 diff --git a/tests/data/scripts_pythonbundles/setuptools.in b/tests/data/scripts_pythonbundles/setuptools.in new file mode 100644 index 0000000..d7d2beb --- /dev/null +++ b/tests/data/scripts_pythonbundles/setuptools.in @@ -0,0 +1,3 @@ +packaging==16.8 +pyparsing==2.2.1 +ordered-set==3.1.1 diff --git a/tests/data/scripts_pythonbundles/setuptools.out b/tests/data/scripts_pythonbundles/setuptools.out new file mode 100644 index 0000000..0acb887 --- /dev/null +++ b/tests/data/scripts_pythonbundles/setuptools.out @@ -0,0 +1,3 @@ +Provides: bundled(python3dist(ordered-set)) = 3.1.1 +Provides: bundled(python3dist(packaging)) = 16.8 +Provides: bundled(python3dist(pyparsing)) = 2.2.1 diff --git a/tests/test_scripts_pythonbundles.py b/tests/test_scripts_pythonbundles.py index c04230e..2926713 100644 --- a/tests/test_scripts_pythonbundles.py +++ b/tests/test_scripts_pythonbundles.py @@ -34,7 +34,7 @@ def run_pythonbundles(*args, success=True): return cp -projects = pytest.mark.parametrize('project', ('pkg_resources', 'pip', 'pipenv')) +projects = pytest.mark.parametrize('project', ('pkg_resources', 'pip', 'pipenv', 'setuptools')) @projects @@ -97,3 +97,23 @@ def test_compare_with_unexpected(project): cp = run_pythonbundles(TEST_DATA / f'{project}.in', '--compare-with', longer, success=False) assert cp.stdout == '', cp.stdout assert cp.stderr == f'Redundant unexpected provides:\n + {unexpected}\n', cp.stderr + + +combo_order = pytest.mark.parametrize('projects', ['pkg_resources-setuptools', 'setuptools-pkg_resources']) + + +@combo_order +def test_multiple_vendor_files_output(projects): + cp = run_pythonbundles(*(TEST_DATA / f'{p}.in' for p in projects.split('-'))) + expected = (TEST_DATA / 'pkg_resources_setuptools.out').read_text() + assert cp.stdout == expected, cp.stdout + assert cp.stderr == '', cp.stderr + + +@combo_order +def test_multiple_vendor_files_compare_with(projects): + expected = (TEST_DATA / 'pkg_resources_setuptools.out').read_text() + cp = run_pythonbundles(*(TEST_DATA / f'{p}.in' for p in projects.split('-')), + '--compare-with', expected) + assert cp.stdout == '', cp.stdout + assert cp.stderr == '', cp.stderr From 98fa009fc8f530b097d79e47bf1605774a6e9139 Mon Sep 17 00:00:00 2001 From: Fedora Release Engineering Date: Fri, 23 Jul 2021 09:18:27 +0000 Subject: [PATCH 07/44] - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_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 6011515..3a264b0 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: 7%{?dist} +Release: 8%{?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 23 2021 Fedora Release Engineering - 12-8 +- Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild + * Tue May 25 2021 Tomas Orsava - 12-7 - pythondistdeps.py: Detect missing or corrupted metadata - pythondistdeps.py: Catch all exceptions and terminate the build if one is raised From 27f9733f0b8d07a584eb59b75387d3ff1407bd93 Mon Sep 17 00:00:00 2001 From: Gordon Messmer Date: Fri, 22 Oct 2021 16:41:44 -0700 Subject: [PATCH 08/44] 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 09/44] 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 10/44] 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 11/44] - 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 12/44] 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 13/44] 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 14/44] 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 15/44] 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 16/44] 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 17/44] 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 18/44] 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 19/44] 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 20/44] 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 21/44] 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 22/44] 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 23/44] 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 24/44] 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 25/44] 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 26/44] 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 27/44] 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 28/44] 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 29/44] 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 30/44] 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 31/44] 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 32/44] 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 33/44] 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 34/44] 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 35/44] 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 36/44] 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 37/44] 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 38/44] 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 39/44] 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 40/44] 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 41/44] 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 42/44] 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 43/44] 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 44/44] 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