Compare commits
No commits in common. "c9-beta" and "c8-beta" have entirely different histories.
47
SOURCES/00378-support-expat-2-4-5.patch
Normal file
47
SOURCES/00378-support-expat-2-4-5.patch
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
From db083095e3bdb93e4f8170d814664c482b1e94da Mon Sep 17 00:00:00 2001
|
||||||
|
From: rpm-build <rpm-build>
|
||||||
|
Date: Tue, 14 Jun 2022 06:38:43 +0200
|
||||||
|
Subject: [PATCH] Fix test suite for Expat >= 2.4.5
|
||||||
|
|
||||||
|
---
|
||||||
|
Lib/test/test_minidom.py | 17 +++++------------
|
||||||
|
1 file changed, 5 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Lib/test/test_minidom.py b/Lib/test/test_minidom.py
|
||||||
|
index 9762025..5f52ed1 100644
|
||||||
|
--- a/Lib/test/test_minidom.py
|
||||||
|
+++ b/Lib/test/test_minidom.py
|
||||||
|
@@ -1149,14 +1149,10 @@ class MinidomTest(unittest.TestCase):
|
||||||
|
|
||||||
|
# Verify that character decoding errors raise exceptions instead
|
||||||
|
# of crashing
|
||||||
|
- if pyexpat.version_info >= (2, 4, 5):
|
||||||
|
- self.assertRaises(ExpatError, parseString,
|
||||||
|
- b'<fran\xe7ais></fran\xe7ais>')
|
||||||
|
- self.assertRaises(ExpatError, parseString,
|
||||||
|
- b'<franais>Comment \xe7a va ? Tr\xe8s bien ?</franais>')
|
||||||
|
- else:
|
||||||
|
- self.assertRaises(UnicodeDecodeError, parseString,
|
||||||
|
- b'<fran\xe7ais>Comment \xe7a va ? Tr\xe8s bien ?</fran\xe7ais>')
|
||||||
|
+ self.assertRaises(ExpatError, parseString,
|
||||||
|
+ b'<fran\xe7ais></fran\xe7ais>')
|
||||||
|
+ self.assertRaises(ExpatError, parseString,
|
||||||
|
+ b'<franais>Comment \xe7a va ? Tr\xe8s bien ?</franais>')
|
||||||
|
|
||||||
|
doc.unlink()
|
||||||
|
|
||||||
|
@@ -1617,10 +1613,7 @@ class MinidomTest(unittest.TestCase):
|
||||||
|
self.confirm(doc2.namespaceURI == xml.dom.EMPTY_NAMESPACE)
|
||||||
|
|
||||||
|
def testExceptionOnSpacesInXMLNSValue(self):
|
||||||
|
- if pyexpat.version_info >= (2, 4, 5):
|
||||||
|
- context = self.assertRaisesRegex(ExpatError, 'syntax error')
|
||||||
|
- else:
|
||||||
|
- context = self.assertRaisesRegex(ValueError, 'Unsupported syntax')
|
||||||
|
+ context = self.assertRaisesRegex(ExpatError, 'syntax error')
|
||||||
|
|
||||||
|
with context:
|
||||||
|
parseString('<element xmlns:abc="http:abc.com/de f g/hi/j k"><abc:foo /></element>')
|
||||||
|
--
|
||||||
|
2.35.3
|
||||||
|
|
@ -16,6 +16,7 @@ LEVELS = (None, 1, 2)
|
|||||||
# list of globs of test and other files that we expect not to have bytecode
|
# list of globs of test and other files that we expect not to have bytecode
|
||||||
not_compiled = [
|
not_compiled = [
|
||||||
'/usr/bin/*',
|
'/usr/bin/*',
|
||||||
|
'/usr/lib/rpm/redhat/*',
|
||||||
'*/test/*/bad_coding.py',
|
'*/test/*/bad_coding.py',
|
||||||
'*/test/*/bad_coding2.py',
|
'*/test/*/bad_coding2.py',
|
||||||
'*/test/*/badsyntax_*.py',
|
'*/test/*/badsyntax_*.py',
|
||||||
|
171
SOURCES/import_all_modules_py3_11.py
Normal file
171
SOURCES/import_all_modules_py3_11.py
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
'''Script to perform import of each module given to %%py_check_import
|
||||||
|
'''
|
||||||
|
import argparse
|
||||||
|
import importlib
|
||||||
|
import fnmatch
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import site
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from contextlib import contextmanager
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
def read_modules_files(file_paths):
|
||||||
|
'''Read module names from the files (modules must be newline separated).
|
||||||
|
|
||||||
|
Return the module names list or, if no files were provided, an empty list.
|
||||||
|
'''
|
||||||
|
|
||||||
|
if not file_paths:
|
||||||
|
return []
|
||||||
|
|
||||||
|
modules = []
|
||||||
|
for file in file_paths:
|
||||||
|
file_contents = file.read_text()
|
||||||
|
modules.extend(file_contents.split())
|
||||||
|
return modules
|
||||||
|
|
||||||
|
|
||||||
|
def read_modules_from_cli(argv):
|
||||||
|
'''Read module names from command-line arguments (space or comma separated).
|
||||||
|
|
||||||
|
Return the module names list.
|
||||||
|
'''
|
||||||
|
|
||||||
|
if not argv:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# %%py3_check_import allows to separate module list with comma or whitespace,
|
||||||
|
# we need to unify the output to a list of particular elements
|
||||||
|
modules_as_str = ' '.join(argv)
|
||||||
|
modules = re.split(r'[\s,]+', modules_as_str)
|
||||||
|
# Because of shell expansion in some less typical cases it may happen
|
||||||
|
# that a trailing space will occur at the end of the list.
|
||||||
|
# Remove the empty items from the list before passing it further
|
||||||
|
modules = [m for m in modules if m]
|
||||||
|
return modules
|
||||||
|
|
||||||
|
|
||||||
|
def filter_top_level_modules_only(modules):
|
||||||
|
'''Filter out entries with nested modules (containing dot) ie. 'foo.bar'.
|
||||||
|
|
||||||
|
Return the list of top-level modules.
|
||||||
|
'''
|
||||||
|
|
||||||
|
return [module for module in modules if '.' not in module]
|
||||||
|
|
||||||
|
|
||||||
|
def any_match(text, globs):
|
||||||
|
'''Return True if any of given globs fnmatchcase's the given text.'''
|
||||||
|
|
||||||
|
return any(fnmatch.fnmatchcase(text, g) for g in globs)
|
||||||
|
|
||||||
|
|
||||||
|
def exclude_unwanted_module_globs(globs, modules):
|
||||||
|
'''Filter out entries which match the either of the globs given as argv.
|
||||||
|
|
||||||
|
Return the list of filtered modules.
|
||||||
|
'''
|
||||||
|
|
||||||
|
return [m for m in modules if not any_match(m, globs)]
|
||||||
|
|
||||||
|
|
||||||
|
def read_modules_from_all_args(args):
|
||||||
|
'''Return a joined list of modules from all given command-line arguments.
|
||||||
|
'''
|
||||||
|
|
||||||
|
modules = read_modules_files(args.filename)
|
||||||
|
modules.extend(read_modules_from_cli(args.modules))
|
||||||
|
if args.exclude:
|
||||||
|
modules = exclude_unwanted_module_globs(args.exclude, modules)
|
||||||
|
|
||||||
|
if args.top_level:
|
||||||
|
modules = filter_top_level_modules_only(modules)
|
||||||
|
|
||||||
|
# Error when someone accidentally managed to filter out everything
|
||||||
|
if len(modules) == 0:
|
||||||
|
raise ValueError('No modules to check were left')
|
||||||
|
|
||||||
|
return modules
|
||||||
|
|
||||||
|
|
||||||
|
def import_modules(modules):
|
||||||
|
'''Procedure to perform import check for each module name from the given list of modules.
|
||||||
|
'''
|
||||||
|
|
||||||
|
for module in modules:
|
||||||
|
print('Check import:', module, file=sys.stderr)
|
||||||
|
importlib.import_module(module)
|
||||||
|
|
||||||
|
|
||||||
|
def argparser():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description='Generate list of all importable modules for import check.'
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'modules', nargs='*',
|
||||||
|
help=('Add modules to check the import (space or comma separated).'),
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'-f', '--filename', action='append', type=Path,
|
||||||
|
help='Add importable module names list from file.',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'-t', '--top-level', action='store_true',
|
||||||
|
help='Check only top-level modules.',
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'-e', '--exclude', action='append',
|
||||||
|
help='Provide modules globs to be excluded from the check.',
|
||||||
|
)
|
||||||
|
return parser
|
||||||
|
|
||||||
|
|
||||||
|
@contextmanager
|
||||||
|
def remove_unwanteds_from_sys_path():
|
||||||
|
'''Remove cwd and this script's parent from sys.path for the import test.
|
||||||
|
Bring the original contents back after import is done (or failed)
|
||||||
|
'''
|
||||||
|
|
||||||
|
cwd_absolute = Path.cwd().absolute()
|
||||||
|
this_file_parent = Path(__file__).parent.absolute()
|
||||||
|
old_sys_path = list(sys.path)
|
||||||
|
for path in old_sys_path:
|
||||||
|
if Path(path).absolute() in (cwd_absolute, this_file_parent):
|
||||||
|
sys.path.remove(path)
|
||||||
|
try:
|
||||||
|
yield
|
||||||
|
finally:
|
||||||
|
sys.path = old_sys_path
|
||||||
|
|
||||||
|
|
||||||
|
def addsitedirs_from_environ():
|
||||||
|
'''Load directories from the _PYTHONSITE environment variable (separated by :)
|
||||||
|
and load the ones already present in sys.path via site.addsitedir()
|
||||||
|
to handle .pth files in them.
|
||||||
|
|
||||||
|
This is needed to properly import old-style namespace packages with nspkg.pth files.
|
||||||
|
See https://bugzilla.redhat.com/2018551 for a more detailed rationale.'''
|
||||||
|
for path in os.getenv('_PYTHONSITE', '').split(':'):
|
||||||
|
if path in sys.path:
|
||||||
|
site.addsitedir(path)
|
||||||
|
|
||||||
|
|
||||||
|
def main(argv=None):
|
||||||
|
|
||||||
|
cli_args = argparser().parse_args(argv)
|
||||||
|
|
||||||
|
if not cli_args.modules and not cli_args.filename:
|
||||||
|
raise ValueError('No modules to check were provided')
|
||||||
|
|
||||||
|
modules = read_modules_from_all_args(cli_args)
|
||||||
|
|
||||||
|
with remove_unwanteds_from_sys_path():
|
||||||
|
addsitedirs_from_environ()
|
||||||
|
import_modules(modules)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
77
SOURCES/macros.python3.11
Normal file
77
SOURCES/macros.python3.11
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
%__python3 /usr/bin/python3.11
|
||||||
|
%python3_pkgversion 3.11
|
||||||
|
|
||||||
|
# The following are macros from macros.python3 in Fedora that are newer/different than those in the python3-rpm-macros package in RHEL.
|
||||||
|
# These macros overwrite/supercede some of the macros in the python3-rpm-macros package in RHEL.
|
||||||
|
|
||||||
|
# nb: $RPM_BUILD_ROOT is not set when the macros are expanded (at spec parse time)
|
||||||
|
# so we set it manually (to empty string), making our Python prefer the correct install scheme location
|
||||||
|
# platbase/base is explicitly set to %%{_prefix} to support custom values, such as /app for flatpaks
|
||||||
|
%python3_sitelib %(RPM_BUILD_ROOT= %{__python3} -Ic "import sysconfig; print(sysconfig.get_path('purelib', vars={'platbase': '%{_prefix}', 'base': '%{_prefix}'}))")
|
||||||
|
%python3_sitearch %(RPM_BUILD_ROOT= %{__python3} -Ic "import sysconfig; print(sysconfig.get_path('platlib', vars={'platbase': '%{_prefix}', 'base': '%{_prefix}'}))")
|
||||||
|
%python3_version %(RPM_BUILD_ROOT= %{__python3} -Ic "import sys; sys.stdout.write('{0.major}.{0.minor}'.format(sys.version_info))")
|
||||||
|
%python3_version_nodots %(RPM_BUILD_ROOT= %{__python3} -Ic "import sys; sys.stdout.write('{0.major}{0.minor}'.format(sys.version_info))")
|
||||||
|
%python3_platform %(RPM_BUILD_ROOT= %{__python3} -Ic "import sysconfig; print(sysconfig.get_platform())")
|
||||||
|
%python3_platform_triplet %(RPM_BUILD_ROOT= %{__python3} -Ic "import sysconfig; print(sysconfig.get_config_var('MULTIARCH'))")
|
||||||
|
%python3_ext_suffix %(RPM_BUILD_ROOT= %{__python3} -Ic "import sysconfig; print(sysconfig.get_config_var('EXT_SUFFIX'))")
|
||||||
|
%python3_cache_tag %(RPM_BUILD_ROOT= %{__python3} -Ic "import sys; print(sys.implementation.cache_tag)")
|
||||||
|
|
||||||
|
%_py3_shebang_s s
|
||||||
|
%_py3_shebang_P %(RPM_BUILD_ROOT= %{__python3} -Ic "import sys; print('P' if hasattr(sys.flags, 'safe_path') else '')")
|
||||||
|
%py3_shbang_opts -%{?_py3_shebang_s}%{?_py3_shebang_P}
|
||||||
|
|
||||||
|
%py3_install() %{expand:\\\
|
||||||
|
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\
|
||||||
|
%{__python3} %{py_setup} %{?py_setup_args} install -O1 --skip-build --root %{buildroot} --prefix %{_prefix} %{?*}
|
||||||
|
rm -rfv %{buildroot}%{_bindir}/__pycache__
|
||||||
|
}
|
||||||
|
|
||||||
|
%py3_install_egg() %{expand:\\\
|
||||||
|
mkdir -p %{buildroot}%{python3_sitelib}
|
||||||
|
%{__python3} -m easy_install -m --prefix %{buildroot}%{_prefix} -Z dist/*-py%{python3_version}.egg %{?*}
|
||||||
|
rm -rfv %{buildroot}%{_bindir}/__pycache__
|
||||||
|
}
|
||||||
|
|
||||||
|
%py3_install_wheel() %{expand:\\\
|
||||||
|
%{__python3} -m pip install -I dist/%{1} --root %{buildroot} --prefix %{_prefix} --no-deps --no-index --no-warn-script-location
|
||||||
|
rm -rfv %{buildroot}%{_bindir}/__pycache__
|
||||||
|
for distinfo in %{buildroot}%{python3_sitelib}/*.dist-info %{buildroot}%{python3_sitearch}/*.dist-info; do
|
||||||
|
if [ -f ${distinfo}/direct_url.json ]; then
|
||||||
|
rm -fv ${distinfo}/direct_url.json
|
||||||
|
sed -i '/direct_url.json/d' ${distinfo}/RECORD
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# With $PATH and $PYTHONPATH set to the %%buildroot,
|
||||||
|
# try to import the Python 3 module(s) given as command-line args or read from file (-f).
|
||||||
|
# Respect the custom values of %%py3_shebang_flags or set nothing if it's undefined.
|
||||||
|
# Filter and check import on only top-level modules using -t flag.
|
||||||
|
# Exclude unwanted modules by passing their globs to -e option.
|
||||||
|
# Useful as a smoke test in %%check when running tests is not feasible.
|
||||||
|
# Use spaces or commas as separators if providing list directly.
|
||||||
|
# Use newlines as separators if providing list in a file.
|
||||||
|
%py3_check_import(e:tf:) %{expand:\\\
|
||||||
|
PATH="%{buildroot}%{_bindir}:$PATH"\\\
|
||||||
|
PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}}"\\\
|
||||||
|
_PYTHONSITE="%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}"\\\
|
||||||
|
PYTHONDONTWRITEBYTECODE=1\\\
|
||||||
|
%{lua:
|
||||||
|
local command = "%{__python3} "
|
||||||
|
if rpm.expand("%{?py3_shebang_flags}") ~= "" then
|
||||||
|
command = command .. "-%{py3_shebang_flags}"
|
||||||
|
end
|
||||||
|
command = command .. " %{_rpmconfigdir}/redhat/import_all_modules_py3_11.py "
|
||||||
|
-- handle multiline arguments correctly, see https://bugzilla.redhat.com/2018809
|
||||||
|
local args=rpm.expand('%{?**}'):gsub("[%s\\\\]*%s+", " ")
|
||||||
|
print(command .. args)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%pytest %{expand:\\\
|
||||||
|
CFLAGS="${CFLAGS:-${RPM_OPT_FLAGS}}" LDFLAGS="${LDFLAGS:-${RPM_LD_FLAGS}}"\\\
|
||||||
|
PATH="%{buildroot}%{_bindir}:$PATH"\\\
|
||||||
|
PYTHONPATH="${PYTHONPATH:-%{buildroot}%{python3_sitearch}:%{buildroot}%{python3_sitelib}}"\\\
|
||||||
|
PYTHONDONTWRITEBYTECODE=1\\\
|
||||||
|
%{?__pytest_addopts:PYTEST_ADDOPTS="${PYTEST_ADDOPTS:-} %{__pytest_addopts}"}\\\
|
||||||
|
%__pytest}
|
@ -253,6 +253,10 @@ Source1: %{url}ftp/python/%{general_version}/Python-%{upstream_version}.tar.xz.a
|
|||||||
# The release manager for Python 3.11 is pablogsal
|
# The release manager for Python 3.11 is pablogsal
|
||||||
Source2: https://keybase.io/pablogsal/pgp_keys.asc
|
Source2: https://keybase.io/pablogsal/pgp_keys.asc
|
||||||
|
|
||||||
|
# Sources for the python3.11-rpm-macros
|
||||||
|
Source3: macros.python3.11
|
||||||
|
Source4: import_all_modules_py3_11.py
|
||||||
|
|
||||||
# A simple script to check timestamps of bytecode files
|
# A simple script to check timestamps of bytecode files
|
||||||
# Run in check section with Python that is currently being built
|
# Run in check section with Python that is currently being built
|
||||||
# Originally written by bkabrda
|
# Originally written by bkabrda
|
||||||
@ -332,6 +336,31 @@ Patch329: 00329-fips.patch
|
|||||||
# https://github.com/GrahamDumpleton/mod_wsgi/issues/730
|
# https://github.com/GrahamDumpleton/mod_wsgi/issues/730
|
||||||
Patch371: 00371-revert-bpo-1596321-fix-threading-_shutdown-for-the-main-thread-gh-28549-gh-28589.patch
|
Patch371: 00371-revert-bpo-1596321-fix-threading-_shutdown-for-the-main-thread-gh-28549-gh-28589.patch
|
||||||
|
|
||||||
|
# 00378 #
|
||||||
|
# Support expat 2.4.5
|
||||||
|
#
|
||||||
|
# Curly brackets were never allowed in namespace URIs
|
||||||
|
# according to RFC 3986, and so-called namespace-validating
|
||||||
|
# XML parsers have the right to reject them a invalid URIs.
|
||||||
|
#
|
||||||
|
# libexpat >=2.4.5 has become strcter in that regard due to
|
||||||
|
# related security issues; with ET.XML instantiating a
|
||||||
|
# namespace-aware parser under the hood, this test has no
|
||||||
|
# future in CPython.
|
||||||
|
#
|
||||||
|
# References:
|
||||||
|
# - https://datatracker.ietf.org/doc/html/rfc3968
|
||||||
|
# - https://www.w3.org/TR/xml-names/
|
||||||
|
#
|
||||||
|
# Also, test_minidom.py: Support Expat >=2.4.5
|
||||||
|
#
|
||||||
|
# The patch has diverged from upstream as the python test
|
||||||
|
# suite was relying on checking the expat version, whereas
|
||||||
|
# in RHEL fixes get backported instead of rebasing packages.
|
||||||
|
#
|
||||||
|
# Upstream: https://bugs.python.org/issue46811
|
||||||
|
Patch378: 00378-support-expat-2-4-5.patch
|
||||||
|
|
||||||
# 00397 #
|
# 00397 #
|
||||||
# Filters for tarfile extraction (CVE-2007-4559, PEP-706)
|
# Filters for tarfile extraction (CVE-2007-4559, PEP-706)
|
||||||
# First patch fixes determination of symlink targets, which were treated
|
# First patch fixes determination of symlink targets, which were treated
|
||||||
@ -374,6 +403,14 @@ Patch415: 00415-cve-2023-27043-gh-102988-reject-malformed-addresses-in-email-par
|
|||||||
# Descriptions, and metadata for subpackages
|
# Descriptions, and metadata for subpackages
|
||||||
# ==========================================
|
# ==========================================
|
||||||
|
|
||||||
|
# Require alternatives version that implements the --keep-foreign flag and fixes rhbz#2203820
|
||||||
|
Requires: alternatives >= 1.19.2-1
|
||||||
|
Requires(post): alternatives >= 1.19.2-1
|
||||||
|
Requires(postun): alternatives >= 1.19.2-1
|
||||||
|
|
||||||
|
# When the user tries to `yum install python`, yum will list this package among
|
||||||
|
# the possible alternatives
|
||||||
|
Provides: alternative-for(python)
|
||||||
|
|
||||||
%if %{with main_python}
|
%if %{with main_python}
|
||||||
# Description for the python3X SRPM only:
|
# Description for the python3X SRPM only:
|
||||||
@ -448,6 +485,7 @@ Documentation for Python is provided in the %{pkgname}-docs package.
|
|||||||
Packages containing additional libraries for Python are generally named with
|
Packages containing additional libraries for Python are generally named with
|
||||||
the "%{pkgname}-" prefix.
|
the "%{pkgname}-" prefix.
|
||||||
|
|
||||||
|
For the unversioned "python" executable, see manual page "unversioned-python".
|
||||||
|
|
||||||
%if %{with main_python}
|
%if %{with main_python}
|
||||||
# https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_package
|
# https://fedoraproject.org/wiki/Changes/Move_usr_bin_python_into_separate_package
|
||||||
@ -516,9 +554,12 @@ Requires: %{pkgname}-libs%{?_isa} = %{version}-%{release}
|
|||||||
Requires: (python-rpm-macros if rpm-build)
|
Requires: (python-rpm-macros if rpm-build)
|
||||||
Requires: (python3-rpm-macros if rpm-build)
|
Requires: (python3-rpm-macros if rpm-build)
|
||||||
|
|
||||||
# We provide the python3.11-rpm-macros here to make it possible to
|
# Require alternatives version that implements the --keep-foreign flag and fixes rhbz#2203820
|
||||||
# BuildRequire them in the same manner as RHEL8.
|
Requires(postun): alternatives >= 1.19.2-1
|
||||||
Provides: %{pkgname}-rpm-macros = %{version}-%{release}
|
|
||||||
|
# python3.11 installs the alternatives master symlink to which we attach a slave
|
||||||
|
Requires(post): %{pkgname}
|
||||||
|
Requires(postun): %{pkgname}
|
||||||
|
|
||||||
%unversioned_obsoletes_of_python3_X_if_main devel
|
%unversioned_obsoletes_of_python3_X_if_main devel
|
||||||
|
|
||||||
@ -567,6 +608,13 @@ Provides: idle = %{version}-%{release}
|
|||||||
Provides: %{pkgname}-tools = %{version}-%{release}
|
Provides: %{pkgname}-tools = %{version}-%{release}
|
||||||
Provides: %{pkgname}-tools%{?_isa} = %{version}-%{release}
|
Provides: %{pkgname}-tools%{?_isa} = %{version}-%{release}
|
||||||
|
|
||||||
|
# Require alternatives version that implements the --keep-foreign flag and fixes rhbz#2203820
|
||||||
|
Requires(postun): alternatives >= 1.19.2-1
|
||||||
|
|
||||||
|
# python3.11 installs the alternatives master symlink to which we attach a slave
|
||||||
|
Requires(post): %{pkgname}
|
||||||
|
Requires(postun): %{pkgname}
|
||||||
|
|
||||||
%description -n %{pkgname}-idle
|
%description -n %{pkgname}-idle
|
||||||
IDLE is Python’s Integrated Development and Learning Environment.
|
IDLE is Python’s Integrated Development and Learning Environment.
|
||||||
|
|
||||||
@ -626,6 +674,13 @@ Requires: %{pkgname}-idle%{?_isa} = %{version}-%{release}
|
|||||||
|
|
||||||
%unversioned_obsoletes_of_python3_X_if_main debug
|
%unversioned_obsoletes_of_python3_X_if_main debug
|
||||||
|
|
||||||
|
# Require alternatives version that implements the --keep-foreign flag and fixes rhbz#2203820
|
||||||
|
Requires(postun): alternatives >= 1.19.2-1
|
||||||
|
|
||||||
|
# python3.11 installs the alternatives master symlink to which we attach a slave
|
||||||
|
Requires(post): %{pkgname}
|
||||||
|
Requires(postun): %{pkgname}
|
||||||
|
|
||||||
%description -n %{pkgname}-debug
|
%description -n %{pkgname}-debug
|
||||||
python3-debug provides a version of the Python runtime with numerous debugging
|
python3-debug provides a version of the Python runtime with numerous debugging
|
||||||
features enabled, aimed at advanced Python users such as developers of Python
|
features enabled, aimed at advanced Python users such as developers of Python
|
||||||
@ -643,6 +698,23 @@ The debug runtime additionally supports debug builds of C-API extensions
|
|||||||
(with the "d" ABI flag) for debugging issues in those extensions.
|
(with the "d" ABI flag) for debugging issues in those extensions.
|
||||||
%endif # with debug_build
|
%endif # with debug_build
|
||||||
|
|
||||||
|
# We package the python3.11-rpm-macros in RHEL8 as to properly set the
|
||||||
|
# %%__python3 and %%python3_pkgversion macros as well as provide modern
|
||||||
|
# versions the current base macros.
|
||||||
|
%package -n %{pkgname}-rpm-macros
|
||||||
|
Summary: RPM macros for building RPMs with Python %{pybasever}
|
||||||
|
License: MIT
|
||||||
|
Provides: python-modular-rpm-macros == %{pybasever}
|
||||||
|
Conflicts: python-modular-rpm-macros > %{pybasever}
|
||||||
|
Requires: python3-rpm-macros
|
||||||
|
BuildArch: noarch
|
||||||
|
|
||||||
|
%description -n %{pkgname}-rpm-macros
|
||||||
|
RPM macros for building RPMs with Python %{pybasever} from the python%{pyshortver} module.
|
||||||
|
If you want to build an RPM against the python%{pyshortver} module, you need to add:
|
||||||
|
|
||||||
|
BuildRequire: %{pkgname}-rpm-macros.
|
||||||
|
|
||||||
# ======================================================
|
# ======================================================
|
||||||
# The prep phase of the build:
|
# The prep phase of the build:
|
||||||
# ======================================================
|
# ======================================================
|
||||||
@ -1052,6 +1124,28 @@ for file in %{buildroot}%{pylibdir}/pydoc_data/topics.py $(grep --include='*.py'
|
|||||||
rm ${directory}/{__pycache__/${module}.cpython-%{pyshortver}.opt-?.pyc,${module}.py}
|
rm ${directory}/{__pycache__/${module}.cpython-%{pyshortver}.opt-?.pyc,${module}.py}
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Python RPM macros
|
||||||
|
mkdir -p %{buildroot}%{rpmmacrodir}/
|
||||||
|
install -m 644 %{SOURCE3} \
|
||||||
|
%{buildroot}/%{rpmmacrodir}/
|
||||||
|
|
||||||
|
# Add a script that is being used by python3.11-rpm-macros
|
||||||
|
mkdir -p %{buildroot}%{_rpmconfigdir}/redhat
|
||||||
|
install -m 644 %{SOURCE4} %{buildroot}%{_rpmconfigdir}/redhat/
|
||||||
|
|
||||||
|
# All ghost files controlled by alternatives need to exist for the files
|
||||||
|
# section check to succeed
|
||||||
|
# - Don't list /usr/bin/python as a ghost file so `yum install /usr/bin/python`
|
||||||
|
# doesn't install this package
|
||||||
|
touch %{buildroot}%{_bindir}/unversioned-python
|
||||||
|
touch %{buildroot}%{_mandir}/man1/python.1.gz
|
||||||
|
touch %{buildroot}%{_bindir}/python3
|
||||||
|
touch %{buildroot}%{_mandir}/man1/python3.1.gz
|
||||||
|
touch %{buildroot}%{_bindir}/pydoc3
|
||||||
|
touch %{buildroot}%{_bindir}/pydoc-3
|
||||||
|
touch %{buildroot}%{_bindir}/idle3
|
||||||
|
touch %{buildroot}%{_bindir}/python3-config
|
||||||
|
|
||||||
# ======================================================
|
# ======================================================
|
||||||
# Checks for packaging issues
|
# Checks for packaging issues
|
||||||
# ======================================================
|
# ======================================================
|
||||||
@ -1142,9 +1236,118 @@ CheckPython optimized
|
|||||||
|
|
||||||
%endif # with tests
|
%endif # with tests
|
||||||
|
|
||||||
|
|
||||||
|
# ======================================================
|
||||||
|
# Scriptlets for alternatives on rhel8
|
||||||
|
# ======================================================
|
||||||
|
%post
|
||||||
|
# Alternative for /usr/bin/python -> /usr/bin/python3 + man page
|
||||||
|
alternatives --install %{_bindir}/unversioned-python \
|
||||||
|
python \
|
||||||
|
%{_bindir}/python3 \
|
||||||
|
300 \
|
||||||
|
--slave %{_bindir}/python \
|
||||||
|
unversioned-python \
|
||||||
|
%{_bindir}/python3 \
|
||||||
|
--slave %{_mandir}/man1/python.1.gz \
|
||||||
|
unversioned-python-man \
|
||||||
|
%{_mandir}/man1/python3.1.gz
|
||||||
|
|
||||||
|
# Alternative for /usr/bin/python -> /usr/bin/python3.11 + man page
|
||||||
|
alternatives --install %{_bindir}/unversioned-python \
|
||||||
|
python \
|
||||||
|
%{_bindir}/python3.11 \
|
||||||
|
211 \
|
||||||
|
--slave %{_bindir}/python \
|
||||||
|
unversioned-python \
|
||||||
|
%{_bindir}/python3.11 \
|
||||||
|
--slave %{_mandir}/man1/python.1.gz \
|
||||||
|
unversioned-python-man \
|
||||||
|
%{_mandir}/man1/python3.11.1.gz
|
||||||
|
|
||||||
|
# Alternative for /usr/bin/python3 -> /usr/bin/python3.11 + related files
|
||||||
|
# Create only if it doesn't exist already
|
||||||
|
EXISTS=`alternatives --display python3 | \
|
||||||
|
grep -c "^/usr/bin/python3.11 - priority [0-9]*"`
|
||||||
|
|
||||||
|
if [ $EXISTS -eq 0 ]; then
|
||||||
|
alternatives --install %{_bindir}/python3 \
|
||||||
|
python3 \
|
||||||
|
%{_bindir}/python3.11 \
|
||||||
|
31100 \
|
||||||
|
--slave %{_mandir}/man1/python3.1.gz \
|
||||||
|
python3-man \
|
||||||
|
%{_mandir}/man1/python3.11.1.gz \
|
||||||
|
--slave %{_bindir}/pydoc3 \
|
||||||
|
pydoc3 \
|
||||||
|
%{_bindir}/pydoc3.11 \
|
||||||
|
--slave %{_bindir}/pydoc-3 \
|
||||||
|
pydoc-3 \
|
||||||
|
%{_bindir}/pydoc3.11
|
||||||
|
fi
|
||||||
|
|
||||||
|
%postun
|
||||||
|
# Do this only during uninstall process (not during update)
|
||||||
|
if [ $1 -eq 0 ]; then
|
||||||
|
alternatives --keep-foreign --remove python \
|
||||||
|
%{_bindir}/python3.11
|
||||||
|
|
||||||
|
alternatives --keep-foreign --remove python3 \
|
||||||
|
%{_bindir}/python3.11
|
||||||
|
|
||||||
|
# Remove link python → python3 if no other python3.* exists
|
||||||
|
if ! alternatives --display python3 > /dev/null; then
|
||||||
|
alternatives --keep-foreign --remove python \
|
||||||
|
%{_bindir}/python3
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
%post devel
|
||||||
|
alternatives --add-slave python3 %{_bindir}/python3.11 \
|
||||||
|
%{_bindir}/python3-config \
|
||||||
|
python3-config \
|
||||||
|
%{_bindir}/python3.11-config
|
||||||
|
|
||||||
|
%postun devel
|
||||||
|
# Do this only during uninstall process (not during update)
|
||||||
|
if [ $1 -eq 0 ]; then
|
||||||
|
alternatives --keep-foreign --remove-slave python3 %{_bindir}/python3.11 \
|
||||||
|
python3-config
|
||||||
|
fi
|
||||||
|
|
||||||
|
%post idle
|
||||||
|
alternatives --add-slave python3 %{_bindir}/python3.11 \
|
||||||
|
%{_bindir}/idle3 \
|
||||||
|
idle3 \
|
||||||
|
%{_bindir}/idle3.11
|
||||||
|
|
||||||
|
%postun idle
|
||||||
|
# Do this only during uninstall process (not during update)
|
||||||
|
if [ $1 -eq 0 ]; then
|
||||||
|
alternatives --keep-foreign --remove-slave python3 %{_bindir}/python3.11 \
|
||||||
|
idle3
|
||||||
|
fi
|
||||||
|
|
||||||
|
# ======================================================
|
||||||
|
# Files for each RPM (sub)package
|
||||||
|
# ======================================================
|
||||||
|
|
||||||
|
%files -n %{pkgname}-rpm-macros
|
||||||
|
%{rpmmacrodir}/macros.python%{pybasever}
|
||||||
|
%{_rpmconfigdir}/redhat/import_all_modules_py3_11.py
|
||||||
|
|
||||||
%files -n %{pkgname}
|
%files -n %{pkgname}
|
||||||
%doc README.rst
|
%doc README.rst
|
||||||
|
|
||||||
|
# Alternatives
|
||||||
|
%ghost %{_bindir}/unversioned-python
|
||||||
|
%ghost %{_mandir}/man1/python.1.gz
|
||||||
|
%ghost %{_bindir}/python3
|
||||||
|
%ghost %{_mandir}/man1/python3.1.gz
|
||||||
|
%ghost %{_bindir}/pydoc3
|
||||||
|
%ghost %{_bindir}/pydoc-3
|
||||||
|
|
||||||
%if %{with main_python}
|
%if %{with main_python}
|
||||||
%{_bindir}/pydoc*
|
%{_bindir}/pydoc*
|
||||||
%{_bindir}/python3
|
%{_bindir}/python3
|
||||||
@ -1434,6 +1637,9 @@ CheckPython optimized
|
|||||||
%{_bindir}/python%{pybasever}-config
|
%{_bindir}/python%{pybasever}-config
|
||||||
%{_bindir}/python%{LDVERSION_optimized}-config
|
%{_bindir}/python%{LDVERSION_optimized}-config
|
||||||
%{_bindir}/python%{LDVERSION_optimized}-*-config
|
%{_bindir}/python%{LDVERSION_optimized}-*-config
|
||||||
|
# Alternatives
|
||||||
|
%ghost %{_bindir}/python3-config
|
||||||
|
|
||||||
%{_libdir}/libpython%{LDVERSION_optimized}.so
|
%{_libdir}/libpython%{LDVERSION_optimized}.so
|
||||||
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
|
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}.pc
|
||||||
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}-embed.pc
|
%{_libdir}/pkgconfig/python-%{LDVERSION_optimized}-embed.pc
|
||||||
@ -1446,6 +1652,8 @@ CheckPython optimized
|
|||||||
%{_bindir}/idle*
|
%{_bindir}/idle*
|
||||||
%else
|
%else
|
||||||
%{_bindir}/idle%{pybasever}
|
%{_bindir}/idle%{pybasever}
|
||||||
|
# Alternatives
|
||||||
|
%ghost %{_bindir}/idle3
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%{pylibdir}/idlelib
|
%{pylibdir}/idlelib
|
||||||
@ -1633,16 +1841,20 @@ CheckPython optimized
|
|||||||
%changelog
|
%changelog
|
||||||
* Mon Jan 22 2024 Charalampos Stratakis <cstratak@redhat.com> - 3.11.7-1
|
* Mon Jan 22 2024 Charalampos Stratakis <cstratak@redhat.com> - 3.11.7-1
|
||||||
- Rebase to 3.11.7
|
- Rebase to 3.11.7
|
||||||
Resolves: RHEL-20233
|
Resolves: RHEL-21915
|
||||||
|
|
||||||
* Tue Jan 09 2024 Lumír Balhar <lbalhar@redhat.com> - 3.11.5-2
|
* Tue Jan 09 2024 Lumír Balhar <lbalhar@redhat.com> - 3.11.5-2
|
||||||
- Security fix for CVE-2023-27043
|
- Security fix for CVE-2023-27043
|
||||||
Resolves: RHEL-21325
|
Resolves: RHEL-7842
|
||||||
|
|
||||||
* Thu Sep 07 2023 Charalampos Stratakis <cstratak@redhat.com> - 3.11.5-1
|
* Thu Sep 07 2023 Charalampos Stratakis <cstratak@redhat.com> - 3.11.5-1
|
||||||
- Rebase to 3.11.5
|
- Rebase to 3.11.5
|
||||||
- Security fixes for CVE-2023-40217 and CVE-2023-41105
|
- Security fixes for CVE-2023-40217 and CVE-2023-41105
|
||||||
Resolves: RHEL-3045, RHEL-3269
|
Resolves: RHEL-3047, RHEL-3267
|
||||||
|
|
||||||
|
* Thu Aug 10 2023 Tomas Orsava <torsava@redhat.com> - 3.11.4-4
|
||||||
|
- Add the import_all_modules_py3_11.py file for the python3.11-rpm-macros subpackage
|
||||||
|
Resolves: rhbz#2207631
|
||||||
|
|
||||||
* Wed Aug 09 2023 Petr Viktorin <pviktori@redhat.com> - 3.11.4-3
|
* Wed Aug 09 2023 Petr Viktorin <pviktori@redhat.com> - 3.11.4-3
|
||||||
- Fix symlink handling in the fix for CVE-2023-24329
|
- Fix symlink handling in the fix for CVE-2023-24329
|
||||||
@ -1668,7 +1880,10 @@ Resolves: rhbz#2173917
|
|||||||
|
|
||||||
* Mon Jan 30 2023 Charalampos Stratakis <cstratak@redhat.com> - 3.11.1-3
|
* Mon Jan 30 2023 Charalampos Stratakis <cstratak@redhat.com> - 3.11.1-3
|
||||||
- Disable bootstrap
|
- Disable bootstrap
|
||||||
- Bump release to sync with RHEL8
|
- Revert python3.11-rpm-macros requirement
|
||||||
|
|
||||||
|
* Mon Jan 30 2023 Charalampos Stratakis <cstratak@redhat.com> - 3.11.1-2
|
||||||
|
- Fix macros requirements
|
||||||
|
|
||||||
* Tue Dec 13 2022 Charalampos Stratakis <cstratak@redhat.com> - 3.11.1-1
|
* Tue Dec 13 2022 Charalampos Stratakis <cstratak@redhat.com> - 3.11.1-1
|
||||||
- Initial package
|
- Initial package
|
||||||
|
Loading…
Reference in New Issue
Block a user