From 6d5b19dbfec6848d416e7d3214d9f378e7c0e4fe8944b226de66a4c749923f7c Mon Sep 17 00:00:00 2001 From: Matej Cepl Date: Fri, 24 Oct 2025 22:34:15 +0000 Subject: [PATCH] OBS-URL: https://build.opensuse.org/package/show/devel:languages:python:Factory/python315?expand=0&rev=2 --- .gitattributes | 23 + .gitignore | 1 + ...3-52425-libexpat-2.6.0-backport-15.6.patch | 73 + F00251-change-user-install-location.patch | 160 + PACKAGING-NOTES | 26 + Python-3.14.0.tar.xz | 3 + Python-3.14.0.tar.xz.sigstore | 1 + README.SUSE | 43 + _multibuild | 6 + baselibs.conf | 3 + bluez-devel-vendor.tar.xz | 3 + bpo-31046_ensurepip_honours_prefix.patch | 175 + bsc1243155-sphinx-non-determinism.patch | 45 + externally_managed.in | 12 + fix-test-recursion-limit-15.6.patch | 34 + gh138131-exclude-pycache-from-digest.patch | 30 + gh139257-Support-docutils-0.22.patch | 36 + idle3.appdata.xml | 35 + idle3.desktop | 12 + import_failed.map | 7 + import_failed.py | 23 + macros.python3 | 28 + pre_checkin.sh | 78 + python-3.3.0b1-fix_date_time_compiler.patch | 20 + python-3.3.0b1-localpath.patch | 15 + python314-rpmlintrc | 3 + python314.changes | 12030 ++++++++++++++++ python314.spec | 1159 ++ skip-test_pyobject_freed_is_freed.patch | 16 + skipped_tests.py | 69 + subprocess-raise-timeout.patch | 21 + 31 files changed, 14190 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 CVE-2023-52425-libexpat-2.6.0-backport-15.6.patch create mode 100644 F00251-change-user-install-location.patch create mode 100644 PACKAGING-NOTES create mode 100644 Python-3.14.0.tar.xz create mode 100644 Python-3.14.0.tar.xz.sigstore create mode 100644 README.SUSE create mode 100644 _multibuild create mode 100644 baselibs.conf create mode 100644 bluez-devel-vendor.tar.xz create mode 100644 bpo-31046_ensurepip_honours_prefix.patch create mode 100644 bsc1243155-sphinx-non-determinism.patch create mode 100644 externally_managed.in create mode 100644 fix-test-recursion-limit-15.6.patch create mode 100644 gh138131-exclude-pycache-from-digest.patch create mode 100644 gh139257-Support-docutils-0.22.patch create mode 100644 idle3.appdata.xml create mode 100644 idle3.desktop create mode 100644 import_failed.map create mode 100644 import_failed.py create mode 100644 macros.python3 create mode 100644 pre_checkin.sh create mode 100644 python-3.3.0b1-fix_date_time_compiler.patch create mode 100644 python-3.3.0b1-localpath.patch create mode 100644 python314-rpmlintrc create mode 100644 python314.changes create mode 100644 python314.spec create mode 100644 skip-test_pyobject_freed_is_freed.patch create mode 100644 skipped_tests.py create mode 100644 subprocess-raise-timeout.patch diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57affb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.osc diff --git a/CVE-2023-52425-libexpat-2.6.0-backport-15.6.patch b/CVE-2023-52425-libexpat-2.6.0-backport-15.6.patch new file mode 100644 index 0000000..767e62c --- /dev/null +++ b/CVE-2023-52425-libexpat-2.6.0-backport-15.6.patch @@ -0,0 +1,73 @@ +--- + Lib/test/test_pyexpat.py | 4 ++++ + Lib/test/test_sax.py | 3 +++ + Lib/test/test_xml_etree.py | 10 ++++++++++ + 3 files changed, 17 insertions(+) + +Index: Python-3.14.0/Lib/test/test_pyexpat.py +=================================================================== +--- Python-3.14.0.orig/Lib/test/test_pyexpat.py 2025-10-08 11:27:29.989583305 +0200 ++++ Python-3.14.0/Lib/test/test_pyexpat.py 2025-10-08 11:28:09.418914658 +0200 +@@ -827,6 +827,10 @@ + self.assertEqual(started, ['doc']) + + def test_reparse_deferral_disabled(self): ++ if expat.version_info < (2, 6, 0): ++ self.skipTest(f'Expat {expat.version_info} does not ' ++ 'support reparse deferral') ++ + started = [] + + def start_element(name, _): +Index: Python-3.14.0/Lib/test/test_sax.py +=================================================================== +--- Python-3.14.0.orig/Lib/test/test_sax.py 2025-10-08 11:27:30.053760879 +0200 ++++ Python-3.14.0/Lib/test/test_sax.py 2025-10-08 11:28:09.419532320 +0200 +@@ -1241,6 +1241,9 @@ + + self.assertEqual(result.getvalue(), start + b"") + ++ @unittest.skipIf(pyexpat.version_info < (2, 6, 0), ++ f'Expat {pyexpat.version_info} does not ' ++ 'support reparse deferral') + def test_flush_reparse_deferral_disabled(self): + result = BytesIO() + xmlgen = XMLGenerator(result) +Index: Python-3.14.0/Lib/test/test_xml_etree.py +=================================================================== +--- Python-3.14.0.orig/Lib/test/test_xml_etree.py 2025-10-08 11:27:30.502943506 +0200 ++++ Python-3.14.0/Lib/test/test_xml_etree.py 2025-10-08 11:28:09.420206077 +0200 +@@ -138,6 +138,11 @@ + return mock.patch.object(cls, "__eq__", autospec=True, wraps=eq) + + ++IS_SLE_15_7 = os.environ.get("SLE_VERSION", "") == "0150700" ++fails_with_expat_2_6_0 = (unittest.expectedFailure ++ # 2.4 version patched in SLE ++ if IS_SLE_15_7 and pyexpat.version_info >= (2, 4, 0) else ++ lambda test: test) + def checkwarnings(*filters, quiet=False): + def decorator(test): + def newtest(*args, **kwargs): +@@ -1547,9 +1552,11 @@ + self.assert_event_tags(parser, [('end', 'root')]) + self.assertIsNone(parser.close()) + ++ @fails_with_expat_2_6_0 + def test_simple_xml_chunk_1(self): + self.test_simple_xml(chunk_size=1, flush=True) + ++ @fails_with_expat_2_6_0 + def test_simple_xml_chunk_5(self): + self.test_simple_xml(chunk_size=5, flush=True) + +@@ -1774,6 +1781,9 @@ + + self.assert_event_tags(parser, [('end', 'doc')]) + ++ @unittest.skipIf(pyexpat.version_info < (2, 6, 0), ++ f'Expat {pyexpat.version_info} does not ' ++ 'support reparse deferral') + def test_flush_reparse_deferral_disabled(self): + parser = ET.XMLPullParser(events=('start', 'end')) + diff --git a/F00251-change-user-install-location.patch b/F00251-change-user-install-location.patch new file mode 100644 index 0000000..80d80c1 --- /dev/null +++ b/F00251-change-user-install-location.patch @@ -0,0 +1,160 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Miro=20Hron=C4=8Dok?= +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. + +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 +Co-authored-by: Miro Hrončok +Co-authored-by: Michal Cyprian +Co-authored-by: Lumír Balhar +--- + Lib/sysconfig/__init__.py | 51 ++++++++++++++++++++++++++++++++++++++++++++- + Lib/test/test_sysconfig.py | 17 +++++++++++++-- + 2 files changed, 65 insertions(+), 3 deletions(-) + +Index: Python-3.14.0/Lib/sysconfig/__init__.py +=================================================================== +--- Python-3.14.0.orig/Lib/sysconfig/__init__.py 2025-10-08 11:27:28.335887277 +0200 ++++ Python-3.14.0/Lib/sysconfig/__init__.py 2025-10-08 11:28:00.652215416 +0200 +@@ -106,6 +106,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'] ++ + def _get_implementation(): + return 'Python' + +@@ -169,13 +174,28 @@ + }, + } + ++# 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') + + _PY_VERSION = sys.version.split()[0] + _PY_VERSION_SHORT = f'{sys.version_info[0]}.{sys.version_info[1]}' + _PY_VERSION_SHORT_NO_DOT = f'{sys.version_info[0]}{sys.version_info[1]}' ++_PREFIX = os.path.normpath(sys.prefix) + _BASE_PREFIX = os.path.normpath(sys.base_prefix) ++_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) + _BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix) + # Mutex guarding initialization of _CONFIG_VARS. + _CONFIG_VARS_LOCK = threading.RLock() +@@ -268,11 +288,40 @@ + 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 +Index: Python-3.14.0/Lib/test/test_sysconfig.py +=================================================================== +--- Python-3.14.0.orig/Lib/test/test_sysconfig.py 2025-10-08 11:27:30.181651013 +0200 ++++ Python-3.14.0/Lib/test/test_sysconfig.py 2025-10-08 11:28:00.653226898 +0200 +@@ -132,8 +132,19 @@ + 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), + ) + +@@ -395,7 +406,7 @@ + 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))) +@@ -407,6 +418,8 @@ + 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 diff --git a/PACKAGING-NOTES b/PACKAGING-NOTES new file mode 100644 index 0000000..e28c88c --- /dev/null +++ b/PACKAGING-NOTES @@ -0,0 +1,26 @@ +Notes for packagers of Python3 +============================== + +0. Faster build turnaround +-------------------------- + +By default, python builds with profile-guided optimization. This needs +an additional run of the test suite and it is generally slow. +PGO build takes around 50 minutes. + +For development, use "--without profileopt" option to disable PGO. This +shortens the build time to ~5 minutes including test suite. + +1. import_failed.map +---------------------- + +This is a mechanism installed as part of python3-base, that places shim modules +on python's path (through a generated zzzz-import-failed-hooks.pth file, so that +it is imported as much at the end as makes sense; and an _import_failed subdir +of /usr/lib/pythonX.Y). Then when the user tries to import a module that is part +of a subpackage, the ImportError will contain a helpful message telling them +which missing subpackage to install. + +This can sometimes cause problems on non-standard configurations, if the pth +gets included too early (for instance if you are using a script to include all +pths by hand in some strange order). Just something to look out for. diff --git a/Python-3.14.0.tar.xz b/Python-3.14.0.tar.xz new file mode 100644 index 0000000..7b2299a --- /dev/null +++ b/Python-3.14.0.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2299dae542d395ce3883aca00d3c910307cd68e0b2f7336098c8e7b7eee9f3e9 +size 23595844 diff --git a/Python-3.14.0.tar.xz.sigstore b/Python-3.14.0.tar.xz.sigstore new file mode 100644 index 0000000..2ebe860 --- /dev/null +++ b/Python-3.14.0.tar.xz.sigstore @@ -0,0 +1 @@ +{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzjCCAlOgAwIBAgIUaFNOs99+mdUwhWuy93hUKegEDvowCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUxMDA3MTQxNjE4WhcNMjUxMDA3MTQyNjE4WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEB4Zs7yR5znQ3xOtA7ekHhkbjmt11y4B0kYTAt5K3MmjxgyQ/FOzoGbiNgP1p76I5OFwbECeL6RtxqjSwJPoj9aOCAXIwggFuMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQU6Jy2V0oQb2tmHwImrQplvua+1WkwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHQYDVR0RAQH/BBMwEYEPaHVnb0BweXRob24ub3JnMCwGCisGAQQBg78wAQEEHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDAuBgorBgEEAYO/MAEIBCAMHmh0dHBzOi8vZ2l0aHViLmNvbS9sb2dpbi9vYXV0aDCBiQYKKwYBBAHWeQIEAgR7BHkAdwB1AN09MGrGxxEyYxkeHJlnNwKiSl643jyt/4eKcoAvKe6OAAABmb8HuYwAAAQDAEYwRAIgZd3lZo6EQ8hFKJ1SnKnh/pOXyLVUxesmKPdZLI/IddsCIHbkeFmcOlHbGXvzusuMaF7GDoHgfjCRXvFE1kPVSPdUMAoGCCqGSM49BAMDA2kAMGYCMQCF3LWgo5EPOs6y59yMkN8HDY/PuX+rch7scxcXUR8K+6BNw1dS8i1nGRkIvE/ttF8CMQCG6z4lu2ekjwZBMx69OmDsUlrQjOvrxmWX3pbLh4Aam7sS25DCYvVFul4RmPg/sJg="}, "tlogEntries": [{"logIndex": "588222392", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1759846578", "inclusionPromise": {"signedEntryTimestamp": "MEQCIBS/mvM2EUceWygdN+NmnJMehkFY1fRkmVmmDNICfxWVAiAoN7Vofd2SVuJYSxO/onzd87/3bWNogJlDvI7uZSTR1Q=="}, "inclusionProof": {"logIndex": "466318130", "rootHash": "RcerGwX5+QIiZjrznmUlSGFvuGAq3RMLk/7Aj/T6M3I=", "treeSize": "466318146", "hashes": ["5uTZFkdYgFmKJJdqzeeKZfjnq5Mx9K0tDsF0fjJzkCk=", "RL5Hp6IOaxPi5M/m3s97bDoAnRux0/JBccJ4+/B1vro=", "JYAmi+fU2/Su8fHV3tfQcbY//eCoHsfd2H7O1hs6HIQ=", "BbdwHf9ld92J1gFR6vWH/Gv+L9YTGwWAQytyDm+6jYc=", "J0rXI11jq+mZyPMktZmo2UlHPQw0Wyl70FQBNujJJog=", "tcYxYlxPe1g09Dr+wGWIPrCmHuFjjjwqZ4gRokgj4zE=", "X0IhqC7U/8YmeUILMTYIvlKoBEAX3aFw3IWHNcfJifc=", "kQWzYHtEr0Vhaq6Z6v4TIiuia6GrJLKcYKs25NPvkms=", "WjmJ5Vrat53AbuDR9WjO4SQADjlfkyyq+bKkkBO984w=", "k9qNU1WjJDQJ+e4prrbcOORJ5aMBlkIBACMsgKoANg0=", "Z7pLmTcnciyz67VEWMgPwiokTg9JVUQWrPf+VS85VlA=", "y/7hUHbXERsQubPR1m2uvZSz3rFsW3d9dP51hoTyX/U=", "19j/ye5CX1xbsCqb7Xkr1O2BXIOAWPwZsn7TDtr6UVc=", "JVKPJjj8WVb6G2sYzX+4PL9fC+4qskYANlO6/TIjQsE=", "XTHRaE0cHDl9HYIIwtlwjCK2+pmMP8G2rv801RmA0U8=", "ujcC9wUGq4yMg4Sr83ZRaheYdJguBWXGhnp101NfbMo=", "Kcf5veFWCVXREqqw2Q7rOJD3ttDxBxePywSepmjiSGo=", "5J6N5aNEMk6YY8lPNH0zZx95RNICDJ12cMAmpwtvGTo=", "/buh7NyeUdCgJPdaMbTAtiQpMkNHhk+xMsI2shkTieM=", "1mfy94KpcItqshH9+gwqV6jccupcaMpVsF28New8zDY=", "vS7O4ozHIQZJWBiov+mkpI27GE8zAmVCEkRcP3NDyNE="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n466318146\nRcerGwX5+QIiZjrznmUlSGFvuGAq3RMLk/7Aj/T6M3I=\n\n\u2014 rekor.sigstore.dev wNI9ajBFAiEA9LofhlufYOpmdGvOuS7AvxT5koyDoOFWNEhobBt+UgYCICpTORyuqmFZWs8D1FJAry4ohDUWTSw3JegUDlUUtr3z\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIyMjk5ZGFlNTQyZDM5NWNlMzg4M2FjYTAwZDNjOTEwMzA3Y2Q2OGUwYjJmNzMzNjA5OGM4ZTdiN2VlZTlmM2U5In19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUNQWEhJOW9MdVNJL3RoVDg1ZXBkWlVWakh4d1M4OFpTTExLcjFmWnprWGJnSWdTUFY3ZnV1dytISGhCazljNGlBWGlCNVBJRWdMQ1kwTTVVaXNUM3h1QUcwPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZha05EUVd4UFowRjNTVUpCWjBsVllVWk9UM001T1N0dFpGVjNhRmQxZVRremFGVkxaV2RGUkhadmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZlRTFFUVROTlZGRjRUbXBGTkZkb1kwNU5hbFY0VFVSQk0wMVVVWGxPYWtVMFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZDTkZwek4zbFNOWHB1VVRONFQzUkJOMlZyU0doclltcHRkREV4ZVRSQ01HdFpWRUVLZERWTE0wMXRhbmhuZVZFdlJrOTZiMGRpYVU1blVERndOelpKTlU5R2QySkZRMlZNTmxKMGVIRnFVM2RLVUc5cU9XRlBRMEZZU1hkblowWjFUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlUyU25reUNsWXdiMUZpTW5SdFNIZEpiWEpSY0d4MmRXRXJNVmRyZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoUldVUldVakJTUVZGSUwwSkNUWGRGV1VWUVlVaFdibUl3UW5kbFdGSnZZakkwZFdJelNtNU5RM2RIUTJselIwRlJVVUpuTnpoM1FWRkZSUXBJYldnd1pFaENlazlwT0haYU1td3dZVWhXYVV4dFRuWmlVemx6WWpKa2NHSnBPWFpaV0ZZd1lVUkJkVUpuYjNKQ1owVkZRVmxQTDAxQlJVbENRMEZOQ2todGFEQmtTRUo2VDJrNGRsb3liREJoU0ZacFRHMU9kbUpUT1hOaU1tUndZbWs1ZGxsWVZqQmhSRU5DYVZGWlMwdDNXVUpDUVVoWFpWRkpSVUZuVWpjS1FraHJRV1IzUWpGQlRqQTVUVWR5UjNoNFJYbFplR3RsU0Vwc2JrNTNTMmxUYkRZME0ycDVkQzgwWlV0amIwRjJTMlUyVDBGQlFVSnRZamhJZFZsM1FRcEJRVkZFUVVWWmQxSkJTV2RhWkROc1dtODJSVkU0YUVaTFNqRlRia3R1YUM5d1QxaDVURlpWZUdWemJVdFFaRnBNU1M5SlpHUnpRMGxJWW10bFJtMWpDazlzU0dKSFdIWjZkWE4xVFdGR04wZEViMGhuWm1wRFVsaDJSa1V4YTFCV1UxQmtWVTFCYjBkRFEzRkhVMDAwT1VKQlRVUkJNbXRCVFVkWlEwMVJRMFlLTTB4WFoyODFSVkJQY3paNU5UbDVUV3RPT0VoRVdTOVFkVmdyY21Ob04zTmplR05ZVlZJNFN5czJRazUzTVdSVE9Ha3hia2RTYTBsMlJTOTBkRVk0UXdwTlVVTkhObm8wYkhVeVpXdHFkMXBDVFhnMk9VOXRSSE5WYkhKUmFrOTJjbmh0VjFnemNHSk1hRFJCWVcwM2MxTXlOVVJEV1haV1JuVnNORkp0VUdjdkNuTktaejBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}]}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "Ipna5ULTlc44g6ygDTyRAwfNaOCy9zNgmMjnt+7p8+k="}, "signature": "MEUCIQCPXHI9oLuSI/thT85epdZUVjHxwS88ZSLLKr1fZzkXbgIgSPV7fuuw+HHhBk9c4iAXiB5PIEgLCY0M5UisT3xuAG0="}} diff --git a/README.SUSE b/README.SUSE new file mode 100644 index 0000000..0053bcf --- /dev/null +++ b/README.SUSE @@ -0,0 +1,43 @@ +Python 3 in SUSE +============== + +* Subpackages * + +Python 3 is split into several subpackages, based on external dependencies. +The main package 'python3' has soft dependencies on all subpackages needed to +assemble the standard library; however, these might not all be installed by default. + +If you attempt to import a module that is currently not installed, an ImportError is thrown, +with instructions to install the missing subpackage. Installing the subpackage might result +in installing libraries that the subpackage requires to function. + + +* ensurepip * + +The 'ensurepip' module from Python 3 standard library (PEP 453) is supposed to deploy +a bundled copy of the pip installer. This makes no sense in a managed distribution like SUSE. +Instead, you need to install package 'python3-pip'. Usually this will be installed automatically +with 'python3'. + +Using 'ensurepip' when pip is not installed will result in an ImportError with instructions +to install 'python3-pip'. + + +* Documentation * + +You can find documentation in seprarate packages: python3-doc and +python3-doc-pdf. These contan following documents: + + Tutorial, What's New in Python, Global Module Index, Library Reference, + Macintosh Module Reference, Installing Python Modules, Distributing Python + Modules, Language Reference, Extending and Embedding, Python/C API, + Documenting Python + +The python3-doc package constains many text files from source tarball. + + +* Interactive mode * + +Interactive mode is by default enhanced with of history and command completion. +If you don't like these features, you can unset the PYTHONSTARTUP variable +in your .profile or disable it system wide in /etc/profile.d/python.sh. diff --git a/_multibuild b/_multibuild new file mode 100644 index 0000000..6fef3f5 --- /dev/null +++ b/_multibuild @@ -0,0 +1,6 @@ + + base + doc + nogil + nogil-base + diff --git a/baselibs.conf b/baselibs.conf new file mode 100644 index 0000000..d43116d --- /dev/null +++ b/baselibs.conf @@ -0,0 +1,3 @@ +python314-base +python314 +libpython3_14-1_0 diff --git a/bluez-devel-vendor.tar.xz b/bluez-devel-vendor.tar.xz new file mode 100644 index 0000000..bb4fd89 --- /dev/null +++ b/bluez-devel-vendor.tar.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4624c6ab6543ec4875bdd5c6c58c874d487128e44e54c8ef1924ec1d48e35928 +size 25328 diff --git a/bpo-31046_ensurepip_honours_prefix.patch b/bpo-31046_ensurepip_honours_prefix.patch new file mode 100644 index 0000000..a962e30 --- /dev/null +++ b/bpo-31046_ensurepip_honours_prefix.patch @@ -0,0 +1,175 @@ +From 5754521af1d51aa8e445cba07a093bbc0c88596d Mon Sep 17 00:00:00 2001 +From: Zackery Spytz +Date: Mon, 16 Dec 2019 18:24:08 -0700 +Subject: [PATCH] bpo-31046: ensurepip does not honour the value of $(prefix) + +Co-Authored-By: Xavier de Gaye +--- + Doc/library/ensurepip.rst | 12 +++++- + Lib/ensurepip/__init__.py | 18 +++++++--- + Lib/test/test_ensurepip.py | 11 ++++++ + Makefile.pre.in | 4 +- + Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst | 1 + 5 files changed, 37 insertions(+), 9 deletions(-) + create mode 100644 Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst + +Index: Python-3.14.0rc1/Doc/library/ensurepip.rst +=================================================================== +--- Python-3.14.0rc1.orig/Doc/library/ensurepip.rst 2025-07-22 18:42:44.000000000 +0200 ++++ Python-3.14.0rc1/Doc/library/ensurepip.rst 2025-07-23 10:10:31.690342385 +0200 +@@ -61,7 +61,11 @@ + By default, ``pip`` is installed into the current virtual environment + (if one is active) or into the system site packages (if there is no + active virtual environment). The installation location can be controlled +-through two additional command line options: ++through some additional command line options: ++ ++.. option:: --prefix ++ ++ Installs ``pip`` using the given directory prefix. + + .. option:: --root + +@@ -102,7 +106,7 @@ + Returns a string specifying the available version of pip that will be + installed when bootstrapping an environment. + +-.. function:: bootstrap(root=None, upgrade=False, user=False, \ ++.. function:: bootstrap(root=None, prefix=None, upgrade=False, user=False, \ + altinstall=False, default_pip=False, \ + verbosity=0) + +@@ -112,6 +116,8 @@ + If *root* is ``None``, then installation uses the default install location + for the current environment. + ++ *prefix* specifies the directory prefix to use when installing. ++ + *upgrade* indicates whether or not to upgrade an existing installation + of an earlier version of ``pip`` to the available version. + +@@ -132,6 +138,8 @@ + *verbosity* controls the level of output to :data:`sys.stdout` from the + bootstrapping operation. + ++ .. versionchanged:: 3.9 the *prefix* parameter was added. ++ + .. audit-event:: ensurepip.bootstrap root ensurepip.bootstrap + + .. note:: +Index: Python-3.14.0rc1/Lib/ensurepip/__init__.py +=================================================================== +--- Python-3.14.0rc1.orig/Lib/ensurepip/__init__.py 2025-07-23 10:10:18.541751619 +0200 ++++ Python-3.14.0rc1/Lib/ensurepip/__init__.py 2025-07-23 10:10:31.690818287 +0200 +@@ -106,27 +106,27 @@ + os.environ['PIP_CONFIG_FILE'] = os.devnull + + +-def bootstrap(*, root=None, upgrade=False, user=False, ++def bootstrap(*, root=None, prefix=None, upgrade=False, user=False, + altinstall=False, default_pip=False, + verbosity=0): + """ + Bootstrap pip into the current Python installation (or the given root +- directory). ++ and directory prefix). + + Note that calling this function will alter both sys.path and os.environ. + """ + # Discard the return value +- _bootstrap(root=root, upgrade=upgrade, user=user, ++ _bootstrap(root=root, prefix=prefix, upgrade=upgrade, user=user, + altinstall=altinstall, default_pip=default_pip, + verbosity=verbosity) + + +-def _bootstrap(*, root=None, upgrade=False, user=False, ++def _bootstrap(*, root=None, prefix=None, upgrade=False, user=False, + altinstall=False, default_pip=False, + verbosity=0): + """ + Bootstrap pip into the current Python installation (or the given root +- directory). Returns pip command status code. ++ and directory prefix). Returns pip command status code. + + Note that calling this function will alter both sys.path and os.environ. + """ +@@ -162,6 +162,8 @@ + args = ["install", "--no-cache-dir", "--no-index", "--find-links", tmpdir] + if root: + args += ["--root", root] ++ if prefix: ++ args += ["--prefix", prefix] + if upgrade: + args += ["--upgrade"] + if user: +@@ -238,6 +240,11 @@ + help="Install everything relative to this alternate root directory.", + ) + parser.add_argument( ++ "--prefix", ++ default=None, ++ help="Install everything using this prefix.", ++ ) ++ parser.add_argument( + "--altinstall", + action="store_true", + default=False, +@@ -256,6 +263,7 @@ + + return _bootstrap( + root=args.root, ++ prefix=args.prefix, + upgrade=args.upgrade, + user=args.user, + verbosity=args.verbosity, +Index: Python-3.14.0rc1/Lib/test/test_ensurepip.py +=================================================================== +--- Python-3.14.0rc1.orig/Lib/test/test_ensurepip.py 2025-07-23 10:10:19.969641992 +0200 ++++ Python-3.14.0rc1/Lib/test/test_ensurepip.py 2025-07-23 10:10:31.691217643 +0200 +@@ -100,6 +100,17 @@ + unittest.mock.ANY, + ) + ++ def test_bootstrapping_with_prefix(self): ++ ensurepip.bootstrap(prefix="/foo/bar/") ++ self.run_pip.assert_called_once_with( ++ [ ++ "install", "--no-cache-dir", "--no-index", "--find-links", ++ unittest.mock.ANY, "--prefix", "/foo/bar/", ++ "pip", ++ ], ++ unittest.mock.ANY, ++ ) ++ + def test_bootstrapping_with_user(self): + ensurepip.bootstrap(user=True) + +Index: Python-3.14.0rc1/Makefile.pre.in +=================================================================== +--- Python-3.14.0rc1.orig/Makefile.pre.in 2025-07-23 10:10:27.325708066 +0200 ++++ Python-3.14.0rc1/Makefile.pre.in 2025-07-23 10:10:31.691716104 +0200 +@@ -2371,7 +2371,7 @@ + install|*) ensurepip="" ;; \ + esac; \ + $(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \ +- $$ensurepip --root=$(DESTDIR)/ ; \ ++ $$ensurepip --root=$(DESTDIR)/ --prefix=$(prefix) ; \ + fi + + .PHONY: altinstall +@@ -2382,7 +2382,7 @@ + install|*) ensurepip="--altinstall" ;; \ + esac; \ + $(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \ +- $$ensurepip --root=$(DESTDIR)/ ; \ ++ $$ensurepip --root=$(DESTDIR)/ --prefix=$(prefix) ; \ + fi + + .PHONY: commoninstall +Index: Python-3.14.0rc1/Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst +=================================================================== +--- /dev/null 1970-01-01 00:00:00.000000000 +0000 ++++ Python-3.14.0rc1/Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst 2025-07-23 10:10:31.692253536 +0200 +@@ -0,0 +1 @@ ++A directory prefix can now be specified when using :mod:`ensurepip`. diff --git a/bsc1243155-sphinx-non-determinism.patch b/bsc1243155-sphinx-non-determinism.patch new file mode 100644 index 0000000..6dc78a0 --- /dev/null +++ b/bsc1243155-sphinx-non-determinism.patch @@ -0,0 +1,45 @@ +From 906a590df191f66f4f0c4a70e3edb6fd82c156ef Mon Sep 17 00:00:00 2001 +From: Daniel Garcia Moreno +Date: Tue, 1 Jul 2025 12:13:28 +0200 +Subject: [PATCH] Doc: Generate ids for audit_events using docname + +This patch generates ids for audit_events using the docname so the id is +not global but depend on the source file. This make the doc build +reproducible with multiple cores because it doesn't which file is parsed +first, the id for audit_events will always be consistent independently +of what file is parsed first. + +https://github.com/python/cpython/issues/130979 +--- + Doc/tools/extensions/audit_events.py | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +Index: Python-3.14.0b3/Doc/tools/extensions/audit_events.py +=================================================================== +--- Python-3.14.0b3.orig/Doc/tools/extensions/audit_events.py 2025-06-17 17:40:54.000000000 +0200 ++++ Python-3.14.0b3/Doc/tools/extensions/audit_events.py 2025-07-02 15:06:57.802539821 +0200 +@@ -68,8 +68,13 @@ + logger.warning(msg) + return + +- def id_for(self, name) -> str: +- source_count = len(self.sources.get(name, set())) ++ def _source_count(self, name, docname) -> int: ++ """Count the event name in the same source""" ++ sources = self.sources.get(name, set()) ++ return len([s for s, t in sources if s == docname]) ++ ++ def id_for(self, name, docname) -> str: ++ source_count = self._source_count(name, docname) + name_clean = re.sub(r"\W", "_", name) + return f"audit_event_{name_clean}_{source_count}" + +@@ -142,7 +147,7 @@ + except (IndexError, TypeError): + target = None + if not target: +- target = self.env.audit_events.id_for(name) ++ target = self.env.audit_events.id_for(name, self.env.docname) + ids.append(target) + self.env.audit_events.add_event(name, args, (self.env.docname, target)) + diff --git a/externally_managed.in b/externally_managed.in new file mode 100644 index 0000000..54606b6 --- /dev/null +++ b/externally_managed.in @@ -0,0 +1,12 @@ +[externally-managed] +Error=To install Python packages system-wide, try + zypper install __PYTHONPREFIX__-xyz, where xyz is the package + you are trying to install. + + If you wish to install a non-rpm packaged Python package, + create a virtual environment using __PYTHON__ -m venv path/to/venv. + Then use path/to/venv/bin/python and path/to/venv/bin/pip. + + If you wish to install a non-rpm packaged Python application, + it may be easiest to use `pipx install xyz`, which will manage a + virtual environment for you. Install pipx via `zypper install __PYTHONPREFIX__-pipx` . diff --git a/fix-test-recursion-limit-15.6.patch b/fix-test-recursion-limit-15.6.patch new file mode 100644 index 0000000..59d2d51 --- /dev/null +++ b/fix-test-recursion-limit-15.6.patch @@ -0,0 +1,34 @@ +--- + Lib/test/test_compile.py | 5 +++++ + 1 file changed, 5 insertions(+) + +Index: Python-3.14.0b3/Lib/test/test_compile.py +=================================================================== +--- Python-3.14.0b3.orig/Lib/test/test_compile.py 2025-06-22 00:32:01.975698954 +0200 ++++ Python-3.14.0b3/Lib/test/test_compile.py 2025-06-22 00:32:07.740981155 +0200 +@@ -24,6 +24,9 @@ + from test.support.bytecode_helper import instructions_with_positions + from test.support.os_helper import FakePath + ++IS_SLE_15_6 = os.environ.get("SLE_VERSION", "") == "0150700" ++IS_32bit = hasattr(os, "uname") and os.uname().machine in ["i386", "i486", "i586", "i686"] ++ + class TestSpecifics(unittest.TestCase): + + def compile_single(self, source): +@@ -120,6 +123,7 @@ + self.assertEqual(d['z'], 12) + + @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") ++ @unittest.skipIf(IS_SLE_15_6 and IS_32bit, "fails on 15.6 i586") + @support.skip_emscripten_stack_overflow() + def test_extended_arg(self): + repeat = 100 +@@ -709,6 +713,7 @@ + + @support.cpython_only + @unittest.skipIf(support.is_wasi, "exhausts limited stack on WASI") ++ @unittest.skipIf(IS_SLE_15_6 and IS_32bit, "fails on 15.6 i586") + @support.skip_emscripten_stack_overflow() + def test_compiler_recursion_limit(self): + # Compiler frames are small diff --git a/gh138131-exclude-pycache-from-digest.patch b/gh138131-exclude-pycache-from-digest.patch new file mode 100644 index 0000000..c5e371d --- /dev/null +++ b/gh138131-exclude-pycache-from-digest.patch @@ -0,0 +1,30 @@ +From 4bb41b28d5bac09bccd636d8c5fefe1a462f63a7 Mon Sep 17 00:00:00 2001 +From: Alm +Date: Mon, 25 Aug 2025 08:56:38 +0300 +Subject: [PATCH 1/4] Exclude .pyc files from the computed digest in the jit + stencils + +--- + Tools/jit/_targets.py | 3 +++ + 1 file changed, 3 insertions(+) + +Index: Python-3.14.0rc2/Tools/jit/_targets.py +=================================================================== +--- Python-3.14.0rc2.orig/Tools/jit/_targets.py ++++ Python-3.14.0rc2/Tools/jit/_targets.py +@@ -69,6 +69,9 @@ class _Target(typing.Generic[_S, _R]): + hasher.update(PYTHON_EXECUTOR_CASES_C_H.read_bytes()) + hasher.update((self.pyconfig_dir / "pyconfig.h").read_bytes()) + for dirpath, _, filenames in sorted(os.walk(TOOLS_JIT)): ++ # Exclude cache files from digest computation to ensure reproducible builds. ++ if dirpath.endswith("__pycache__"): ++ continue + for filename in filenames: + hasher.update(pathlib.Path(dirpath, filename).read_bytes()) + return hasher.hexdigest() +Index: Python-3.14.0rc2/Misc/NEWS.d/next/Build/2025-08-27-09-52-45.gh-issue-138061.fMVS9w.rst +=================================================================== +--- /dev/null ++++ Python-3.14.0rc2/Misc/NEWS.d/next/Build/2025-08-27-09-52-45.gh-issue-138061.fMVS9w.rst +@@ -0,0 +1 @@ ++Ensure reproducible builds by making JIT stencil header generation deterministic. diff --git a/gh139257-Support-docutils-0.22.patch b/gh139257-Support-docutils-0.22.patch new file mode 100644 index 0000000..9e26f6f --- /dev/null +++ b/gh139257-Support-docutils-0.22.patch @@ -0,0 +1,36 @@ +From 19b61747df3d62c822285c488753d6fbdf91e3ac Mon Sep 17 00:00:00 2001 +From: Daniel Garcia Moreno +Date: Tue, 23 Sep 2025 10:20:16 +0200 +Subject: [PATCH 1/2] gh-139257: Support docutils >= 0.22 + +--- + Doc/tools/extensions/pyspecific.py | 12 +++++++++++- + 1 file changed, 11 insertions(+), 1 deletion(-) + +Index: Python-3.14.0/Doc/tools/extensions/pyspecific.py +=================================================================== +--- Python-3.14.0.orig/Doc/tools/extensions/pyspecific.py ++++ Python-3.14.0/Doc/tools/extensions/pyspecific.py +@@ -25,11 +25,21 @@ from sphinx.util.docutils import SphinxD + SOURCE_URI = 'https://github.com/python/cpython/tree/3.14/%s' + + # monkey-patch reST parser to disable alphabetic and roman enumerated lists ++def _disable_alphabetic_and_roman(text): ++ try: ++ # docutils >= 0.22 ++ from docutils.parsers.rst.states import InvalidRomanNumeralError ++ raise InvalidRomanNumeralError(text) ++ except ImportError: ++ # docutils < 0.22 ++ return None ++ ++ + from docutils.parsers.rst.states import Body + Body.enum.converters['loweralpha'] = \ + Body.enum.converters['upperalpha'] = \ + Body.enum.converters['lowerroman'] = \ +- Body.enum.converters['upperroman'] = lambda x: None ++ Body.enum.converters['upperroman'] = _disable_alphabetic_and_roman + + + class PyAwaitableMixin(object): diff --git a/idle3.appdata.xml b/idle3.appdata.xml new file mode 100644 index 0000000..554b7c4 --- /dev/null +++ b/idle3.appdata.xml @@ -0,0 +1,35 @@ + + + + + idle3.desktop + IDLE3 + CC0 + Python-2.0 + Python 3 Integrated Development and Learning Environment + +

