From a85789b140598225bccfb684e8b9c9bdb8591c83 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Mar 01 2022 10:57:19 +0000 Subject: import python-rpm-macros-3.9-52.el9 --- diff --git a/SOURCES/macros.python-srpm b/SOURCES/macros.python-srpm index b30a6c8..b5a7d54 100644 --- a/SOURCES/macros.python-srpm +++ b/SOURCES/macros.python-srpm @@ -163,6 +163,7 @@ %py_provides() %{lua: local python = require 'fedora.srpm.python' + local rhel = rpm.expand('%{?rhel}') local name = rpm.expand('%1') if name == '%1' then rpm.expand('%{error:%%py_provides requires at least 1 argument, the name to provide}') @@ -176,6 +177,21 @@ for i, provide in ipairs(provides) do print('Provides: ' .. provide .. '\\n') end + -- We only generate these Obsoletes on CentOS/RHEL to provide clean upgrade + -- path, e.g. python3-foo obsoletes python39-foo from previous RHEL. + -- In Fedora this is not needed as we don't ship ecosystem packages + -- for alternative Python interpreters. + if rhel ~= '' then + -- Create Obsoletes only if the name does not end in a parenthesis, + -- as Obsoletes can't include parentheses. + -- This most commonly happens when the name contains an isa. + if (string.sub(name, "-1") ~= ")") then + local obsoletes = python.python_altobsoletes(name, evr) + for i, obsolete in ipairs(obsoletes) do + print('Obsoletes: ' .. obsolete .. '\\n') + end + end + end } %python_extras_subpkg(n:i:f:F) %{expand:%{lua: diff --git a/SOURCES/python.lua b/SOURCES/python.lua index 8391fe7..5264e59 100644 --- a/SOURCES/python.lua +++ b/SOURCES/python.lua @@ -2,22 +2,34 @@ -- Determine alternate names provided from the given name. -- Used in pythonname provides generator, python_provide and py_provides. --- There are 2 rules: +-- If only_3_to_3_X is false/nil/unused there are 2 rules: -- python3-foo -> python-foo, python3.X-foo -- python3.X-foo -> python-foo, python3-foo +-- If only_3_to_3_X is true there is only 1 rule: +-- python3-foo -> python3X-foo -- There is no python-foo -> rule, python-foo packages are version agnostic. -- Returns a table/array with strings. Empty when no rule matched. -local function python_altnames(name) - local xy = rpm.expand('%{__default_python3_pkgversion}') +local function python_altnames(name, only_3_to_3_X) + local xy + if only_3_to_3_X then + -- Here we hardcode the xy prefix we want to obsolete to "39", because: + -- 1. Python 3.9 will remain the main Python version in RHEL 9 + -- 2. python39 in RHEL 8 is still using the dotless naming (as opposed to + -- python3.9) + xy = "39" + else + xy = rpm.expand('%{__default_python3_pkgversion}') + end local altnames = {} local replaced -- NB: dash needs to be escaped! if name:match('^python3%-') then - for i, prefix in ipairs({'python-', 'python' .. xy .. '-'}) do + local prefixes = only_3_to_3_X and {} or {'python-'} + for i, prefix in ipairs({'python' .. xy .. '-', table.unpack(prefixes)}) do replaced = name:gsub('^python3%-', prefix) table.insert(altnames, replaced) end - elseif name:match('^python' .. xy .. '%-') then + elseif name:match('^python' .. xy .. '%-') and not only_3_to_3_X then for i, prefix in ipairs({'python-', 'python3-'}) do replaced = name:gsub('^python' .. xy .. '%-', prefix) table.insert(altnames, replaced) @@ -27,42 +39,72 @@ local function python_altnames(name) end +local function __python_alttags(name, evr, tag_type) + -- for the "provides" tag_type we want also unversioned provides + local only_3_to_3_X = tag_type ~= "provides" + local operator = tag_type == "provides" and ' = ' or ' < ' + + -- global cache that tells what package NEVRs were already processed for the + -- given tag type + if __python_alttags_beenthere == nil then + __python_alttags_beenthere = {} + end + if __python_alttags_beenthere[tag_type] == nil then + __python_alttags_beenthere[tag_type] = {} + end + __python_alttags_beenthere[tag_type][name .. ' ' .. evr] = true + local alttags = {} + for i, altname in ipairs(python_altnames(name, only_3_to_3_X)) do + table.insert(alttags, altname .. operator .. evr) + end + return alttags +end + -- For any given name and epoch-version-release, return provides except self. -- Uses python_altnames under the hood -- Returns a table/array with strings. local function python_altprovides(name, evr) + return __python_alttags(name, evr, "provides") +end + +-- For any given name and epoch-version-release, return versioned obsoletes except self. +-- Uses python_altnames under the hood +-- Returns a table/array with strings. +local function python_altobsoletes(name, evr) + return __python_alttags(name, evr, "obsoletes") +end + + +local function __python_alttags_once(name, evr, tag_type) -- global cache that tells what provides were already processed - if __python_altnames_provides_beenthere == nil then - __python_altnames_provides_beenthere = {} - end - __python_altnames_provides_beenthere[name .. ' ' .. evr] = true - local altprovides = {} - for i, altname in ipairs(python_altnames(name)) do - table.insert(altprovides, altname .. ' = ' .. evr) + if __python_alttags_beenthere == nil + or __python_alttags_beenthere[tag_type] == nil + or __python_alttags_beenthere[tag_type][name .. ' ' .. evr] == nil then + return __python_alttags(name, evr, tag_type) + else + return nil end - return altprovides end - -- Like python_altprovides but only return something once. -- For each argument can only be used once, returns nil otherwise. -- Previous usage of python_altprovides counts as well. local function python_altprovides_once(name, evr) - -- global cache that tells what provides were already processed - if __python_altnames_provides_beenthere == nil then - __python_altnames_provides_beenthere = {} - end - if __python_altnames_provides_beenthere[name .. ' ' .. evr] == nil then - __python_altnames_provides_beenthere[name .. ' ' .. evr] = true - return python_altprovides(name, evr) - else - return nil - end + return __python_alttags_once(name, evr, "provides") +end + +-- Like python_altobsoletes but only return something once. +-- For each argument can only be used once, returns nil otherwise. +-- Previous usage of python_altobsoletes counts as well. +local function python_altobsoletes_once(name, evr) + return __python_alttags_once(name, evr, "obsoletes") end return { python_altnames = python_altnames, python_altprovides = python_altprovides, + python_altobsoletes = python_altobsoletes, python_altprovides_once = python_altprovides_once, + python_altobsoletes_once = python_altobsoletes_once, } diff --git a/SPECS/python-rpm-macros.spec b/SPECS/python-rpm-macros.spec index 138b69b..a10cece 100644 --- a/SPECS/python-rpm-macros.spec +++ b/SPECS/python-rpm-macros.spec @@ -1,6 +1,6 @@ Name: python-rpm-macros Version: 3.9 -Release: 48%{?dist} +Release: 52%{?dist} Summary: The common Python RPM macros URL: https://src.fedoraproject.org/rpms/python-rpm-macros/ @@ -30,6 +30,12 @@ BuildArch: noarch # For compileall2.py Requires: python-srpm-macros = %{version}-%{release} +# The packages are called python(3)-(s)rpm-macros +# We never want python3-rpm-macros to provide python-rpm-macros +# We opt out from all Python name-based automatic provides and obsoletes +%undefine __pythonname_provides +%undefine __pythonname_obsoletes + %description This package contains the unversioned Python RPM macros, that most implementations should rely on. @@ -60,6 +66,15 @@ Requires: python-srpm-macros = %{version}-%{release} # For %%py_setup and import_all_modules.py Requires: python-rpm-macros = %{version}-%{release} +# We obsolete the old python39-rpm-macros for a smoother upgrade from RHEL8. +# Since python39-rpm-macros are built from the python39 component in RHEL 8, +# they're fully versioned (currently `0:3.9.7`), with the patch version likely +# to increase in the future. RPM sorts this number as higher than `3.9`, which +# is the version we have in RHEL 9. Therefore we're obsoleting with an Epoch 1 +# so that all versions from RHEL 8 are obsoleted (but we keep the possibility +# of increasing the epoch in RHEL 8 to stop this). +Obsoletes: python39-rpm-macros < 1:%{version}-%{release} + %description -n python3-rpm-macros RPM macros for building Python 3 packages. @@ -101,6 +116,23 @@ install -m 644 import_all_modules.py %{buildroot}%{_rpmconfigdir}/redhat/ %changelog +* Tue Feb 08 2022 Tomas Orsava - 3.9-52 +- %%py_provides: Do not generate Obsoletes for names containing parentheses +- Related: rhbz#1990421 + +* Tue Feb 08 2022 Tomas Orsava - 3.9-51 +- Add Obsoletes tags with the python39- prefix for smoother upgrade from RHEL8 +- Related: rhbz#1990421 + +* Tue Feb 01 2022 Miro HronĨok - 3.9-50 +- Explicitly opt-out from Python name-based provides and obsoletes generators + +* Wed Jan 19 2022 Tomas Orsava - 3.9-49 +- Add lua helper functions to make it possible to automatically generate + Obsoletes tags +- Modify the %%py_provides macro to also generate Obsoletes tags on CentOS/RHEL +- Resolves: rhbz#1990421 + * Tue Dec 21 2021 Karolina Surma - 3.9-48 - Fix CI test configuration, so that pytest can import the package code