import python3.11-3.11.2-2.el8
This commit is contained in:
commit
114c4b6ae1
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
SOURCES/Python-3.11.2.tar.xz
|
||||||
|
SOURCES/pgp_keys.asc
|
2
.python3.11.metadata
Normal file
2
.python3.11.metadata
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
ae1c199ecb7a969588b15354e19e7b60cb65d1b9 SOURCES/Python-3.11.2.tar.xz
|
||||||
|
befe131eceffa73877ba3adceca3b7b1da1d2319 SOURCES/pgp_keys.asc
|
30
SOURCES/00001-rpath.patch
Normal file
30
SOURCES/00001-rpath.patch
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: David Malcolm <dmalcolm@redhat.com>
|
||||||
|
Date: Wed, 13 Jan 2010 21:25:18 +0000
|
||||||
|
Subject: [PATCH] 00001: Fixup distutils/unixccompiler.py to remove standard
|
||||||
|
library path from rpath Was Patch0 in ivazquez' python3000 specfile
|
||||||
|
|
||||||
|
---
|
||||||
|
Lib/distutils/unixccompiler.py | 9 +++++++++
|
||||||
|
1 file changed, 9 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py
|
||||||
|
index d00c48981e..0283a28c19 100644
|
||||||
|
--- a/Lib/distutils/unixccompiler.py
|
||||||
|
+++ b/Lib/distutils/unixccompiler.py
|
||||||
|
@@ -82,6 +82,15 @@ class UnixCCompiler(CCompiler):
|
||||||
|
if sys.platform == "cygwin":
|
||||||
|
exe_extension = ".exe"
|
||||||
|
|
||||||
|
+ def _fix_lib_args(self, libraries, library_dirs, runtime_library_dirs):
|
||||||
|
+ """Remove standard library path from rpath"""
|
||||||
|
+ libraries, library_dirs, runtime_library_dirs = super()._fix_lib_args(
|
||||||
|
+ libraries, library_dirs, runtime_library_dirs)
|
||||||
|
+ libdir = sysconfig.get_config_var('LIBDIR')
|
||||||
|
+ if runtime_library_dirs and (libdir in runtime_library_dirs):
|
||||||
|
+ runtime_library_dirs.remove(libdir)
|
||||||
|
+ return libraries, library_dirs, runtime_library_dirs
|
||||||
|
+
|
||||||
|
def preprocess(self, source, output_file=None, macros=None,
|
||||||
|
include_dirs=None, extra_preargs=None, extra_postargs=None):
|
||||||
|
fixed_args = self._fix_compile_args(None, macros, include_dirs)
|
204
SOURCES/00251-change-user-install-location.patch
Normal file
204
SOURCES/00251-change-user-install-location.patch
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
|
||||||
|
Date: Mon, 15 Feb 2021 12:19:27 +0100
|
||||||
|
Subject: [PATCH] 00251: Change user install location
|
||||||
|
MIME-Version: 1.0
|
||||||
|
Content-Type: text/plain; charset=UTF-8
|
||||||
|
Content-Transfer-Encoding: 8bit
|
||||||
|
|
||||||
|
Set values of base and platbase in sysconfig from /usr
|
||||||
|
to /usr/local when RPM build is not detected
|
||||||
|
to make pip and similar tools install into separate location.
|
||||||
|
|
||||||
|
Set values of prefix and exec_prefix in distutils install command
|
||||||
|
to /usr/local if executable is /usr/bin/python* and RPM build
|
||||||
|
is not detected to make distutils and pypa/distutils install into separate location.
|
||||||
|
|
||||||
|
Fedora Change: https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
||||||
|
Downstream only.
|
||||||
|
|
||||||
|
We've tried to rework in Fedora 36/Python 3.10 to follow https://bugs.python.org/issue43976
|
||||||
|
but we have identified serious problems with that approach,
|
||||||
|
see https://bugzilla.redhat.com/2026979 or https://bugzilla.redhat.com/2097183
|
||||||
|
|
||||||
|
pypa/distutils integration: https://github.com/pypa/distutils/pull/70
|
||||||
|
|
||||||
|
Co-authored-by: Petr Viktorin <encukou@gmail.com>
|
||||||
|
Co-authored-by: Miro Hrončok <miro@hroncok.cz>
|
||||||
|
Co-authored-by: Michal Cyprian <m.cyprian@gmail.com>
|
||||||
|
Co-authored-by: Lumír Balhar <frenzy.madness@gmail.com>
|
||||||
|
---
|
||||||
|
Lib/distutils/command/install.py | 8 ++++--
|
||||||
|
Lib/site.py | 9 +++++-
|
||||||
|
Lib/sysconfig.py | 49 +++++++++++++++++++++++++++++++-
|
||||||
|
Lib/test/test_sysconfig.py | 17 +++++++++--
|
||||||
|
4 files changed, 77 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Lib/distutils/command/install.py b/Lib/distutils/command/install.py
|
||||||
|
index 01d5331a63..79f70f0de4 100644
|
||||||
|
--- a/Lib/distutils/command/install.py
|
||||||
|
+++ b/Lib/distutils/command/install.py
|
||||||
|
@@ -159,6 +159,8 @@ class install(Command):
|
||||||
|
|
||||||
|
negative_opt = {'no-compile' : 'compile'}
|
||||||
|
|
||||||
|
+ # Allow Fedora to add components to the prefix
|
||||||
|
+ _prefix_addition = getattr(sysconfig, '_prefix_addition', '')
|
||||||
|
|
||||||
|
def initialize_options(self):
|
||||||
|
"""Initializes options."""
|
||||||
|
@@ -441,8 +443,10 @@ def finalize_unix(self):
|
||||||
|
raise DistutilsOptionError(
|
||||||
|
"must not supply exec-prefix without prefix")
|
||||||
|
|
||||||
|
- self.prefix = os.path.normpath(sys.prefix)
|
||||||
|
- self.exec_prefix = os.path.normpath(sys.exec_prefix)
|
||||||
|
+ self.prefix = (
|
||||||
|
+ os.path.normpath(sys.prefix) + self._prefix_addition)
|
||||||
|
+ self.exec_prefix = (
|
||||||
|
+ os.path.normpath(sys.exec_prefix) + self._prefix_addition)
|
||||||
|
|
||||||
|
else:
|
||||||
|
if self.exec_prefix is None:
|
||||||
|
diff --git a/Lib/site.py b/Lib/site.py
|
||||||
|
index 69670d9d7f..104cb93899 100644
|
||||||
|
--- a/Lib/site.py
|
||||||
|
+++ b/Lib/site.py
|
||||||
|
@@ -377,8 +377,15 @@ def getsitepackages(prefixes=None):
|
||||||
|
return sitepackages
|
||||||
|
|
||||||
|
def addsitepackages(known_paths, prefixes=None):
|
||||||
|
- """Add site-packages to sys.path"""
|
||||||
|
+ """Add site-packages to sys.path
|
||||||
|
+
|
||||||
|
+ '/usr/local' is included in PREFIXES if RPM build is not detected
|
||||||
|
+ to make packages installed into this location visible.
|
||||||
|
+
|
||||||
|
+ """
|
||||||
|
_trace("Processing global site-packages")
|
||||||
|
+ if ENABLE_USER_SITE and 'RPM_BUILD_ROOT' not in os.environ:
|
||||||
|
+ PREFIXES.insert(0, "/usr/local")
|
||||||
|
for sitedir in getsitepackages(prefixes):
|
||||||
|
if os.path.isdir(sitedir):
|
||||||
|
addsitedir(sitedir, known_paths)
|
||||||
|
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
|
||||||
|
index ebe3711827..55af57b335 100644
|
||||||
|
--- a/Lib/sysconfig.py
|
||||||
|
+++ b/Lib/sysconfig.py
|
||||||
|
@@ -103,6 +103,11 @@
|
||||||
|
else:
|
||||||
|
_INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['posix_venv']
|
||||||
|
|
||||||
|
+# For a brief period of time in the Fedora 36 life cycle,
|
||||||
|
+# this installation scheme existed and was documented in the release notes.
|
||||||
|
+# For backwards compatibility, we keep it here (at least on 3.10 and 3.11).
|
||||||
|
+_INSTALL_SCHEMES['rpm_prefix'] = _INSTALL_SCHEMES['posix_prefix']
|
||||||
|
+
|
||||||
|
|
||||||
|
# NOTE: site.py has copy of this function.
|
||||||
|
# Sync it when modify this function.
|
||||||
|
@@ -162,6 +167,19 @@ def joinuser(*args):
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
+# This is used by distutils.command.install in the stdlib
|
||||||
|
+# as well as pypa/distutils (e.g. bundled in setuptools).
|
||||||
|
+# The self.prefix value is set to sys.prefix + /local/
|
||||||
|
+# if neither RPM build nor virtual environment is
|
||||||
|
+# detected to make distutils install packages
|
||||||
|
+# into the separate location.
|
||||||
|
+# https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
||||||
|
+if (not (hasattr(sys, 'real_prefix') or
|
||||||
|
+ sys.prefix != sys.base_prefix) and
|
||||||
|
+ 'RPM_BUILD_ROOT' not in os.environ):
|
||||||
|
+ _prefix_addition = '/local'
|
||||||
|
+
|
||||||
|
+
|
||||||
|
_SCHEME_KEYS = ('stdlib', 'platstdlib', 'purelib', 'platlib', 'include',
|
||||||
|
'scripts', 'data')
|
||||||
|
|
||||||
|
@@ -258,11 +276,40 @@ def _extend_dict(target_dict, other_dict):
|
||||||
|
target_dict[key] = value
|
||||||
|
|
||||||
|
|
||||||
|
+_CONFIG_VARS_LOCAL = None
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+def _config_vars_local():
|
||||||
|
+ # This function returns the config vars with prefixes amended to /usr/local
|
||||||
|
+ # https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
||||||
|
+ global _CONFIG_VARS_LOCAL
|
||||||
|
+ if _CONFIG_VARS_LOCAL is None:
|
||||||
|
+ _CONFIG_VARS_LOCAL = dict(get_config_vars())
|
||||||
|
+ _CONFIG_VARS_LOCAL['base'] = '/usr/local'
|
||||||
|
+ _CONFIG_VARS_LOCAL['platbase'] = '/usr/local'
|
||||||
|
+ return _CONFIG_VARS_LOCAL
|
||||||
|
+
|
||||||
|
+
|
||||||
|
def _expand_vars(scheme, vars):
|
||||||
|
res = {}
|
||||||
|
if vars is None:
|
||||||
|
vars = {}
|
||||||
|
- _extend_dict(vars, get_config_vars())
|
||||||
|
+
|
||||||
|
+ # when we are not in a virtual environment or an RPM build
|
||||||
|
+ # we change '/usr' to '/usr/local'
|
||||||
|
+ # to avoid surprises, we explicitly check for the /usr/ prefix
|
||||||
|
+ # Python virtual environments have different prefixes
|
||||||
|
+ # we only do this for posix_prefix, not to mangle the venv scheme
|
||||||
|
+ # posix_prefix is used by sudo pip install
|
||||||
|
+ # we only change the defaults here, so explicit --prefix will take precedence
|
||||||
|
+ # https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
||||||
|
+ if (scheme == 'posix_prefix' and
|
||||||
|
+ _PREFIX == '/usr' and
|
||||||
|
+ 'RPM_BUILD_ROOT' not in os.environ):
|
||||||
|
+ _extend_dict(vars, _config_vars_local())
|
||||||
|
+ else:
|
||||||
|
+ _extend_dict(vars, get_config_vars())
|
||||||
|
+
|
||||||
|
if os.name == 'nt':
|
||||||
|
# On Windows we want to substitute 'lib' for schemes rather
|
||||||
|
# than the native value (without modifying vars, in case it
|
||||||
|
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
|
||||||
|
index d96371d242..72b028435f 100644
|
||||||
|
--- a/Lib/test/test_sysconfig.py
|
||||||
|
+++ b/Lib/test/test_sysconfig.py
|
||||||
|
@@ -111,8 +111,19 @@ def test_get_path(self):
|
||||||
|
for scheme in _INSTALL_SCHEMES:
|
||||||
|
for name in _INSTALL_SCHEMES[scheme]:
|
||||||
|
expected = _INSTALL_SCHEMES[scheme][name].format(**config_vars)
|
||||||
|
+ tested = get_path(name, scheme)
|
||||||
|
+ # https://fedoraproject.org/wiki/Changes/Making_sudo_pip_safe
|
||||||
|
+ if tested.startswith('/usr/local'):
|
||||||
|
+ # /usr/local should only be used in posix_prefix
|
||||||
|
+ self.assertEqual(scheme, 'posix_prefix')
|
||||||
|
+ # Fedora CI runs tests for venv and virtualenv that check for other prefixes
|
||||||
|
+ self.assertEqual(sys.prefix, '/usr')
|
||||||
|
+ # When building the RPM of Python, %check runs this with RPM_BUILD_ROOT set
|
||||||
|
+ # Fedora CI runs this with RPM_BUILD_ROOT unset
|
||||||
|
+ self.assertNotIn('RPM_BUILD_ROOT', os.environ)
|
||||||
|
+ tested = tested.replace('/usr/local', '/usr')
|
||||||
|
self.assertEqual(
|
||||||
|
- os.path.normpath(get_path(name, scheme)),
|
||||||
|
+ os.path.normpath(tested),
|
||||||
|
os.path.normpath(expected),
|
||||||
|
)
|
||||||
|
|
||||||
|
@@ -336,7 +347,7 @@ def test_get_config_h_filename(self):
|
||||||
|
self.assertTrue(os.path.isfile(config_h), config_h)
|
||||||
|
|
||||||
|
def test_get_scheme_names(self):
|
||||||
|
- wanted = ['nt', 'posix_home', 'posix_prefix', 'posix_venv', 'nt_venv', 'venv']
|
||||||
|
+ wanted = ['nt', 'posix_home', 'posix_prefix', 'posix_venv', 'nt_venv', 'venv', 'rpm_prefix']
|
||||||
|
if HAS_USER_BASE:
|
||||||
|
wanted.extend(['nt_user', 'osx_framework_user', 'posix_user'])
|
||||||
|
self.assertEqual(get_scheme_names(), tuple(sorted(wanted)))
|
||||||
|
@@ -348,6 +359,8 @@ def test_symlink(self): # Issue 7880
|
||||||
|
cmd = "-c", "import sysconfig; print(sysconfig.get_platform())"
|
||||||
|
self.assertEqual(py.call_real(*cmd), py.call_link(*cmd))
|
||||||
|
|
||||||
|
+ @unittest.skipIf('RPM_BUILD_ROOT' not in os.environ,
|
||||||
|
+ "Test doesn't expect Fedora's paths")
|
||||||
|
def test_user_similar(self):
|
||||||
|
# Issue #8759: make sure the posix scheme for the users
|
||||||
|
# is similar to the global posix_prefix one
|
54
SOURCES/00328-pyc-timestamp-invalidation-mode.patch
Normal file
54
SOURCES/00328-pyc-timestamp-invalidation-mode.patch
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= <miro@hroncok.cz>
|
||||||
|
Date: Thu, 11 Jul 2019 13:44:13 +0200
|
||||||
|
Subject: [PATCH] 00328: Restore pyc to TIMESTAMP invalidation mode as default
|
||||||
|
in rpmbuild
|
||||||
|
|
||||||
|
Since Fedora 31, the $SOURCE_DATE_EPOCH is set in rpmbuild to the latest
|
||||||
|
%changelog date. This makes Python default to the CHECKED_HASH pyc
|
||||||
|
invalidation mode, bringing more reproducible builds traded for an import
|
||||||
|
performance decrease. To avoid that, we don't default to CHECKED_HASH
|
||||||
|
when $RPM_BUILD_ROOT is set (i.e. when we are building RPM packages).
|
||||||
|
|
||||||
|
See https://src.fedoraproject.org/rpms/redhat-rpm-config/pull-request/57#comment-27426
|
||||||
|
Downstream only: only used when building RPM packages
|
||||||
|
Ideally, we should talk to upstream and explain why we don't want this
|
||||||
|
---
|
||||||
|
Lib/py_compile.py | 3 ++-
|
||||||
|
Lib/test/test_py_compile.py | 2 ++
|
||||||
|
2 files changed, 4 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/Lib/py_compile.py b/Lib/py_compile.py
|
||||||
|
index 388614e51b..db52725016 100644
|
||||||
|
--- a/Lib/py_compile.py
|
||||||
|
+++ b/Lib/py_compile.py
|
||||||
|
@@ -70,7 +70,8 @@ class PycInvalidationMode(enum.Enum):
|
||||||
|
|
||||||
|
|
||||||
|
def _get_default_invalidation_mode():
|
||||||
|
- if os.environ.get('SOURCE_DATE_EPOCH'):
|
||||||
|
+ if (os.environ.get('SOURCE_DATE_EPOCH') and not
|
||||||
|
+ os.environ.get('RPM_BUILD_ROOT')):
|
||||||
|
return PycInvalidationMode.CHECKED_HASH
|
||||||
|
else:
|
||||||
|
return PycInvalidationMode.TIMESTAMP
|
||||||
|
diff --git a/Lib/test/test_py_compile.py b/Lib/test/test_py_compile.py
|
||||||
|
index a4a52b180d..e53f5d92aa 100644
|
||||||
|
--- a/Lib/test/test_py_compile.py
|
||||||
|
+++ b/Lib/test/test_py_compile.py
|
||||||
|
@@ -19,6 +19,7 @@ def without_source_date_epoch(fxn):
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
with os_helper.EnvironmentVarGuard() as env:
|
||||||
|
env.unset('SOURCE_DATE_EPOCH')
|
||||||
|
+ env.unset('RPM_BUILD_ROOT')
|
||||||
|
return fxn(*args, **kwargs)
|
||||||
|
return wrapper
|
||||||
|
|
||||||
|
@@ -29,6 +30,7 @@ def with_source_date_epoch(fxn):
|
||||||
|
def wrapper(*args, **kwargs):
|
||||||
|
with os_helper.EnvironmentVarGuard() as env:
|
||||||
|
env['SOURCE_DATE_EPOCH'] = '123456789'
|
||||||
|
+ env.unset('RPM_BUILD_ROOT')
|
||||||
|
return fxn(*args, **kwargs)
|
||||||
|
return wrapper
|
||||||
|
|
1189
SOURCES/00329-fips.patch
Normal file
1189
SOURCES/00329-fips.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,103 @@
|
|||||||
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||||||
|
From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hrn=C4=8Diar?= <thrnciar@redhat.com>
|
||||||
|
Date: Tue, 7 Dec 2021 14:41:59 +0100
|
||||||
|
Subject: [PATCH] 00371: Revert "bpo-1596321: Fix threading._shutdown() for the
|
||||||
|
main thread (GH-28549) (GH-28589)"
|
||||||
|
|
||||||
|
This reverts commit 38c67738c64304928c68d5c2bd78bbb01d979b94. It
|
||||||
|
introduced regression causing FreeIPA's tests to fail.
|
||||||
|
|
||||||
|
For more info see:
|
||||||
|
https://bodhi.fedoraproject.org/updates/FEDORA-2021-e152ce5f31
|
||||||
|
https://github.com/GrahamDumpleton/mod_wsgi/issues/730
|
||||||
|
---
|
||||||
|
Lib/test/test_threading.py | 33 ---------------------------------
|
||||||
|
Lib/threading.py | 25 ++++++++-----------------
|
||||||
|
2 files changed, 8 insertions(+), 50 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py
|
||||||
|
index 9c6561c099..84714c03fe 100644
|
||||||
|
--- a/Lib/test/test_threading.py
|
||||||
|
+++ b/Lib/test/test_threading.py
|
||||||
|
@@ -956,39 +956,6 @@ def test_debug_deprecation(self):
|
||||||
|
b'is deprecated and will be removed in Python 3.12')
|
||||||
|
self.assertIn(msg, err)
|
||||||
|
|
||||||
|
- def test_import_from_another_thread(self):
|
||||||
|
- # bpo-1596321: If the threading module is first import from a thread
|
||||||
|
- # different than the main thread, threading._shutdown() must handle
|
||||||
|
- # this case without logging an error at Python exit.
|
||||||
|
- code = textwrap.dedent('''
|
||||||
|
- import _thread
|
||||||
|
- import sys
|
||||||
|
-
|
||||||
|
- event = _thread.allocate_lock()
|
||||||
|
- event.acquire()
|
||||||
|
-
|
||||||
|
- def import_threading():
|
||||||
|
- import threading
|
||||||
|
- event.release()
|
||||||
|
-
|
||||||
|
- if 'threading' in sys.modules:
|
||||||
|
- raise Exception('threading is already imported')
|
||||||
|
-
|
||||||
|
- _thread.start_new_thread(import_threading, ())
|
||||||
|
-
|
||||||
|
- # wait until the threading module is imported
|
||||||
|
- event.acquire()
|
||||||
|
- event.release()
|
||||||
|
-
|
||||||
|
- if 'threading' not in sys.modules:
|
||||||
|
- raise Exception('threading is not imported')
|
||||||
|
-
|
||||||
|
- # don't wait until the thread completes
|
||||||
|
- ''')
|
||||||
|
- rc, out, err = assert_python_ok("-c", code)
|
||||||
|
- self.assertEqual(out, b'')
|
||||||
|
- self.assertEqual(err, b'')
|
||||||
|
-
|
||||||
|
|
||||||
|
class ThreadJoinOnShutdown(BaseTestCase):
|
||||||
|
|
||||||
|
diff --git a/Lib/threading.py b/Lib/threading.py
|
||||||
|
index 4f72938551..18c10e6489 100644
|
||||||
|
--- a/Lib/threading.py
|
||||||
|
+++ b/Lib/threading.py
|
||||||
|
@@ -1546,29 +1546,20 @@ def _shutdown():
|
||||||
|
|
||||||
|
global _SHUTTING_DOWN
|
||||||
|
_SHUTTING_DOWN = True
|
||||||
|
+ # Main thread
|
||||||
|
+ tlock = _main_thread._tstate_lock
|
||||||
|
+ # The main thread isn't finished yet, so its thread state lock can't have
|
||||||
|
+ # been released.
|
||||||
|
+ assert tlock is not None
|
||||||
|
+ assert tlock.locked()
|
||||||
|
+ tlock.release()
|
||||||
|
+ _main_thread._stop()
|
||||||
|
|
||||||
|
# Call registered threading atexit functions before threads are joined.
|
||||||
|
# Order is reversed, similar to atexit.
|
||||||
|
for atexit_call in reversed(_threading_atexits):
|
||||||
|
atexit_call()
|
||||||
|
|
||||||
|
- # Main thread
|
||||||
|
- if _main_thread.ident == get_ident():
|
||||||
|
- tlock = _main_thread._tstate_lock
|
||||||
|
- # The main thread isn't finished yet, so its thread state lock can't
|
||||||
|
- # have been released.
|
||||||
|
- assert tlock is not None
|
||||||
|
- assert tlock.locked()
|
||||||
|
- tlock.release()
|
||||||
|
- _main_thread._stop()
|
||||||
|
- else:
|
||||||
|
- # bpo-1596321: _shutdown() must be called in the main thread.
|
||||||
|
- # If the threading module was not imported by the main thread,
|
||||||
|
- # _main_thread is the thread which imported the threading module.
|
||||||
|
- # In this case, ignore _main_thread, similar behavior than for threads
|
||||||
|
- # spawned by C libraries or using _thread.start_new_thread().
|
||||||
|
- pass
|
||||||
|
-
|
||||||
|
# Join all non-deamon threads
|
||||||
|
while True:
|
||||||
|
with _shutdown_locks_lock:
|
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
SOURCES/Python-3.11.2.tar.xz.asc
Normal file
16
SOURCES/Python-3.11.2.tar.xz.asc
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQIzBAABCAAdFiEEz9yiRbEEPPKl+Xhl/+h0BBaL2EcFAmPiV84ACgkQ/+h0BBaL
|
||||||
|
2EeZ1xAAwBi0AEjUlZ9oeC54VuqC/XLuVwc3xWf+Irw/5mJA2/weJHoQqG9aEDkB
|
||||||
|
ph1pDJ6G/vDyKdjh8NZKkKftIL9pggRpAcA4mQ3XcDMKI/J+EQe5P/BwsTGClLhK
|
||||||
|
cZg6IcQKZvo9djfyRz48w9wfKs34NasBgoFQP+hOzmU10UMrcR7gUSB2ZgMVMDID
|
||||||
|
0rK1w2aPmZmDLUltBhf6Xb2voUYo+3jINLHWmQC6tdDOBxtxv222dhxS1mvpV7Zu
|
||||||
|
Xw8do9OsQxonc+owkpciMKDLcFoVmkdQPz9bmvHJKovMXT2RY7FEam9H7ukr35fC
|
||||||
|
xA6BKnyMgvWIWQVTwjBhcz3C85adzAz/ypHNTbJOuPxp1ZP8qO3D6vPlhZIFyTeJ
|
||||||
|
7LhagUBUkIKKtbz7u3ERJgvA6tn3UVyLOXM1DnaKkXQ1FgSymgWPRU7BsxanQ8FD
|
||||||
|
QkfTjC8fatZLCewNfGInkeAdLue+rMwZc8Q6vw2CAmcVdOKsQ98Db/FLF5sC+Kjz
|
||||||
|
D3brUESEX1ELcVk7vumUI0/z+MECF11dpv5hPOZ4cZDoInsNu846TfU0rzOeVe7H
|
||||||
|
gGO6Ae/Lu5gG09TNqepbFGA/dWR8V3zdLs5ZShTT4FsNFrHh7GDAEAMZSwT3AsVZ
|
||||||
|
TjOdU3+xEGsEfrYWRXOkhVIQdJtuovwv9+me5YWeyC4Puzp0Zwk=
|
||||||
|
=8/cW
|
||||||
|
-----END PGP SIGNATURE-----
|
55
SOURCES/check-pyc-timestamps.py
Normal file
55
SOURCES/check-pyc-timestamps.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
"""Checks if all *.pyc files have later mtime than their *.py files."""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
from importlib.util import cache_from_source
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
RPM_BUILD_ROOT = os.environ.get('RPM_BUILD_ROOT', '')
|
||||||
|
|
||||||
|
# ...cpython-3X.pyc
|
||||||
|
# ...cpython-3X.opt-1.pyc
|
||||||
|
# ...cpython-3X.opt-2.pyc
|
||||||
|
LEVELS = (None, 1, 2)
|
||||||
|
|
||||||
|
# list of globs of test and other files that we expect not to have bytecode
|
||||||
|
not_compiled = [
|
||||||
|
'/usr/bin/*',
|
||||||
|
'*/test/bad_coding.py',
|
||||||
|
'*/test/bad_coding2.py',
|
||||||
|
'*/test/badsyntax_*.py',
|
||||||
|
'*/lib2to3/tests/data/bom.py',
|
||||||
|
'*/lib2to3/tests/data/crlf.py',
|
||||||
|
'*/lib2to3/tests/data/different_encoding.py',
|
||||||
|
'*/lib2to3/tests/data/false_encoding.py',
|
||||||
|
'*/lib2to3/tests/data/py2_test_grammar.py',
|
||||||
|
'*.debug-gdb.py',
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def bytecode_expected(path):
|
||||||
|
path = Path(path[len(RPM_BUILD_ROOT):])
|
||||||
|
for glob in not_compiled:
|
||||||
|
if path.match(glob):
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
failed = 0
|
||||||
|
compiled = (path for path in sys.argv[1:] if bytecode_expected(path))
|
||||||
|
for path in compiled:
|
||||||
|
to_check = (cache_from_source(path, optimization=opt) for opt in LEVELS)
|
||||||
|
f_mtime = os.path.getmtime(path)
|
||||||
|
for pyc in to_check:
|
||||||
|
c_mtime = os.path.getmtime(pyc)
|
||||||
|
if c_mtime < f_mtime:
|
||||||
|
print('Failed bytecompilation timestamps check: '
|
||||||
|
f'Bytecode file {pyc} is older than source file {path}',
|
||||||
|
file=sys.stderr)
|
||||||
|
failed += 1
|
||||||
|
|
||||||
|
if failed:
|
||||||
|
print(f'\n{failed} files failed bytecompilation timestamps check.',
|
||||||
|
file=sys.stderr)
|
||||||
|
sys.exit(1)
|
35
SOURCES/idle3.appdata.xml
Normal file
35
SOURCES/idle3.appdata.xml
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
|
||||||
|
<!-- Copyright 2017 Zbigniew Jędrzejewski-Szmek -->
|
||||||
|
<application>
|
||||||
|
<id type="desktop">idle3.desktop</id>
|
||||||
|
<name>IDLE3</name>
|
||||||
|
<metadata_licence>CC0</metadata_licence>
|
||||||
|
<project_license>Python-2.0</project_license>
|
||||||
|
<summary>Python 3 Integrated Development and Learning Environment</summary>
|
||||||
|
<description>
|
||||||
|
<p>
|
||||||
|
IDLE is Python’s Integrated Development and Learning Environment.
|
||||||
|
The GUI is uniform between Windows, Unix, and Mac OS X.
|
||||||
|
IDLE provides an easy way to start writing, running, and debugging
|
||||||
|
Python code.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
IDLE is written in pure Python, and uses the tkinter GUI toolkit.
|
||||||
|
It provides:
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>a Python shell window (interactive interpreter) with colorizing of code input, output, and error messages,</li>
|
||||||
|
<li>a multi-window text editor with multiple undo, Python colorizing, smart indent, call tips, auto completion, and other features,</li>
|
||||||
|
<li>search within any window, replace within editor windows, and search through multiple files (grep),</li>
|
||||||
|
<li>a debugger with persistent breakpoints, stepping, and viewing of global and local namespaces.</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
<url type="homepage">https://docs.python.org/3/library/idle.html</url>
|
||||||
|
<screenshots>
|
||||||
|
<screenshot type="default">http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-main-window.png</screenshot>
|
||||||
|
<screenshot>http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-class-browser.png</screenshot>
|
||||||
|
<screenshot>http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-code-viewer.png</screenshot>
|
||||||
|
</screenshots>
|
||||||
|
<update_contact>zbyszek@in.waw.pl</update_contact>
|
||||||
|
</application>
|
11
SOURCES/idle3.desktop
Normal file
11
SOURCES/idle3.desktop
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Version=1.0
|
||||||
|
Name=IDLE 3
|
||||||
|
Comment=Python 3 Integrated Development and Learning Environment
|
||||||
|
Exec=idle3 %F
|
||||||
|
TryExec=idle3
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
Icon=idle3
|
||||||
|
Categories=Development;IDE;
|
||||||
|
MimeType=text/x-python;
|
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.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}
|
1862
SPECS/python3.11.spec
Normal file
1862
SPECS/python3.11.spec
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user