+ 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. +

+

+ IDLE is written in pure Python, and uses the tkinter GUI toolkit. + It provides: +

+
    +
  • a Python shell window (interactive interpreter) with colorizing of code input, output, and error messages,
  • +
  • a multi-window text editor with multiple undo, Python colorizing, smart indent, call tips, auto completion, and other features,
  • +
  • search within any window, replace within editor windows, and search through multiple files (grep),
  • +
  • a debugger with persistent breakpoints, stepping, and viewing of global and local namespaces.
  • +
+
+ https://docs.python.org/3/library/idle.html + + http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-main-window.png + http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-class-browser.png + http://in.waw.pl/~zbyszek/fedora/idle3-appdata/idle3-code-viewer.png + + zbyszek@in.waw.pl +
diff --git a/idle3.desktop b/idle3.desktop new file mode 100644 index 0000000..43f5a4c --- /dev/null +++ b/idle3.desktop @@ -0,0 +1,12 @@ +[Desktop Entry] +Version=1.0 +Name=IDLE 3 +GenericName=Python 3 IDE +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; diff --git a/import_failed.map b/import_failed.map new file mode 100644 index 0000000..2095b29 --- /dev/null +++ b/import_failed.map @@ -0,0 +1,7 @@ +python314-curses: curses _curses _curses_panel +python314-dbm: dbm _dbm _gdbm +python314-idle: idlelib +python314-testsuite: test _ctypes_test _testbuffer _testcapi _testinternalcapi _testimportmultiple _testmultiphase xxlimited +python314-tk: tkinter _tkinter +python314-tools: turtledemo +python314: sqlite3 readline _sqlite3 nis diff --git a/import_failed.py b/import_failed.py new file mode 100644 index 0000000..258b5a5 --- /dev/null +++ b/import_failed.py @@ -0,0 +1,23 @@ +import sys, os +from sysconfig import get_path + +failed_map_path = os.path.join(get_path('stdlib'), '_import_failed', 'import_failed.map') + +if __spec__: + failed_name = __spec__.name +else: + failed_name = __name__ + +with open(failed_map_path) as fd: + for line in fd: + package = line.split(':')[0] + imports = line.split(':')[1] + if failed_name in imports: + raise ImportError(f"""Module '{failed_name}' is not installed. +Use: + sudo zypper install {package} +to install it.""") + +raise ImportError(f"""Module '{failed_name}' is not installed. +It is supposed to be part of python3 distribution, but missing from failed import map. +Please file a bug on the SUSE Bugzilla.""") diff --git a/macros.python3 b/macros.python3 new file mode 100644 index 0000000..2bd193b --- /dev/null +++ b/macros.python3 @@ -0,0 +1,28 @@ +%have_python3 1 + +# commented out legacy macro definitions +#py3_prefix /usr +#py3_incdir /usr/include/python3.5m +#py3_ver 3.5 + +# these should now be provided by macros.python_all +#python3_sitearch /usr/lib64/python3.5/site-packages +#python3_sitelib /usr/lib/python3.5/site-packages +#python3_version 3.5 + +# hard to say if anyone ever used these? +#py3_soflags cpython-35m-x86_64-linux-gnu +#py3_abiflags m +%cpython3_soabi %(python3 -c "import sysconfig; print(sysconfig.get_config_var('SOABI'))") +%py3_soflags %cpython3_soabi + +# compilation macros that might be in use somewhere +%py3_compile(O) \ +find %1 -name '*.pyc' -exec rm -f {} ";"\ +python3 -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1\ +%{-O:\ +find %1 -name '*.pyo' -exec rm -f {} ";"\ +python3 -O -c "import sys, os, compileall; br='%{buildroot}'; compileall.compile_dir(sys.argv[1], ddir=br and (sys.argv[1][len(os.path.abspath(br)):]+'/') or None)" %1\ +} + + diff --git a/pre_checkin.sh b/pre_checkin.sh new file mode 100644 index 0000000..a2cf992 --- /dev/null +++ b/pre_checkin.sh @@ -0,0 +1,78 @@ +#!/bin/bash + +export LC_ALL=C + +master=python*.spec + +# create import_failed.map from package definitions +pkgname=$(grep python_pkg_name $master |grep define |awk -F' ' '{print $3}') +MAPFILE=import_failed.map +function new_map_line () { + package=$1 + package=$(echo $1 |sed -e "s:%{python_pkg_name}:$pkgname:") + modules=$2 + if [ -z "$package" -o -z "$modules" ]; then + return + fi + if [[ "$package" =~ "-base" ]]; then + return + fi + echo "$package:$modules" >> $MAPFILE.tmp +} + +for spec in *.spec; do + basename=${spec%.spec} + package= + modules= + while read line; do + case $line in + "%files -n "*) + new_map_line $package "$modules" + package=${line#"%files -n "} + modules= + ;; + "%files "*) + new_map_line $package "$modules" + package=$basename-${line#"%files "} + modules= + ;; + "%files") + new_map_line $package "$modules" + package=$basename + modules= + ;; + "%{sitedir}/config-"*) + # ignore + ;; + "%{sitedir}/"*) + word=${line#"%{sitedir}/"} + if ! echo $word | grep -q /; then + modules="$modules $word" + fi + ;; + "%{dynlib "*"}") + word=${line#"%{dynlib "} + word=${word%"}"} + modules="$modules $word" + ;; + esac + done < $spec + new_map_line $package "$modules" +done + +cat $MAPFILE.tmp |sort -u > $MAPFILE +rm $MAPFILE.tmp + +# run test inclusion check +tar xJf Python-*.xz +python3 skipped_tests.py + +# generate baselibs.conf +VERSION=$(grep ^Version $master|awk -F':' '{print $2}' |sed -e 's/ //g') +python_version=${VERSION:0:3} # 3.3 +python_version_abitag=${python_version//./} # 33 +python_version_soname=${python_version//./_} # 3_3 +echo "$pkgname-base" > baselibs.conf +echo "$pkgname" >> baselibs.conf +echo "libpython$python_version_soname-1_0" >> baselibs.conf + diff --git a/python-3.3.0b1-fix_date_time_compiler.patch b/python-3.3.0b1-fix_date_time_compiler.patch new file mode 100644 index 0000000..6f21f15 --- /dev/null +++ b/python-3.3.0b1-fix_date_time_compiler.patch @@ -0,0 +1,20 @@ +--- + Makefile.pre.in | 5 +++++ + 1 file changed, 5 insertions(+) + +Index: Python-3.14.0rc1/Makefile.pre.in +=================================================================== +--- Python-3.14.0rc1.orig/Makefile.pre.in 2025-07-22 18:42:44.000000000 +0200 ++++ Python-3.14.0rc1/Makefile.pre.in 2025-07-23 10:10:27.325708066 +0200 +@@ -1910,6 +1910,11 @@ + -DGITBRANCH="\"`LC_ALL=C $(GITBRANCH)`\"" \ + -o $@ $(srcdir)/Modules/getbuildinfo.c + ++Python/getcompiler.o: $(srcdir)/Python/getcompiler.c Makefile ++ $(CC) -c $(PY_CORE_CFLAGS) \ ++ -DCOMPILER='"[GCC]"' \ ++ -o $@ $(srcdir)/Python/getcompiler.c ++ + Modules/getpath.o: $(srcdir)/Modules/getpath.c Python/frozen_modules/getpath.h Makefile $(PYTHON_HEADERS) + $(CC) -c $(PY_CORE_CFLAGS) -DPYTHONPATH='"$(PYTHONPATH)"' \ + -DPREFIX='"$(host_prefix)"' \ diff --git a/python-3.3.0b1-localpath.patch b/python-3.3.0b1-localpath.patch new file mode 100644 index 0000000..3dffb30 --- /dev/null +++ b/python-3.3.0b1-localpath.patch @@ -0,0 +1,15 @@ +--- + Lib/site.py | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/Lib/site.py ++++ b/Lib/site.py +@@ -78,7 +78,7 @@ import stat + import errno + + # Prefixes for site-packages; add additional prefixes like /usr/local here +-PREFIXES = [sys.prefix, sys.exec_prefix] ++PREFIXES = [sys.prefix, sys.exec_prefix, '/usr/local'] + # Enable per user site-packages directory + # set it to False to disable the feature or True to force the feature + ENABLE_USER_SITE = None diff --git a/python314-rpmlintrc b/python314-rpmlintrc new file mode 100644 index 0000000..5b35f34 --- /dev/null +++ b/python314-rpmlintrc @@ -0,0 +1,3 @@ +addFilter("pem-certificate.*/usr/lib.*/python.*/test/*.pem") +addFilter("devel-file-in-non-devel-package.*/usr/lib.*/python.*/tests/*.c") +addFilter("devel-file-in-non-devel-package.*/usr/lib.*/python.*/test/*.cpp") diff --git a/python314.changes b/python314.changes new file mode 100644 index 0000000..adbebc6 --- /dev/null +++ b/python314.changes @@ -0,0 +1,12030 @@ +------------------------------------------------------------------- +Wed Oct 15 09:22:40 UTC 2025 - Daniel Garcia + +- Use sed to remove "--fail-on-warning" config from Makefile instead + of the patch gh139257-Support-docutils-0.22.patch + +------------------------------------------------------------------- +Thu Oct 9 09:10:23 UTC 2025 - Daniel Garcia + +- Fix python314:doc package build with docutils 0.22. Remove the + "SPHINXERRORHANDLING = --fail-on-warning" from Doc/Makefile using + the gh139257-Support-docutils-0.22.patch. + +------------------------------------------------------------------- +Wed Oct 8 08:55:51 UTC 2025 - Matej Cepl + +- Summary – Release highlights + Python 3.14 is the latest stable release of the Python + programming language, with a mix of changes to the language, + the implementation, and the standard library. The biggest + changes include template string literals, deferred evaluation + of annotations, and support for subinterpreters in the standard + library. + The library changes include significantly improved capabilities + for introspection in asyncio, support for Zstandard via a new + compression.zstd module, syntax highlighting in the REPL, as + well as the usual deprecations and removals, and improvements + in user-friendliness and correctness. + - Interpreter improvements: + - PEP 649 and PEP 749: Deferred evaluation of annotations + - PEP 734: Multiple interpreters in the standard library + - PEP 750: Template strings + - PEP 758: Allow except and except* expressions without + brackets + - PEP 765: Control flow in finally blocks + - PEP 768: Safe external debugger interface for CPython + - A new type of interpreter + - Free-threaded mode improvements + - Improved error messages + - Incremental garbage collection + - Significant improvements in the standard library: + - PEP 784: Zstandard support in the standard library + - Asyncio introspection capabilities + - Concurrent safe warnings control + - Syntax highlighting in the default interactive shell, and + color output in several standard library CLIs + - C API improvements: + - PEP 741: Python configuration C API + - Platform support: + - PEP 776: Emscripten is now an officially supported + platform, at tier 3. + - Release changes: + - PEP 779: Free-threaded Python is officially supported + - PEP 761: PGP signatures have been discontinued for official + releases + - Windows and macOS binary releases now support the + experimental just-in-time compiler + - Binary releases for Android are now provided + +------------------------------------------------------------------- +Wed Oct 1 05:31:47 UTC 2025 - Daniel Garcia + +- Add _zstd to the built package and libzstd as BuildRequries, boo#1250659 + +------------------------------------------------------------------- +Mon Sep 29 06:52:07 UTC 2025 - Daniel Garcia + +- Add gh139257-Support-docutils-0.22.patch to fix build with latest + docutils (>=0.22) gh#python/cpython#139257 + +------------------------------------------------------------------- +Thu Sep 18 16:17:21 UTC 2025 - Matej Cepl + +- Update to 3.14.0~rc3: + - Tools/Demos + - gh-137873: The iOS test runner has been simplified, + resolving some issues that have been observed using + the runner in GitHub Actions and Azure Pipelines test + environments. + - Security + - gh-135661: Fix CDATA section parsing in + html.parser.HTMLParser according to the HTML5 standard: ] + ]> and ]] > no longer end the CDATA section. Add private + method _set_support_cdata() which can be used to specify + how to parse <[CDATA[ — as a CDATA section in foreign + content (SVG or MathML) or as a bogus comment in the HTML + namespace. + - Library + - gh-138998: Update bundled libexpat to 2.7.2 + - gh-118803: Add back collections.abc.ByteString and + typing.ByteString. Both had been removed in prior alpha, + beta and release candidates for Python 3.14, but their + removal has now been postponed to Python 3.17. + - gh-137226: Fix typing.get_type_hints() calls on generic + typing.TypedDict classes defined with string annotations. + - gh-138804: Raise TypeError instead of AttributeError when + an argument of incorrect type is passed to shlex.quote(). + This restores the behavior of the function prior to 3.14. + - gh-128636: Fix crash in PyREPL when os.environ is + overwritten with an invalid value for mac + - gh-138514: Raise ValueError when a multi-character string + is passed to the echo_char parameter of getpass.getpass(). + Patch by Benjamin Johnson. + - gh-138515: email is added to Emscripten build. + - gh-99948: ctypes.util.find_library() now works in + Emscripten build. + - gh-138253: Add the block parameter in the put() and + get() methods of the concurrent.interpreters queues for + compatibility with the queue.Queue interface. + - gh-138133: Prevent infinite traceback loop when sending + CTRL^C to Python through strace. + - gh-134869: Fix an issue where pressing Ctrl+C during tab + completion in the REPL would leave the autocompletion menu + in a corrupted state. + - gh-90548: Fix musl detection for platform.libc_ver() on + Alpine Linux if compiled with –strip-all. + - gh-136134: SMTP.auth_cram_md5() now raises an SMTPException + instead of a ValueError if Python has been built without + MD5 support. In particular, SMTP clients will not attempt + to use this method even if the remote server is assumed to + support it. Patch by Bénédikt Tran. + - gh-136134: IMAP4.login_cram_md5 now raises an IMAP4.error + if CRAM-MD5 authentication is not supported. Patch by + Bénédikt Tran. + - gh-134953: Expand _colorize theme with keyword_constant and + implement in repl. + - Core and Builtins + - gh-71810: Raise OverflowError for (-1).to_bytes() for + signed conversions when bytes count is zero. Patch by + Sergey B Kirpichev. + - gh-138192: Fix contextvars initialization so that all + subinterpreters are assigned the MISSING value. + - gh-138479: Fix a crash when a generic object’s + __typing_subst__ returns an object that isn’t a tuple. + - gh-138372: Fix SyntaxWarning emitted for erroneous + subscript expressions involving template string literals. + Patch by Brian Schubert. + - gh-138318: The default REPL now avoids highlighting + built-in names (for instance set or format()) when they + are used as attribute names (for instance in value.set or + text.format). + - gh-138349: Fix crash in certain cases where a module + contains both a module-level annotation and a + comprehension. + - gh-137384: Fix a crash when using the warnings module in a + finalizer at shutdown. Patch by Kumar Aditya. + - gh-137883: Fix runaway recursion when calling a function + with keyword arguments. + - gh-137079: Fix keyword typo recognition when parsing files. + Patch by Pablo Galindo. + - gh-137728: Fix the JIT’s handling of many local variables. + This previously caused a segfault. + - gh-137576: Fix for incorrect source code being shown in + tracebacks from the Basic REPL when PYTHONSTARTUP is given. + Patch by Adam Hartz. + +------------------------------------------------------------------- +Fri Sep 12 07:46:55 UTC 2025 - Daniel Garcia + +- Add gh138131-exclude-pycache-from-digest.patch fixing reproducible + build for python-nogil. + (bsc#1244680, gh#python/cpython#138131) + +------------------------------------------------------------------- +Tue Sep 9 07:48:08 UTC 2025 - Dirk Müller + +- fix import_failed.map for python 3.14 + +------------------------------------------------------------------- +Fri Sep 5 06:47:57 UTC 2025 - Daniel Garcia + +- Move compression folder to python-base where it should be. This + module is used internally in gzip.py. + +------------------------------------------------------------------- +Fri Aug 15 14:12:35 UTC 2025 - Matej Cepl + +- Update to 3.14.0~rc2: + - Library + - gh-137426: Remove the code deprecation of + importlib.abc.ResourceLoader. It is documented as + deprecated, but left for backwards compatibility with other + classes in importlib.abc. + - gh-137282: Fix tab completion and dir() on + concurrent.futures. + - gh-137257: Bump the version of pip bundled in ensurepip to + version 25.2 + - gh-137226: Fix behavior of + annotationlib.ForwardRef.evaluate() when the type_params + parameter is passed and the name of a type param is also + present in an enclosing scope. + - gh-130522: Fix unraisable TypeError raised during + interpreter shutdown in the threading module. + - gh-137059: Fix handling of file URLs with a + Windows drive letter in the URL authority by + urllib.request.url2pathname(). This fixes a regression in + earlier pre-releases of Python 3.14. + - gh-130577: tarfile now validates archives to ensure member + offsets are non-negative. (Contributed by Alexander Enrique + Urieles Nieto in gh-130577; CVE-2025-8194, bsc#1247249). + - gh-135228: When dataclasses replaces a class with a slotted + dataclass, the original class can now be garbage collected + again. Earlier changes in Python 3.14 caused this class to + always remain in existence together with the replacement + class synthesized by dataclasses. + - Documentation + - gh-136155: We are now checking for fatal errors in EPUB + builds in CI. + - Core and Builtins + - gh-137400: Fix a crash in the free threading + build when disabling profiling or tracing across + all threads with PyEval_SetProfileAllThreads() + or PyEval_SetTraceAllThreads() or their Python + equivalents threading.settrace_all_threads() and + threading.setprofile_all_threads(). + - gh-137314: Fixed a regression where raw f-strings + incorrectly interpreted escape sequences in format + specifications. Raw f-strings now properly preserve literal + backslashes in format specs, matching the behavior from + Python 3.11. For example, rf"{obj:\xFF}" now correctly + produces '\\xFF' instead of 'ÿ'. Patch by Pablo Galindo. + - gh-137308: A standalone docstring in a node body is + optimized as a pass statement to ensure that the node’s + body is never empty. There was a ValueError in compile() + otherwise. + - gh-137288: Fix bug where some bytecode instructions of a + boolean expression are not associated with the correct + exception handler. + - gh-134291: Remove some newer macOS API usage from the JIT + compiler in order to restore compatibility with older OSX + 10.15 deployment targets. + - gh-131338: Disable computed stack limit checks on non-glibc + linux platforms to fix crashes on deep recursion. + - gh-136870: Fix data races while de-instrumenting bytecode + of code objects running concurrently in threads. + - C API + - gh-137573: Mark _PyOptimizer_Optimize as Py_NO_INLINE to + prevent stack overflow crashes on macOS. + - Build + - gh-132339: Add support for OpenSSL 3.5. +- Replaces upstreamed patches: + - CVE-2025-8194-tarfile-no-neg-offsets.patch + +------------------------------------------------------------------- +Fri Aug 1 20:09:24 UTC 2025 - Matej Cepl + +- Add CVE-2025-8194-tarfile-no-neg-offsets.patch which now + validates archives to ensure member offsets are non-negative + (gh#python/cpython#130577, CVE-2025-8194, bsc#1247249). + +------------------------------------------------------------------- +Wed Jul 23 08:05:20 UTC 2025 - Matej Cepl + +- Update to 3.14.0~rc1: + - Tools/Demos + - gh-136251: Fixes and usability improvements for + Tools/wasm/emscripten/web_example + - Security + - gh-135661: Fix parsing attributes with whitespaces around + the = separator in html.parser.HTMLParser according to the + HTML5 standard. + - gh-118350: Fix support of escapable raw text mode (elements + “textarea” and “title”) in html.parser.HTMLParser. + - Library + - gh-136170: Removed the unreleased + zipfile.ZipFile.data_offset property added in 3.14.0a7 as + it wasn’t fully clear which behavior it should have in some + situations so the result was not always what a user might + expect. + - gh-124621: pyrepl now works in Emscripten. + - gh-136874: Discard URL query and fragment in + urllib.request.url2pathname(). + - gh-130645: Enable color help by default in argparse. + - gh-136549: Fix signature of threading.excepthook(). + - gh-136523: Fix wave.Wave_write emitting an unraisable when + open raises. + - gh-52876: Add missing keepends (default True) + parameter to codecs.StreamReaderWriter.readline() and + codecs.StreamReaderWriter.readlines(). + - gh-136470: Correct + concurrent.futures.InterpreterPoolExecutor’s default thread + name. + - gh-136476: Fix a bug that was causing the + get_async_stack_trace function to miss some frames in the + stack trace. + - gh-136434: Fix docs generation of UnboundItem in + concurrent.interpreters when running with -OO. + - gh-136380: Raises AttributeError when accessing + concurrent.futures.InterpreterPoolExecutor and + subinterpreters are not available. + - gh-134759: Fix UnboundLocalError in + email.message.Message.get_payload() when the payload to + decode is a bytes object. Patch by Kliment Lamonov. + - gh-134657: asyncio: Remove some private names from + asyncio.__all__. + - Core and Builtins + - gh-136801: Fix PyREPL syntax highlighting on match cases + after multi-line case. Contributed by Olga Matoula. + - gh-136421: Fix crash when initializing datetime + concurrently. + - gh-136541: Fix some issues with the perf trampolines + on x86-64 and aarch64. The trampolines were not being + generated correctly for some cases, which could lead to + the perf integration not working correctly. Patch by Pablo + Galindo. + - gh-136517: Fixed a typo that prevented printing of + uncollectable objects when the gc.DEBUG_UNCOLLECTABLE mode + was set. + - gh-136525: Fix issue where per-thread bytecode was not + instrumented for newly created threads. + - gh-132661: Interpolation.expression now has a default, the + empty string. + - gh-132661: Reflect recent PEP 750 change. + - Disallow concatenation of string.templatelib.Template and + str. Also, disallow implicit concatenation of t-string + literals with string or f-string literals. + - gh-116738: Make functions in grp thread-safe on the free + threaded build. + - gh-135148: Fixed a bug where f-string debug expressions + (using =) would incorrectly strip out parts of strings + containing escaped quotes and # characters. Patch by Pablo + Galindo. + - gh-133136: Limit excess memory usage in the free threading + build when a large dictionary or list is resized and + accessed by multiple threads. + - gh-91153: Fix a crash when a bytearray is concurrently + mutated during item assignment. + - gh-127971: Fix off-by-one read beyond the end of a string + in string search. + - C API + - gh-112068: Revert support of nullable arguments in + PyArg_Parse(). + - gh-133296: New variants for the critical section API that + accept one or two PyMutex pointers rather than PyObject + instances are now public in the non-limited C API. + - gh-134009: Expose PyMutex_IsLocked() as part of the public + C API. + - Build + - gh-135621: PyREPL no longer depends on the curses standard + library. Contributed by Łukasz Langa. + +------------------------------------------------------------------- +Thu Jul 10 10:17:47 UTC 2025 - Daniel Garcia + +- Fix gil/nogil package description, bsc#1246229 + +------------------------------------------------------------------- +Wed Jul 9 05:50:32 UTC 2025 - Matej Cepl + +- Update to 3.14.0~b4: + - Tools/Demos + - gh-135968: Stubs for strip are now provided as part of an + iOS install. + - gh-133600: Backport file reorganization for Tools/wasm/wasi + This should make backporting future code changes easier. It + also simplifies instructions around how to do WASI builds + in the devguide. + - Tests + - gh-135966: The iOS testbed now handles the app_packages + folder as a site directory. + - gh-135494: Fix regrtest to support excluding tests from + --pgo tests. Patch by Victor Stinner. + - Security + - gh-136053: marshal: fix a possible crash when deserializing + slice objects. + - gh-135661: Fix parsing start and end tags in + html.parser.HTMLParser according to the HTML5 standard. + - Whitespaces no longer accepted between does not end the script section. + - Vertical tabulation (\v) and non-ASCII whitespaces no + longer recognized as whitespaces. The only whitespaces + are \t\n\r\f and space. + - Null character (U+0000) no longer ends the tag name. + - Attributes and slashes after the tag name in end tags are + now ignored, instead of terminating after the first > in + quoted attribute value. E.g. . + - Multiple slashes and whitespaces between the last + attribute and closing > are now ignored in both start and + end tags. E.g. . + - Multiple = between attribute name and value are no longer + collapsed. E.g. produces attribute “foo” + with value “=bar”. + - Whitespaces between the = separator and attribute name or + value are no longer ignored. E.g. produces + two attributes “foo” and “=bar”, both with value None; produces two attributes: “foo” with value “” + and “bar” with value None. + - gh-102555: Fix comment parsing in html.parser.HTMLParser + according to the HTML5 standard. --!> now ends the comment. + -- > no longer ends the comment. Support abnormally ended + empty comments <--> and <--->. + - Library + - gh-136286: Fix pickling failures for protocols 0 and 1 for + many objects realted to subinterpreters. + - gh-136316: Improve support for evaluating nested forward + references in typing.evaluate_forward_ref(). + - gh-85702: If zoneinfo._common.load_tzdata is given a + package without a resource a zoneinfo.ZoneInfoNotFoundError + is raised rather than a PermissionError. Patch by Victor + Stinner. + - gh-136028: Fix parsing month names containing “İ” + (U+0130, LATIN CAPITAL LETTER I WITH DOT ABOVE) in + time.strptime(). This affects locales az_AZ, ber_DZ, ber_MA + and crh_UA. + - gh-135995: In the palmos encoding, make byte 0x9b decode to + › (U+203A - SINGLE RIGHT-POINTING ANGLE QUOTATION MARK). + - gh-53203: Fix time.strptime() for %c and %x formats on + locales byn_ER, wal_ET and lzh_TW, and for %X format on + locales ar_SA, bg_BG and lzh_TW. + - gh-91555: An earlier change, which was introduced in + 3.14.0b2, has been reverted. It disabled logging for + a logger during handling of log messages for that + logger. Since the reversion, the behaviour should be as it + was before 3.14.0b2. + - gh-135878: Fixes a crash of types.SimpleNamespace on free + threading builds, when several threads were calling its + __repr__() method at the same time. + - gh-135836: Fix IndexError in + asyncio.loop.create_connection() that could occur when + non-OSError exception is raised during connection and + socket’s close() raises OSError. + - gh-135836: Fix IndexError in + asyncio.loop.create_connection() that could occur when the + Happy Eyeballs algorithm resulted in an empty exceptions + list during connection attempts. + - gh-135855: Raise TypeError instead of SystemError when + _interpreters.set___main___attrs() is passed a non-dict + object. Patch by Brian Schubert. + - gh-135815: netrc: skip security checks if os.getuid() is + missing. Patch by Bénédikt Tran. + - gh-135640: Address bug where it was possible to call + xml.etree.ElementTree.ElementTree.write() on an ElementTree + object with an invalid root element. This behavior blanked + the file passed to write if it already existed. + - gh-135645: Added supports_isolated_interpreters field to + sys.implementation. + - gh-135646: Raise consistent NameError exceptions in + annotationlib.ForwardRef.evaluate() + - gh-135557: Fix races on heapq updates and list reads on the + free threaded build. + - gh-119180: Only fetch globals and locals if necessary in + annotationlib.get_annotations() + - gh-135561: Fix a crash on DEBUG builds when an HACL* HMAC + routine fails. Patch by Bénédikt Tran. + - gh-135487: Fix reprlib.Repr.repr_int() when given integers + with more than sys.get_int_max_str_digits() digits. Patch + by Bénédikt Tran. + - gh-135335: multiprocessing: Flush stdout and stderr after + preloading modules in the forkserver. + - gh-135069: Fix the “Invalid error handling” exception in + encodings.idna.IncrementalDecoder to correctly replace the + ‘errors’ parameter. + - gh-130662: +Accept leading zeros in precision and width + fields for +:class:Decimal formatting, for example + format(Decimal(1.25), '.016f'). + - gh-130662: Accept leading zeros in precision and + width fields for Fraction formatting, for example + format(Fraction(1, 3), '.016f'). + - gh-87790: Support underscore and comma as thousands + separators in the fractional part for Fraction’s + formatting. Patch by Sergey B Kirpichev. + - gh-87790: Support underscore and comma as thousands + separators in the fractional part for Decimal’s + formatting. Patch by Sergey B Kirpichev. + - gh-130664: Handle corner-case for Fraction’s formatting: + treat zero-padding (preceding the width field by a zero + ('0') character) as an equivalent to a fill character of + '0' with an alignment type of '=', just as in case of + float’s. + - Documentation + - gh-136155: EPUB builds are fixed by excluding + non-XHTML-compatible tags. + - Core and Builtins + - gh-109700: Fix memory error handling in + PyDict_SetDefault(). + - gh-78465: Fix error message for cls.__new__(cls, ...) where + cls is not instantiable builtin or extension type (with + tp_new set to NULL). + - gh-129958: Differentiate between t-strings and f-strings + in syntax error for newlines in format specifiers of + single-quoted interpolated strings. + - gh-135871: Non-blocking mutex lock attempts now return + immediately when the lock is busy instead of briefly + spinning in the free threading build. + - gh-135106: Restrict the trashcan mechanism to GC’ed objects + and untrack them while in the trashcan to prevent the GC + and trashcan mechanisms conflicting. + - gh-135607: Fix potential weakref races in an object’s + destructor on the free threaded build. + - gh-135608: Fix a crash in the JIT involving attributes of + modules. + - gh-135543: Emit sys.remote_exec audit event + when sys.remote_exec() is called and migrate + remote_debugger_script to cpython.remote_debugger_script. + - gh-134280: Disable constant folding for ~ with a boolean + argument. This moves the deprecation warning from compile + time to runtime. + - C API + - gh-135906: Fix compilation errors when compiling the + internal headers with a C++ compiler. + - Build + - gh-134273: Add support for configuring compiler flags for + the JIT with CFLAGS_JIT + +------------------------------------------------------------------- +Wed Jul 2 13:14:28 UTC 2025 - Matej Cepl + +- Add bsc1243155-sphinx-non-determinism.patch (bsc#1243155) to + generate ids for audit_events using docname (reproducible + builds). + +------------------------------------------------------------------- +Tue Jul 1 08:24:53 UTC 2025 - Daniel Garcia + +- Use one core to build doc. This will make sphinx doc build + reproducible. + bsc#1243155 + +------------------------------------------------------------------- +Sat Jun 21 22:30:08 UTC 2025 - Matej Cepl + +- Update to 3.14.0~b3: + - Tests + - gh-132815: Fix test__opcode: add JUMP_BACKWARD to + specialization stats. + - gh-135489: Show verbose output for failing tests during PGO + profiling step with –enable-optimizations. + - gh-135120: Add test.support.subTests(). + - Security + - gh-135462: Fix quadratic complexity in processing specially + crafted input in html.parser.HTMLParser. End-of-file errors + are now handled according to the HTML5 specs – comments and + declarations are automatically closed, tags are ignored + (bsc#1244705, CVE-2025-6069). + - gh-135034: Fixes multiple issues that allowed tarfile + extraction filters (filter="data" and filter="tar") to be + bypassed using crafted symlinks and hard links. Addresses + CVE 2024-12718, CVE 2025-4138, CVE 2025-4330, and CVE + 2025-4517. Also addresses CVE-2025-4435 (gh#135034, + bsc#1244061). + - Library + - gh-65697: configparser’s error message when attempting to + write an invalid key is now more helpful. + - gh-135497: Fix os.getlogin() failing for longer usernames + on BSD-based platforms. + - gh-135429: Fix the argument mismatch in _lsprof for + PY_THROW event. + - gh-135368: Fix unittest.mock.Mock generation on + dataclasses.dataclass() objects. Now all special attributes + are set as it was before gh-124429. + - gh-133967: Do not normalize locale name ‘C.UTF-8’ to + ‘en_US.UTF-8’. + - gh-135321: Raise a correct exception for values greater + than 0x7fffffff for the BINSTRING opcode in the C + implementation of pickle. + - gh-135276: Backported bugfixes in zipfile.Path from + zipp 3.23. Fixed .name, .stem and other basename-based + properties on Windows when working with a zipfile on disk. + - gh-135244: uuid: when the MAC address cannot be + determined, the 48-bit node ID is now generated with a + cryptographically-secure pseudo-random number generator + (CSPRNG) as per RFC 9562, §6.10.3. This affects uuid1() and + uuid6(). + - gh-134970: Fix the “unknown action” exception in + argparse.ArgumentParser.add_argument_group() to correctly + replace the action class. + - gh-134718: ast.dump() now only omits None and [] values if + they are default values. + - gh-134939: Add the concurrent.interpreters module. See PEP + 734. + - gh-134885: Fix possible crash in the compression.zstd + module related to setting parameter types. Patch by Jelle + Zijlstra. + - gh-134857: Improve error report for doctests run with + unittest. Remove doctest module frames from tracebacks and + redundant newline character from a failure message. + - gh-128840: Fix parsing long IPv6 addresses with embedded + IPv4 address. + - gh-134637: Fix performance regression in calling a ctypes + function pointer in free threading. + - gh-134696: Built-in HACL* and OpenSSL implementations of + hash function constructors now correctly accept the same + documented named arguments. For instance, md5() could be + previously invoked as md5(data=data) or md5(string=string) + depending on the underlying implementation but these calls + were not compatible. Patch by Bénédikt Tran. + - gh-134151: email: Fix TypeError in + email.utils.decode_params() when sorting RFC 2231 + continuations that contain an unnumbered section. + - gh-134210: curses.window.getch() now correctly handles + signals. Patch by Bénédikt Tran. + - gh-134152: email: Fix parsing of email message ID with + invalid domain. + - gh-133489: random.getrandbits() can now generate more that + 231 bits. random.randbytes() can now generate more that 256 + MiB. + - gh-132813: Improve error messages for incorrect types and + values of csv.Dialect attributes. + - gh-132969: Prevent the ProcessPoolExecutor executor thread, + which remains running when shutdown(wait=False), from + attempting to adjust the pool’s worker processes after the + object state has already been reset during shutdown. A + combination of conditions, including a worker process + having terminated abormally, resulted in an exception and + a potential hang when the still-running executor thread + attempted to replace dead workers within the pool. + - gh-127081: Fix libc thread safety issues with os by + replacing getlogin with getlogin_r re-entrant version. + - gh-131884: Fix formatting issues in json.dump() when both + indent and skipkeys are used. + - gh-130999: Avoid exiting the new REPL and offer suggestions + even if there are non-string candidates when errors occur. + - Documentation + - gh-135171: Document that the iterator for the leftmost for + clause in the generator expression is created immediately. + - bpo-45210: Document that error indicator may be set in + tp_dealloc, and how to avoid clobbering it. + - Core and Builtins + - gh-135496: Fix typo in the f-string conversion type error + (“exclamanation” -> “exclamation”). + - gh-135371: Fixed asyncio debugging tools to properly + display internal coroutine call stacks alongside external + task dependencies. The python -m asyncio ps and python + -m asyncio pstree commands now show complete execution + context. Patch by Pablo Galindo. + - gh-127319: Set the allow_reuse_port class variable to False + on the XMLRPC, logging, and HTTP servers. This matches the + behavior in prior Python releases, which is to not allow + port reuse. + - gh-135171: Reverts the behavior of async generator + expressions when created with object w/o __aiter__ method + to the pre-3.13 behavior of raising a TypeError. + - gh-130077: Properly raise custom syntax errors when + incorrect syntax containing names that are prefixes of soft + keywords is encountered. Patch by Pablo Galindo. + - gh-135171: Reverts the behavior of generator expressions + when created with a non-iterable to the pre-3.13 behavior + of raising a TypeError. It is no longer possible to + cause a crash in the debugger by altering the generator + expression’s local variables. This is achieved by moving + the GET_ITER instruction back to the creation of the + generator expression and adding an additional check to + FOR_ITER. + - gh-116738: Make methods in heapq thread-safe on the free + threaded build. + - gh-134876: Add support to PEP 768 remote debugging for + Linux kernels which don’t have CONFIG_CROSS_MEMORY_ATTACH + configured. + - gh-134889: Fix handling of a few opcodes that leave + operands on the stack when optimizing LOAD_FAST. + - gh-134908: Fix crash when iterating over lines in a text + file on the free threaded build. + - gh-132617: Fix dict.update() modification check that could + incorrectly raise a “dict mutated during update” error when + a different dictionary was modified that happens to share + the same underlying keys object. + - gh-134679: Fix crash in the free threading build’s QSBR + code that could occur when changing an object’s __dict__ + attribute. + - gh-127682: No longer call __iter__ twice in list + comprehensions. This brings the behavior of list + comprehensions in line with other forms of iteration + - gh-133912: Fix the C API function PyObject_GenericSetDict + to handle extension classes with inline values. + - C API + - gh-134989: Fix Py_RETURN_NONE, Py_RETURN_TRUE and + Py_RETURN_FALSE macros in the limited C API 3.11 and + older: don’t treat Py_None, Py_True and Py_False as + immortal. Patch by Victor Stinner. + - gh-134989: Implement PyObject_DelAttr() and + PyObject_DelAttrString() as macros in the limited C API + 3.12 and older. Patch by Victor Stinner. + - gh-133968: Add PyUnicodeWriter_WriteASCII() function to + write an ASCII string into a PyUnicodeWriter. The function + is faster than PyUnicodeWriter_WriteUTF8(), but has an + undefined behavior if the input string contains non-ASCII + characters. Patch by Victor Stinner. + - Build + - gh-119132: Remove “experimental” tag from the CPython + free-threading build. + - gh-135497: Fix the detection of MAXLOGNAME in the + configure.ac script. + - gh-134923: Windows builds with profile-guided optimization + enabled now use /GENPROFILE and /USEPROFILE instead of + deprecated /LTCG: options. + - gh-134774: Fix Py_DEBUG macro redefinition warnings on + Windows debug builds. Patch by Chris Eibl. + - gh-134632: Fixed build-details.json generation to use + INCLUDEPY, in order to reference the pythonX.Y subdirectory + of the include directory, as required in PEP 739, instead + of the top-level include directory. + +------------------------------------------------------------------- +Thu May 29 11:42:15 UTC 2025 - Matej Cepl + +- Update to 3.14.0~b2: + - Tools/Demos + - gh-134215: REPL import autocomplete only suggests private + modules when explicitly specified. + - Tests + - gh-133744: Fix multiprocessing interrupt test. Add an event + to synchronize the parent process with the child process: + wait until the child process starts sleeping. Patch by + Victor Stinner. + - gh-133682: Fixed test case + test.test_annotationlib.TestStringFormat.test_displays + which ensures proper handling of complex data structures + (lists, sets, dictionaries, and tuples) in string + annotations. + - gh-133639: Fix + TestPyReplAutoindent.test_auto_indent_default() doesn’t run + input_code. + - Security + - gh-133767: Fix use-after-free in the “unicode-escape” + decoder with a non-“strict” error handler (CVE-2025-4516 + bsc#1243273). + - gh-128840: Short-circuit the processing of long IPv6 + addresses early in ipaddress to prevent excessive memory + consumption and a minor denial-of-service. + - Library + - gh-132710: If possible, ensure that uuid.getnode() + returns the same result even across different + processes. Previously, the result was constant only within + the same process. Patch by Bénédikt Tran. + - gh-80334: multiprocessing.freeze_support() now checks for + work on any “spawn” start method platform rather than only + on Windows. + - gh-134582: Fix tokenize.untokenize() round-trip errors + related to t-strings braces escaping + - gh-134546: Ensure pdb remote debugging script is readable + by remote Python process. + - gh-134451: Converted asyncio.tools.CycleFoundException from + dataclass to a regular exception type. + - gh-114177: Fix asyncio to not close subprocess pipes which + would otherwise error out when the event loop is already + closed. + - gh-90871: Fixed an off by one error concerning the backlog + parameter in create_unix_server(). Contributed by Christian + Harries. + - gh-134323: Fix the threading.RLock.locked() method. + - gh-86802: Fixed asyncio memory leak in cancelled + shield tasks. For shielded tasks where the shield was + cancelled, log potential exceptions through the exception + handler. Contributed by Christian Harries. + - gh-134209: curses: The curses.window.instr() and + curses.window.getstr() methods now allocate their internal + buffer on the heap instead of the stack; in addition, the + max buffer size is increased from 1023 to 2047. + - gh-134235: Updated tab completion on REPL to include + builtin modules. Contributed by Tom Wang, Hunter Young + - gh-134152: Fixed UnboundLocalError that could occur during + email header parsing if an expected trailing delimiter is + missing in some contexts. + - gh-134168: http.server: Fix IPv6 address binding and + --directory handling when using HTTPS. + - gh-62184: Remove import of C implementation of io.FileIO + from Python implementation which has its own implementation + - gh-133982: Emit RuntimeWarning in the Python implementation + of io when the file-like object is not closed explicitly in + the presence of multiple I/O layers. + - gh-133890: The tarfile module now handles + UnicodeEncodeError in the same way as OSError when cannot + extract a member. + - gh-134097: Fix interaction of the new REPL and -X + showrefcount command line option. + - gh-133889: The generated directory listing page in + http.server.SimpleHTTPRequestHandler now only shows the + decoded path component of the requested URL, and not the + query and fragment. + - gh-134098: Fix handling paths that end with + a percent-encoded slash (%2f or %2F) in + http.server.SimpleHTTPRequestHandler. + - gh-132124: On POSIX-compliant systems, + multiprocessing.util.get_temp_dir() now ignores TMPDIR + (and similar environment variables) if the path length of + AF_UNIX socket files exceeds the platform-specific maximum + length when using the forkserver start method. Patch by + Bénédikt Tran. + - gh-134062: ipaddress: fix collisions in __hash__() for + IPv4Network and IPv6Network objects. + - gh-133970: Make string.templatelib.Template and + string.templatelib.Interpolation generic. + - gh-71253: Raise ValueError in open() if opener returns a + negative file-descriptor in the Python implementation of io + to match the C implementation. + - gh-133960: Simplify and improve + typing.evaluate_forward_ref(). It now no longer raises + errors on certain invalid types. In several situations, + it is now able to evaluate forward references that were + previously unsupported. + - gh-133925: Make the private class typing._UnionGenericAlias + hashable. + - gh-133653: Fix argparse.ArgumentParser with the + formatter_class argument. Fix TypeError when + formatter_class is a custom subclass of HelpFormatter. Fix + TypeError when formatter_class is not a subclass of + HelpFormatter and non-standard prefix_char is used. Fix + support of colorizing when formatter_class is not a + subclass of HelpFormatter. + - gh-132641: Fixed a race in functools.lru_cache() under + free-threading. + - gh-133783: Fix bug with applying copy.replace() to ast + objects. Attributes that default to None were incorrectly + treated as required for manually created AST nodes. + - gh-133684: Fix bug where annotationlib.get_annotations() + would return the wrong result for certain classes that are + part of a class hierarchy where from __future__ import + annotations is used. + - gh-77057: Fix handling of invalid markup declarations in + html.parser.HTMLParser. + - gh-130328: Speedup pasting in PyREPL on Windows in a legacy + console. Patch by Chris Eibl. + - gh-133701: Fix bug where typing.TypedDict classes defined + under from __future__ import annotations and inheriting + from another TypedDict had an incorrect __annotations__ + attribute. + - gh-133581: Improve unparsing of t-strings in ast.unparse() + and from __future__ import annotations. Empty t-strings now + round-trip correctly and formatting in interpolations is + preserved. Patch by Jelle Zijlstra. + - gh-133551: Support t-strings (PEP 750) in + annotationlib. Patch by Jelle Zijlstra. + - gh-133439: Fix dot commands with trailing spaces are + mistaken for multi-line SQL statements in the sqlite3 + command-line interface. + - gh-132493: Avoid accessing __annotations__ unnecessarily in + inspect.signature(). + - gh-132876: ldexp() on Windows doesn’t round subnormal + results before Windows 11, but should. Python’s + math.ldexp() wrapper now does round them, so results may + change slightly, in rare cases of very small results, on + Windows versions before 11. + - gh-133009: xml.etree.ElementTree: Fix a crash in + Element.__deepcopy__ when the element is concurrently + mutated. Patch by Bénédikt Tran. + - gh-91555: Ignore log messages generated during handling of + log messages, to avoid deadlock or infinite recursion. + - gh-125028: functools.Placeholder cannot be passed to + functools.partial() as a keyword argument. + - gh-62824: Fix aliases for iso8859_8 encoding. Patch by Dave + Goncalves. + - gh-86155: html.parser.HTMLParser.close() no longer loses + data when the