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
index c1bf790..c66b4b7 100644
--- a/CVE-2023-52425-libexpat-2.6.0-backport-15.6.patch
+++ b/CVE-2023-52425-libexpat-2.6.0-backport-15.6.patch
@@ -4,9 +4,11 @@
Lib/test/test_xml_etree.py | 10 ++++++++++
3 files changed, 17 insertions(+)
---- a/Lib/test/test_pyexpat.py
-+++ b/Lib/test/test_pyexpat.py
-@@ -794,6 +794,10 @@ class ReparseDeferralTest(unittest.TestC
+Index: Python-3.12.10/Lib/test/test_pyexpat.py
+===================================================================
+--- Python-3.12.10.orig/Lib/test/test_pyexpat.py 2025-04-11 21:04:45.031445243 +0200
++++ Python-3.12.10/Lib/test/test_pyexpat.py 2025-04-11 21:16:30.736034401 +0200
+@@ -794,6 +794,10 @@
self.assertEqual(started, ['doc'])
def test_reparse_deferral_disabled(self):
@@ -17,9 +19,11 @@
started = []
def start_element(name, _):
---- a/Lib/test/test_sax.py
-+++ b/Lib/test/test_sax.py
-@@ -1240,6 +1240,9 @@ class ExpatReaderTest(XmlTestBase):
+Index: Python-3.12.10/Lib/test/test_sax.py
+===================================================================
+--- Python-3.12.10.orig/Lib/test/test_sax.py 2025-04-11 21:04:45.061811205 +0200
++++ Python-3.12.10/Lib/test/test_sax.py 2025-04-11 21:16:30.736607523 +0200
+@@ -1240,6 +1240,9 @@
self.assertEqual(result.getvalue(), start + b"")
@@ -29,11 +33,13 @@
def test_flush_reparse_deferral_disabled(self):
result = BytesIO()
xmlgen = XMLGenerator(result)
---- a/Lib/test/test_xml_etree.py
-+++ b/Lib/test/test_xml_etree.py
-@@ -121,6 +121,11 @@ ATTLIST_XML = """\
-
- """
+Index: Python-3.12.10/Lib/test/test_xml_etree.py
+===================================================================
+--- Python-3.12.10.orig/Lib/test/test_xml_etree.py 2025-04-11 21:04:45.473815938 +0200
++++ Python-3.12.10/Lib/test/test_xml_etree.py 2025-04-11 21:16:30.737465180 +0200
+@@ -138,6 +138,11 @@
+ return mock.patch.object(cls, "__eq__", autospec=True, wraps=eq)
+
+IS_SLE_15_6 = os.environ.get("SLE_VERSION", "") == "0150600"
+fails_with_expat_2_6_0 = (unittest.expectedFailure
@@ -43,7 +49,7 @@
def checkwarnings(*filters, quiet=False):
def decorator(test):
def newtest(*args, **kwargs):
-@@ -1424,9 +1429,11 @@ class XMLPullParserTest(unittest.TestCas
+@@ -1441,9 +1446,11 @@
self.assert_event_tags(parser, [('end', 'root')])
self.assertIsNone(parser.close())
@@ -55,7 +61,7 @@
def test_simple_xml_chunk_5(self):
self.test_simple_xml(chunk_size=5, flush=True)
-@@ -1651,6 +1658,9 @@ class XMLPullParserTest(unittest.TestCas
+@@ -1668,6 +1675,9 @@
self.assert_event_tags(parser, [('end', 'doc')])
diff --git a/F00251-change-user-install-location.patch b/F00251-change-user-install-location.patch
index f6e4f6d..02973fe 100644
--- a/F00251-change-user-install-location.patch
+++ b/F00251-change-user-install-location.patch
@@ -28,9 +28,11 @@ Co-authored-by: Lumír Balhar
Lib/test/test_sysconfig.py | 17 +++++++++++++--
2 files changed, 65 insertions(+), 3 deletions(-)
---- a/Lib/sysconfig.py
-+++ b/Lib/sysconfig.py
-@@ -104,6 +104,11 @@ if os.name == 'nt':
+Index: Python-3.12.10/Lib/sysconfig.py
+===================================================================
+--- Python-3.12.10.orig/Lib/sysconfig.py 2025-04-11 21:04:43.494305425 +0200
++++ Python-3.12.10/Lib/sysconfig.py 2025-04-11 21:04:51.517931810 +0200
+@@ -104,6 +104,11 @@
else:
_INSTALL_SCHEMES['venv'] = _INSTALL_SCHEMES['posix_venv']
@@ -42,7 +44,7 @@ Co-authored-by: Lumír Balhar
# NOTE: site.py has copy of this function.
# Sync it when modify this function.
-@@ -163,13 +168,28 @@ if _HAS_USER_BASE:
+@@ -163,13 +168,28 @@
},
}
@@ -71,7 +73,7 @@ Co-authored-by: Lumír Balhar
_BASE_EXEC_PREFIX = os.path.normpath(sys.base_exec_prefix)
# Mutex guarding initialization of _CONFIG_VARS.
_CONFIG_VARS_LOCK = threading.RLock()
-@@ -261,11 +281,40 @@ def _extend_dict(target_dict, other_dict
+@@ -268,11 +288,40 @@
target_dict[key] = value
@@ -113,9 +115,11 @@ Co-authored-by: Lumír Balhar
if os.name == 'nt':
# On Windows we want to substitute 'lib' for schemes rather
# than the native value (without modifying vars, in case it
---- a/Lib/test/test_sysconfig.py
-+++ b/Lib/test/test_sysconfig.py
-@@ -119,8 +119,19 @@ class TestSysConfig(unittest.TestCase):
+Index: Python-3.12.10/Lib/test/test_sysconfig.py
+===================================================================
+--- Python-3.12.10.orig/Lib/test/test_sysconfig.py 2025-04-11 21:04:45.175417431 +0200
++++ Python-3.12.10/Lib/test/test_sysconfig.py 2025-04-11 21:04:51.518393464 +0200
+@@ -119,8 +119,19 @@
for scheme in _INSTALL_SCHEMES:
for name in _INSTALL_SCHEMES[scheme]:
expected = _INSTALL_SCHEMES[scheme][name].format(**config_vars)
@@ -136,7 +140,7 @@ Co-authored-by: Lumír Balhar
os.path.normpath(expected),
)
-@@ -353,7 +364,7 @@ class TestSysConfig(unittest.TestCase):
+@@ -353,7 +364,7 @@
self.assertTrue(os.path.isfile(config_h), config_h)
def test_get_scheme_names(self):
@@ -145,7 +149,7 @@ Co-authored-by: Lumír Balhar
if HAS_USER_BASE:
wanted.extend(['nt_user', 'osx_framework_user', 'posix_user'])
self.assertEqual(get_scheme_names(), tuple(sorted(wanted)))
-@@ -365,6 +376,8 @@ class TestSysConfig(unittest.TestCase):
+@@ -365,6 +376,8 @@
cmd = "-c", "import sysconfig; print(sysconfig.get_platform())"
self.assertEqual(py.call_real(*cmd), py.call_link(*cmd))
diff --git a/Python-3.12.10.tar.xz b/Python-3.12.10.tar.xz
new file mode 100644
index 0000000..a673e29
--- /dev/null
+++ b/Python-3.12.10.tar.xz
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:07ab697474595e06f06647417d3c7fa97ded07afc1a7e4454c5639919b46eaea
+size 20520960
diff --git a/Python-3.12.10.tar.xz.asc b/Python-3.12.10.tar.xz.asc
new file mode 100644
index 0000000..8283288
--- /dev/null
+++ b/Python-3.12.10.tar.xz.asc
@@ -0,0 +1,18 @@
+-----BEGIN PGP SIGNATURE-----
+
+iQKTBAABCgB9FiEEcWlgX2LHUTVtBUomqCHmgOX6YwUFAmf1EjJfFIAAAAAALgAo
+aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDcx
+Njk2MDVGNjJDNzUxMzU2RDA1NEEyNkE4MjFFNjgwRTVGQTYzMDUACgkQqCHmgOX6
+YwXAwBAAncWm4sMrSvGW4bgyp7bHE0CeaA9ErIq55CmHfigrlxPKQUYVlzj38N7H
+MVlpmqZSQ8wqDFy3gN0QeCXBGapxgO2dEcrgy5HxvtktXge25j1f7LvVraSFB9/F
+DrOCZr54gVrE/r0242f1JmJQ1BDeMDSUbEYE6fd0xqWYCZ2xpzvYmQG/+6jD5FFC
+UE6PYxJlq+rfSawj974//BDhrY4hZ3g0xxyiyhfXBBYMhZO3OzCckrAD5zZOQfNE
+y/JK94nVWXLU/Lx3R+L7TvJgJ3ej4ggq5LRwrn09GU5jExwyITh4yUO7i56vbmvx
+EtOobQC0RVz/xrsciJ4Gn3zByaO0XPjrGaCOU53nCsNlfJcBQhj2UQpum8CL9S9C
+BJPCV4jL+Mo8EL91cJTyX4LqFoAXayMwPS0HKVOvYn33+pmVNe+duY/UjUpG50kw
+jdsHbKAthh8QbSIO0VPk4eH3pVEQ3O9aG+3r/puGjPRWG8CMyLbQUVmlj4Sh3/Kh
+vh7ydOjzJeuIUhAmFOLLqYG4mah71q1yBXx9jhyxzQSwvyoQaQwgpA+Yn+yB1bXy
+ttxp2r4fS0ZvGYB44C1WrAxeKRI+J1z19i1IYMc2bV6SfSBoU9AaJqh2o4dMHHUS
+F3Ko4UTyjU4bTfI18dCs2OgUEED6BAe5cs3ZyqDm3zL4fGIgNXs=
+=k0VQ
+-----END PGP SIGNATURE-----
diff --git a/Python-3.12.10.tar.xz.sigstore b/Python-3.12.10.tar.xz.sigstore
new file mode 100644
index 0000000..edb8a40
--- /dev/null
+++ b/Python-3.12.10.tar.xz.sigstore
@@ -0,0 +1 @@
+{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICyDCCAk+gAwIBAgIUV/pqMus1I52YzHj6d8XivxhMQIUwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwNDA4MTIxMTIwWhcNMjUwNDA4MTIyMTIwWjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWygZnqBGHMJ6qn1QvD7+VsHJruX4Z3T9PUzXTmbl/fpD/n1GPY3Mp5pB50d6U2rfpbCSYERgppKvcuykX9qTaaOCAW4wggFqMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUt8+5h4MSS5dk0L9D1ytJzB5Vs7QwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHwYDVR0RAQH/BBUwE4ERdGhvbWFzQHB5dGhvbi5vcmcwKQYKKwYBBAGDvzABAQQbaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tMCsGCisGAQQBg78wAQgEHQwbaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tMIGJBgorBgEEAdZ5AgQCBHsEeQB3AHUA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGWFU/nEwAABAMARjBEAiBIlU/EjElPuHeg0S/ByFOF7MDUsJus2IcrFZ1jOj/D1wIgEugM3UFxN3SFgLU+K9GMo6rciVW+P+9SQxiSrXDydrwwCgYIKoZIzj0EAwMDZwAwZAIwNkqoiOIKLy1qh7S7nijCh3pmS8ol+lP9vR19kzBLU0UseRpk/RHJQKL/aUHdFuOsAjBfHDXC7SC/3/659CBDEDR8tjGHB0wrgTOr3askW3HD70Xjnkgh6FCnrRTb3fLVKCE="}, "tlogEntries": [{"logIndex": "193829212", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1744114280", "inclusionPromise": {"signedEntryTimestamp": "MEUCIQDBIo5pHwogbg/goPtkWgVyz8zFP/olU2b+OU3SrU1TxQIgGh9u+YsN9LPcQTyoa6wCQmcwyEixANgLIfSb9iMDj04="}, "inclusionProof": {"logIndex": "71924950", "rootHash": "UjYqyELsc0qjUIHDSygvBe1JfXf3lGvpJDFvzqH7MWY=", "treeSize": "71924951", "hashes": ["o8iZ18aF/C6mMqtk487ge7PxtY95U6iXJ8aGmYXsDgU=", "Fw/vO9/kdamS2X70S5CmsF2B31S2RUX9ey/YY6DCQdE=", "1SHDD4NA+lqeJ7CG3KQuHpxGYl96AfqFn35U2bXxa2M=", "5yOaWkOXu1U6FhwkSs/Q5LvlfzKaoIDmsjZuCp7d9+o=", "wwcWBqOQyJLSK5Nwv8la9mGM4JTdemmwnHJxjdS2+zM=", "TzNxImLzqcFj7Mw6ijhc3K+oqOOChRwEsN45HmmR5Dg=", "HuWZg7u4+Jt1xi9OThUa81qCPhcfNnk7f65sB+Ydo+4=", "Uhh7+7E3v+7XORukXCZuNmoD2orl9UZRSHY0l4VjPKk=", "3KxPDv8uRtvXjzsH0IV9lZeXU31GVI2JE78JftFzcgM=", "ZiXTzR4fu03x4ORDazcYIvmdsRcp0oLWMY0I0ewiDRw=", "wz8AVqzGBjixNiXtnCb16MFP7zOW54eYx/zJ/1Jey/E=", "K26LG80DXyb+bC58c4Nw00WigG52v0PCsZGY3ExGsts=", "WEm5OgPzJpYROv+4CcrieexCYyQKrLUH3hbxmcQQ+DM=", "7v8qPHNDLerpduaMx06eb/MwgoQwczTn/cYGKX/9wZ4="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n71924951\nUjYqyELsc0qjUIHDSygvBe1JfXf3lGvpJDFvzqH7MWY=\n\n\u2014 rekor.sigstore.dev wNI9ajBEAiAcWE2EYs/YqdFFFfYRhXj7zoff3e6rDoGaffPaGnpWBwIgGaYvZPKB8qJLWt1KDBCDbqm7yqfGt7n3dErdPpIi1Xg=\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiIwN2FiNjk3NDc0NTk1ZTA2ZjA2NjQ3NDE3ZDNjN2ZhOTdkZWQwN2FmYzFhN2U0NDU0YzU2Mzk5MTliNDZlYWVhIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FWUNJUURHYVBYbVZicnBHaEFQTS9hQ0VvOXFZWFN1V2hVUWNZOHp1bDVxWEJialpRSWhBTVFnOGpkM01BYm43WUw0Tk9IK1JpUjZaWE5hWStsTGk4K2dzWUNpR25ZRyIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjVSRU5EUVdzclowRjNTVUpCWjBsVlZpOXdjVTExY3pGSk5USlpla2hxTm1RNFdHbDJlR2hOVVVsVmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDVFUVRSTlZFbDRUVlJKZDFkb1kwNU5hbFYzVGtSQk5FMVVTWGxOVkVsM1YycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZYZVdkYWJuRkNSMGhOU2paeGJqRlJka1EzSzFaelNFcHlkVmcwV2pOVU9WQlZlbGdLVkcxaWJDOW1jRVF2YmpGSFVGa3pUWEExY0VJMU1HUTJWVEp5Wm5CaVExTlpSVkpuY0hCTGRtTjFlV3RZT1hGVVlXRlBRMEZYTkhkblowWnhUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlYwT0NzMUNtZzBUVk5UTldSck1FdzVSREY1ZEVwNlFqVldjemRSZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoM1dVUldVakJTUVZGSUwwSkNWWGRGTkVWU1pFZG9kbUpYUm5wUlNFSTFaRWRvZG1KcE5YWmpiV04zUzFGWlMwdDNXVUpDUVVkRWRucEJRZ3BCVVZGaVlVaFNNR05JVFRaTWVUbG9XVEpPZG1SWE5UQmplVFZ1WWpJNWJtSkhWWFZaTWpsMFRVTnpSME5wYzBkQlVWRkNaemM0ZDBGUlowVklVWGRpQ21GSVVqQmpTRTAyVEhrNWFGa3lUblprVnpVd1kzazFibUl5T1c1aVIxVjFXVEk1ZEUxSlIwcENaMjl5UW1kRlJVRmtXalZCWjFGRFFraHpSV1ZSUWpNS1FVaFZRVE5VTUhkaGMySklSVlJLYWtkU05HTnRWMk16UVhGS1MxaHlhbVZRU3pNdmFEUndlV2RET0hBM2J6UkJRVUZIVjBaVkwyNUZkMEZCUWtGTlFRcFNha0pGUVdsQ1NXeFZMMFZxUld4UWRVaGxaekJUTDBKNVJrOUdOMDFFVlhOS2RYTXlTV055UmxveGFrOXFMMFF4ZDBsblJYVm5UVE5WUm5oT00xTkdDbWRNVlN0TE9VZE5ielp5WTJsV1Z5dFFLemxUVVhocFUzSllSSGxrY25kM1EyZFpTVXR2V2tsNmFqQkZRWGROUkZwM1FYZGFRVWwzVG10eGIybFBTVXNLVEhreGNXZzNVemR1YVdwRGFETndiVk00YjJ3cmJGQTVkbEl4T1d0NlFreFZNRlZ6WlZKd2F5OVNTRXBSUzB3dllWVklaRVoxVDNOQmFrSm1TRVJZUXdvM1UwTXZNeTgyTlRsRFFrUkZSRkk0ZEdwSFNFSXdkM0puVkU5eU0yRnphMWN6U0VRM01GaHFibXRuYURaR1EyNXlVbFJpTTJaTVZrdERSVDBLTFMwdExTMUZUa1FnUTBWU1ZFbEdTVU5CVkVVdExTMHRMUW89In19fX0="}], "timestampVerificationData": {}}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "B6tpdHRZXgbwZkdBfTx/qX3tB6/Bp+RFTFY5kZtG6uo="}, "signature": "MEYCIQDGaPXmVbrpGhAPM/aCEo9qYXSuWhUQcY8zul5qXBbjZQIhAMQg8jd3MAbn7YL4NOH+RiR6ZXNaY+lLi8+gsYCiGnYG"}}
diff --git a/Python-3.12.9.tar.xz b/Python-3.12.9.tar.xz
deleted file mode 100644
index 7dc0d12..0000000
--- a/Python-3.12.9.tar.xz
+++ /dev/null
@@ -1,3 +0,0 @@
-version https://git-lfs.github.com/spec/v1
-oid sha256:7220835d9f90b37c006e9842a8dff4580aaca4318674f947302b8d28f3f81112
-size 20502440
diff --git a/Python-3.12.9.tar.xz.asc b/Python-3.12.9.tar.xz.asc
deleted file mode 100644
index d024ab7..0000000
--- a/Python-3.12.9.tar.xz.asc
+++ /dev/null
@@ -1,18 +0,0 @@
------BEGIN PGP SIGNATURE-----
-
-iQKTBAABCgB9FiEEcWlgX2LHUTVtBUomqCHmgOX6YwUFAmeiX7JfFIAAAAAALgAo
-aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldDcx
-Njk2MDVGNjJDNzUxMzU2RDA1NEEyNkE4MjFFNjgwRTVGQTYzMDUACgkQqCHmgOX6
-YwXTqw//VlGJA5CRDfljMwN9BmG2hdXB1B7Lj0PssuAo4A/lH99gb4DRVDS9LNjr
-99WdH/fQQovx6rTbtyJnN8Vh7SSduBi/vOc5n5VOXZB0buqR0l+0wu4m43Slu6xP
-fXO349Hr6585lemU8x54TrP756rSVUhy3T+krUuNDL9W1Wrp2yDCpt4tUoEhNXGw
-DoYS8MrK/ygLNV/7p2DeMWOHNdbjKNH6rfzl60IAwAp7oANcyoj6Pho960bbeUDo
-tb47Pw0WWZv3EuITP6bPa8+Z6dj096cFL3AQJ3ap16OduwiaOsGhqTfe4+kbp6ut
-Gp/1HeIHzPbEV0E5K78RWHuzBYgU1oPGiMjlp7WkA7bP2OSTF7nM4EBkiiihk2qx
-3d5VF9wpVRJ4AuR/aWcWcMnvD2ziSWfzZM3Z3VLnTaWYpuRkQp8TTiFr1vHqxMYm
-p/8AozzBJMfOS6u/Q0WNAdk6x3VB0DXnTAETXQVIrex4DXqX/3WSMWK5/x/OyCh9
-ytdreIQYbv1KvlNQJkgpPb7jlUSXp8t9fHCXt4hszhJgtjwIj/+CuSeAgX0bhopV
-XsqOBseDNhATg38mhwBVaeFKGRpxsKdpxcdqSEGKuhXtEI/hJmkpZGw49gy3xWxB
-KlgRgKjCPw+BGAIVV9qvdtJzam8a09SKVcslqgF619q0byQoBmo=
-=1TbP
------END PGP SIGNATURE-----
diff --git a/Python-3.12.9.tar.xz.sigstore b/Python-3.12.9.tar.xz.sigstore
deleted file mode 100644
index 1403d92..0000000
--- a/Python-3.12.9.tar.xz.sigstore
+++ /dev/null
@@ -1 +0,0 @@
-{"mediaType": "application/vnd.dev.sigstore.bundle.v0.3+json", "verificationMaterial": {"certificate": {"rawBytes": "MIICzDCCAlGgAwIBAgIURTUfXRvqHjmDrUaHk+FetMa/yUIwCgYIKoZIzj0EAwMwNzEVMBMGA1UEChMMc2lnc3RvcmUuZGV2MR4wHAYDVQQDExVzaWdzdG9yZS1pbnRlcm1lZGlhdGUwHhcNMjUwMjA0MTg0NDI1WhcNMjUwMjA0MTg1NDI1WjAAMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAERw4E88OE+Kka1dO54CLpErUU6fdlwMd6ChuL9rXtu8kq8xC6gbNjsVqN1bFBdDsRe8+EpP7VT7T0X7oto90xb6OCAXAwggFsMA4GA1UdDwEB/wQEAwIHgDATBgNVHSUEDDAKBggrBgEFBQcDAzAdBgNVHQ4EFgQUNGXX3GOz7CXqRAPGCpmWTcOuEbEwHwYDVR0jBBgwFoAU39Ppz1YkEZb5qNjpKFWixi4YZD8wHwYDVR0RAQH/BBUwE4ERdGhvbWFzQHB5dGhvbi5vcmcwKQYKKwYBBAGDvzABAQQbaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tMCsGCisGAQQBg78wAQgEHQwbaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tMIGLBgorBgEEAdZ5AgQCBH0EewB5AHcA3T0wasbHETJjGR4cmWc3AqJKXrjePK3/h4pygC8p7o4AAAGU0kcjwAAABAMASDBGAiEA88w9QbNsdJkrlbcJRDfDc5zN3M9iZTy+FOEmWF4llxYCIQDQOMoLvyJ5epD8bjP4ZJtkawsrINglKoTZbNTVukd7IjAKBggqhkjOPQQDAwNpADBmAjEAjzAEFF4PV7TKUZPtsEg5vPlBqTF6TM9xdnmX8RPXTXdDw+UjhK16cjgbc2PWb4/xAjEA4HgAk8dxEyw4filZ7a7M8XJbZIX5CNlsE8OAz1gVCbtlxYv9BnF0R1GPnZv6pJrM"}, "tlogEntries": [{"logIndex": "168669956", "logId": {"keyId": "wNI9atQGlz+VWfO6LRygH4QUfY/8W4RFwiT5i5WRgB0="}, "kindVersion": {"kind": "hashedrekord", "version": "0.0.1"}, "integratedTime": "1738694665", "inclusionPromise": {"signedEntryTimestamp": "MEYCIQDVmal6r4YwWZnRFAhkxtBuhC9DkI8edAE3TDtWeATI8QIhANxiG29sGfPL9neccap5pApPdpGNw7HUrcg2f/plSQaL"}, "inclusionProof": {"logIndex": "46765694", "rootHash": "tHDnjyWM1D0S/LMxPKpbA2ARX0nDJAIaiSJkEfAUt80=", "treeSize": "46765695", "hashes": ["MbM4b1IdzMcxrM0M3G0WRC6T9I04Nb9U2Ndsw9Iu8Kg=", "reCjGqzdYRJnPDpm1ah+58Nk8fWzbdDcnQRY4aLgnac=", "ffOkE+U7rrMFDm2qwCD3MfwiTo2njwK9PY4QIryK4yU=", "vfQF1SCq0+eofmO26+YjbYtOmw9myoV+5CV4JF4ZcL0=", "nhUF67tgV9eCOCZ/5rpk46g6Um0PL25g3oTmMl/VkpA=", "SkkhuNxwaCK56utv2d4O0v1RFIcnU5lTVMq89IZtWaE=", "5S8IyLnwlAhLZBEUNH1SaLO2dckc8NKwnGVgAO+3QQI=", "3onlfMyeVMDSIvH0BhkTTMYIWUuOZa+vitTl74eA7yo=", "TgYmpZ2JTTWko4kWZxTIAYkJpJpeOjVCg6ICKYnUS+8=", "PAMmlBIG22MGowjyiChYp5iB6NiTRa0xKI2vnvpExek=", "NS61TOUCaTiUJotPDnr7bTP/1ogKsWSnbgDlk1uvGzM=", "MvEBWaRrd43Pq04mjOFzGW9RiqBSzMBfuFXKBIVtQnc=", "Zse3BPkR/cJv62LvVuiDH+EpgIE5v3V3qXdG8HQFf1A=", "jU9+tgjTIKUYGeU7T7RjqyL+F+gFV9tCdwX2GZ1UtQs=", "vemyaMj0Na1LMjbB/9Dmkq8T+jAb3o+yCESgAayUABU="], "checkpoint": {"envelope": "rekor.sigstore.dev - 1193050959916656506\n46765695\ntHDnjyWM1D0S/LMxPKpbA2ARX0nDJAIaiSJkEfAUt80=\n\n\u2014 rekor.sigstore.dev wNI9ajBFAiEAuCYs8aQChh+nY0StyUwt2eomG176aNsYT003B5N0Z90CIFtuoa7y2G4hHRVQx+lqO60qXMe4RzklsY59A1S70VZP\n"}}, "canonicalizedBody": "eyJhcGlWZXJzaW9uIjoiMC4wLjEiLCJraW5kIjoiaGFzaGVkcmVrb3JkIiwic3BlYyI6eyJkYXRhIjp7Imhhc2giOnsiYWxnb3JpdGhtIjoic2hhMjU2IiwidmFsdWUiOiI3MjIwODM1ZDlmOTBiMzdjMDA2ZTk4NDJhOGRmZjQ1ODBhYWNhNDMxODY3NGY5NDczMDJiOGQyOGYzZjgxMTEyIn19LCJzaWduYXR1cmUiOnsiY29udGVudCI6Ik1FVUNJUUNPL2ozUHRyK1QwQU4yVHZMdlpXaVdpSHdmWno2ZDhoaXNWcXpBcWd3SlRRSWdTb1RpSGpScjlWeXN0YW5OTUtCYUhVZnIzUnkxdGovck1UMVFjVVlGTndvPSIsInB1YmxpY0tleSI6eyJjb250ZW50IjoiTFMwdExTMUNSVWRKVGlCRFJWSlVTVVpKUTBGVVJTMHRMUzB0Q2sxSlNVTjZSRU5EUVd4SFowRjNTVUpCWjBsVlVsUlZabGhTZG5GSWFtMUVjbFZoU0dzclJtVjBUV0V2ZVZWSmQwTm5XVWxMYjFwSmVtb3dSVUYzVFhjS1RucEZWazFDVFVkQk1WVkZRMmhOVFdNeWJHNWpNMUoyWTIxVmRWcEhWakpOVWpSM1NFRlpSRlpSVVVSRmVGWjZZVmRrZW1SSE9YbGFVekZ3WW01U2JBcGpiVEZzV2tkc2FHUkhWWGRJYUdOT1RXcFZkMDFxUVRCTlZHY3dUa1JKTVZkb1kwNU5hbFYzVFdwQk1FMVVaekZPUkVreFYycEJRVTFHYTNkRmQxbElDa3R2V2tsNmFqQkRRVkZaU1V0dldrbDZhakJFUVZGalJGRm5RVVZTZHpSRk9EaFBSU3RMYTJFeFpFODFORU5NY0VWeVZWVTJabVJzZDAxa05rTm9kVXdLT1hKWWRIVTRhM0U0ZUVNMloySk9hbk5XY1U0eFlrWkNaRVJ6VW1VNEswVndVRGRXVkRkVU1GZzNiM1J2T1RCNFlqWlBRMEZZUVhkblowWnpUVUUwUndwQk1WVmtSSGRGUWk5M1VVVkJkMGxJWjBSQlZFSm5UbFpJVTFWRlJFUkJTMEpuWjNKQ1owVkdRbEZqUkVGNlFXUkNaMDVXU0ZFMFJVWm5VVlZPUjFoWUNqTkhUM28zUTFoeFVrRlFSME53YlZkVVkwOTFSV0pGZDBoM1dVUldVakJxUWtKbmQwWnZRVlV6T1ZCd2VqRlphMFZhWWpWeFRtcHdTMFpYYVhocE5Ga0tXa1E0ZDBoM1dVUldVakJTUVZGSUwwSkNWWGRGTkVWU1pFZG9kbUpYUm5wUlNFSTFaRWRvZG1KcE5YWmpiV04zUzFGWlMwdDNXVUpDUVVkRWRucEJRZ3BCVVZGaVlVaFNNR05JVFRaTWVUbG9XVEpPZG1SWE5UQmplVFZ1WWpJNWJtSkhWWFZaTWpsMFRVTnpSME5wYzBkQlVWRkNaemM0ZDBGUlowVklVWGRpQ21GSVVqQmpTRTAyVEhrNWFGa3lUblprVnpVd1kzazFibUl5T1c1aVIxVjFXVEk1ZEUxSlIweENaMjl5UW1kRlJVRmtXalZCWjFGRFFrZ3dSV1YzUWpVS1FVaGpRVE5VTUhkaGMySklSVlJLYWtkU05HTnRWMk16UVhGS1MxaHlhbVZRU3pNdmFEUndlV2RET0hBM2J6UkJRVUZIVlRCclkycDNRVUZCUWtGTlFRcFRSRUpIUVdsRlFUZzRkemxSWWs1elpFcHJjbXhpWTBwU1JHWkVZelY2VGpOTk9XbGFWSGtyUms5RmJWZEdOR3hzZUZsRFNWRkVVVTlOYjB4MmVVbzFDbVZ3UkRoaWFsQTBXa3AwYTJGM2MzSkpUbWRzUzI5VVdtSk9WRloxYTJRM1NXcEJTMEpuWjNGb2EycFBVRkZSUkVGM1RuQkJSRUp0UVdwRlFXcDZRVVVLUmtZMFVGWTNWRXRWV2xCMGMwVm5OWFpRYkVKeFZFWTJWRTA1ZUdSdWJWZzRVbEJZVkZoa1JIY3JWV3BvU3pFMlkycG5ZbU15VUZkaU5DOTRRV3BGUVFvMFNHZEJhemhrZUVWNWR6Um1hV3hhTjJFM1RUaFlTbUphU1ZnMVEwNXNjMFU0VDBGNk1XZFdRMkowYkhoWmRqbENia1l3VWpGSFVHNWFkalp3U25KTkNpMHRMUzB0UlU1RUlFTkZVbFJKUmtsRFFWUkZMUzB0TFMwSyJ9fX19"}], "timestampVerificationData": {}}, "messageSignature": {"messageDigest": {"algorithm": "SHA2_256", "digest": "ciCDXZ+Qs3wAbphCqN/0WAqspDGGdPlHMCuNKPP4ERI="}, "signature": "MEUCIQCO/j3Ptr+T0AN2TvLvZWiWiHwfZz6d8hisVqzAqgwJTQIgSoTiHjRr9VystanNMKBaHUfr3Ry1tj/rMT1QcUYFNwo="}}
diff --git a/bpo-31046_ensurepip_honours_prefix.patch b/bpo-31046_ensurepip_honours_prefix.patch
index 4faebdb..0459cf5 100644
--- a/bpo-31046_ensurepip_honours_prefix.patch
+++ b/bpo-31046_ensurepip_honours_prefix.patch
@@ -5,30 +5,32 @@ Subject: [PATCH] bpo-31046: ensurepip does not honour the value of $(prefix)
Co-Authored-By: Xavier de Gaye
---
- Doc/library/ensurepip.rst | 9 +++--
+ 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, 34 insertions(+), 9 deletions(-)
+ 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.12.4/Doc/library/ensurepip.rst
+Index: Python-3.12.10/Doc/library/ensurepip.rst
===================================================================
---- Python-3.12.4.orig/Doc/library/ensurepip.rst
-+++ Python-3.12.4/Doc/library/ensurepip.rst
-@@ -59,8 +59,9 @@ is at least as recent as the one availab
+--- Python-3.12.10.orig/Doc/library/ensurepip.rst 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/library/ensurepip.rst 2025-04-11 21:16:06.140273604 +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.
-+* ``--prefix ``: Installs ``pip`` using the given directory prefix.
- * :samp:`--root {dir}`: Installs ``pip`` relative to the given root directory
- rather than the root of the currently active virtual environment (if any)
- or the default root for the current Python installation.
-@@ -92,7 +93,7 @@ Module API
+ .. option:: --root
+
+@@ -102,7 +106,7 @@
Returns a string specifying the available version of pip that will be
installed when bootstrapping an environment.
@@ -37,7 +39,7 @@ Index: Python-3.12.4/Doc/library/ensurepip.rst
altinstall=False, default_pip=False, \
verbosity=0)
-@@ -102,6 +103,8 @@ Module API
+@@ -112,6 +116,8 @@
If *root* is ``None``, then installation uses the default install location
for the current environment.
@@ -46,7 +48,7 @@ Index: Python-3.12.4/Doc/library/ensurepip.rst
*upgrade* indicates whether or not to upgrade an existing installation
of an earlier version of ``pip`` to the available version.
-@@ -122,6 +125,8 @@ Module API
+@@ -132,6 +138,8 @@
*verbosity* controls the level of output to :data:`sys.stdout` from the
bootstrapping operation.
@@ -55,11 +57,11 @@ Index: Python-3.12.4/Doc/library/ensurepip.rst
.. audit-event:: ensurepip.bootstrap root ensurepip.bootstrap
.. note::
-Index: Python-3.12.4/Lib/ensurepip/__init__.py
+Index: Python-3.12.10/Lib/ensurepip/__init__.py
===================================================================
---- Python-3.12.4.orig/Lib/ensurepip/__init__.py
-+++ Python-3.12.4/Lib/ensurepip/__init__.py
-@@ -120,27 +120,27 @@ def _disable_pip_configuration_settings(
+--- Python-3.12.10.orig/Lib/ensurepip/__init__.py 2025-04-11 21:04:42.789443156 +0200
++++ Python-3.12.10/Lib/ensurepip/__init__.py 2025-04-11 21:13:01.303399067 +0200
+@@ -120,27 +120,27 @@
os.environ['PIP_CONFIG_FILE'] = os.devnull
@@ -92,7 +94,7 @@ Index: Python-3.12.4/Lib/ensurepip/__init__.py
Note that calling this function will alter both sys.path and os.environ.
"""
-@@ -190,6 +190,8 @@ def _bootstrap(*, root=None, upgrade=Fal
+@@ -190,6 +190,8 @@
args = ["install", "--no-cache-dir", "--no-index", "--find-links", tmpdir]
if root:
args += ["--root", root]
@@ -101,7 +103,7 @@ Index: Python-3.12.4/Lib/ensurepip/__init__.py
if upgrade:
args += ["--upgrade"]
if user:
-@@ -265,6 +267,11 @@ def _main(argv=None):
+@@ -265,6 +267,11 @@
help="Install everything relative to this alternate root directory.",
)
parser.add_argument(
@@ -113,7 +115,7 @@ Index: Python-3.12.4/Lib/ensurepip/__init__.py
"--altinstall",
action="store_true",
default=False,
-@@ -283,6 +290,7 @@ def _main(argv=None):
+@@ -283,6 +290,7 @@
return _bootstrap(
root=args.root,
@@ -121,11 +123,11 @@ Index: Python-3.12.4/Lib/ensurepip/__init__.py
upgrade=args.upgrade,
user=args.user,
verbosity=args.verbosity,
-Index: Python-3.12.4/Lib/test/test_ensurepip.py
+Index: Python-3.12.10/Lib/test/test_ensurepip.py
===================================================================
---- Python-3.12.4.orig/Lib/test/test_ensurepip.py
-+++ Python-3.12.4/Lib/test/test_ensurepip.py
-@@ -105,6 +105,17 @@ class TestBootstrap(EnsurepipMixin, unit
+--- Python-3.12.10.orig/Lib/test/test_ensurepip.py 2025-04-11 21:04:44.274413027 +0200
++++ Python-3.12.10/Lib/test/test_ensurepip.py 2025-04-11 21:13:01.303691075 +0200
+@@ -105,6 +105,17 @@
unittest.mock.ANY,
)
@@ -143,11 +145,11 @@ Index: Python-3.12.4/Lib/test/test_ensurepip.py
def test_bootstrapping_with_user(self):
ensurepip.bootstrap(user=True)
-Index: Python-3.12.4/Makefile.pre.in
+Index: Python-3.12.10/Makefile.pre.in
===================================================================
---- Python-3.12.4.orig/Makefile.pre.in
-+++ Python-3.12.4/Makefile.pre.in
-@@ -1914,7 +1914,7 @@ install: @FRAMEWORKINSTALLFIRST@ commoni
+--- Python-3.12.10.orig/Makefile.pre.in 2025-04-11 21:04:58.388346212 +0200
++++ Python-3.12.10/Makefile.pre.in 2025-04-11 21:13:01.304095180 +0200
+@@ -1914,7 +1914,7 @@
install|*) ensurepip="" ;; \
esac; \
$(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \
@@ -156,7 +158,7 @@ Index: Python-3.12.4/Makefile.pre.in
fi
.PHONY: altinstall
-@@ -1925,7 +1925,7 @@ altinstall: commoninstall
+@@ -1925,7 +1925,7 @@
install|*) ensurepip="--altinstall" ;; \
esac; \
$(RUNSHARED) $(PYTHON_FOR_BUILD) -m ensurepip \
@@ -165,9 +167,9 @@ Index: Python-3.12.4/Makefile.pre.in
fi
.PHONY: commoninstall
-Index: Python-3.12.4/Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst
+Index: Python-3.12.10/Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst
===================================================================
---- /dev/null
-+++ Python-3.12.4/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.12.10/Misc/NEWS.d/next/Build/2019-12-16-17-50-42.bpo-31046.XA-Qfr.rst 2025-04-11 21:13:01.304672632 +0200
@@ -0,0 +1 @@
+A directory prefix can now be specified when using :mod:`ensurepip`.
diff --git a/doc-py38-to-py36.patch b/doc-py38-to-py36.patch
index b3ba20f..0ad76f7 100644
--- a/doc-py38-to-py36.patch
+++ b/doc-py38-to-py36.patch
@@ -11,9 +11,11 @@
Doc/tools/extensions/patchlevel.py | 9 ++---
10 files changed, 100 insertions(+), 84 deletions(-)
---- a/Doc/Makefile
-+++ b/Doc/Makefile
-@@ -14,15 +14,15 @@ PAPER =
+Index: Python-3.12.10/Doc/Makefile
+===================================================================
+--- Python-3.12.10.orig/Doc/Makefile 2025-04-11 21:04:46.171424996 +0200
++++ Python-3.12.10/Doc/Makefile 2025-04-11 21:18:23.184451081 +0200
+@@ -14,15 +14,15 @@
SOURCES =
DISTVERSION = $(shell $(PYTHON) tools/extensions/patchlevel.py)
REQUIREMENTS = requirements.txt
@@ -33,27 +35,29 @@
$(PAPEROPT_$(PAPER)) \
$(SPHINXOPTS) $(SPHINXERRORHANDLING) \
. build/$(BUILDER) $(SOURCES)
---- a/Doc/conf.py
-+++ b/Doc/conf.py
-@@ -10,6 +10,8 @@ import importlib
- import os
- import sys
+Index: Python-3.12.10/Doc/conf.py
+===================================================================
+--- Python-3.12.10.orig/Doc/conf.py 2025-04-11 21:04:42.254653936 +0200
++++ Python-3.12.10/Doc/conf.py 2025-04-11 21:18:44.605665782 +0200
+@@ -11,6 +11,8 @@
+ from importlib import import_module
+ from importlib.util import find_spec
+from sphinx import version_info
+
# Make our custom extensions available to Sphinx
sys.path.append(os.path.abspath('tools/extensions'))
sys.path.append(os.path.abspath('includes'))
-@@ -82,7 +84,7 @@ highlight_language = 'python3'
+@@ -87,7 +89,7 @@
# Minimum version of sphinx required
# Keep this version in sync with ``Doc/requirements.txt``.
--needs_sphinx = '8.1.3'
+-needs_sphinx = '8.2.0'
+needs_sphinx = '4.2.0'
# Create table of contents entries for domain objects (e.g. functions, classes,
# attributes, etc.). Default is True.
-@@ -337,7 +339,7 @@ html_short_title = f'{release} Documenta
+@@ -342,7 +344,7 @@
# (See .readthedocs.yml and https://docs.readthedocs.io/en/stable/reference/environment-variables.html)
is_deployment_preview = os.getenv("READTHEDOCS_VERSION_TYPE") == "external"
repository_url = os.getenv("READTHEDOCS_GIT_CLONE_URL", "")
@@ -62,7 +66,7 @@
html_context = {
"is_deployment_preview": is_deployment_preview,
"repository_url": repository_url or None,
-@@ -583,6 +585,16 @@ extlinks = {
+@@ -588,6 +590,16 @@
}
extlinks_detect_hardcoded_links = True
@@ -79,9 +83,11 @@
# Options for c_annotations extension
# -----------------------------------
---- a/Doc/tools/check-warnings.py
-+++ b/Doc/tools/check-warnings.py
-@@ -228,7 +228,8 @@ def fail_if_regression(
+Index: Python-3.12.10/Doc/tools/check-warnings.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/check-warnings.py 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/tools/check-warnings.py 2025-04-11 21:18:23.185204047 +0200
+@@ -228,7 +228,8 @@
print(filename)
for warning in warnings:
if filename in warning:
@@ -91,7 +97,7 @@
print(" {line}: {msg}".format_map(match))
return -1
return 0
-@@ -316,7 +317,7 @@ def main(argv: list[str] | None = None)
+@@ -316,7 +317,7 @@
cwd = str(Path.cwd()) + os.path.sep
files_with_nits = {
@@ -100,8 +106,10 @@
for warning in warnings
if "Doc/" in warning
}
---- a/Doc/tools/extensions/audit_events.py
-+++ b/Doc/tools/extensions/audit_events.py
+Index: Python-3.12.10/Doc/tools/extensions/audit_events.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/extensions/audit_events.py 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/tools/extensions/audit_events.py 2025-04-11 21:18:23.185493402 +0200
@@ -1,9 +1,6 @@
"""Support for documenting audit events."""
@@ -112,7 +120,7 @@
from docutils import nodes
from sphinx.errors import NoUri
-@@ -12,12 +9,11 @@ from sphinx.transforms.post_transforms i
+@@ -12,12 +9,11 @@
from sphinx.util import logging
from sphinx.util.docutils import SphinxDirective
@@ -129,7 +137,7 @@
logger = logging.getLogger(__name__)
-@@ -32,16 +28,16 @@ _SYNONYMS = [
+@@ -32,16 +28,16 @@
class AuditEvents:
def __init__(self) -> None:
@@ -150,7 +158,7 @@
) -> None:
if name in self.events:
self._check_args_match(name, args)
-@@ -49,7 +45,7 @@ class AuditEvents:
+@@ -49,7 +45,7 @@
self.events[name] = args
self.sources.setdefault(name, []).append(source)
@@ -159,7 +167,7 @@
current_args = self.events[name]
msg = (
f"Mismatched arguments for audit-event {name}: "
-@@ -60,7 +56,7 @@ class AuditEvents:
+@@ -60,7 +56,7 @@
if len(current_args) != len(args):
logger.warning(msg)
return
@@ -168,7 +176,7 @@
if a1 == a2:
continue
if any(a1 in s and a2 in s for s in _SYNONYMS):
-@@ -73,7 +69,7 @@ class AuditEvents:
+@@ -73,7 +69,7 @@
name_clean = re.sub(r"\W", "_", name)
return f"audit_event_{name_clean}_{source_count}"
@@ -177,7 +185,7 @@
for name in sorted(self.events.keys()):
yield name, self.events[name], self.sources[name]
-@@ -97,7 +93,7 @@ def audit_events_purge(
+@@ -97,7 +93,7 @@
def audit_events_merge(
app: Sphinx,
env: BuildEnvironment,
@@ -186,7 +194,7 @@
other: BuildEnvironment,
) -> None:
"""In Sphinx parallel builds, this merges audit_events from subprocesses."""
-@@ -126,14 +122,16 @@ class AuditEvent(SphinxDirective):
+@@ -126,14 +122,16 @@
),
]
@@ -209,7 +217,7 @@
else:
args = []
ids = []
-@@ -169,7 +167,7 @@ class audit_event_list(nodes.General, no
+@@ -169,7 +167,7 @@
class AuditEventListDirective(SphinxDirective):
@@ -218,7 +226,7 @@
return [audit_event_list()]
-@@ -181,7 +179,11 @@ class AuditEventListTransform(SphinxPost
+@@ -181,7 +179,11 @@
return
table = self._make_table(self.app.builder, self.env.docname)
@@ -231,7 +239,7 @@
node.replace_self(table)
def _make_table(self, builder: Builder, docname: str) -> nodes.table:
-@@ -217,8 +219,8 @@ class AuditEventListTransform(SphinxPost
+@@ -217,8 +219,8 @@
builder: Builder,
docname: str,
name: str,
@@ -242,8 +250,10 @@
) -> nodes.row:
row = nodes.row()
name_node = nodes.paragraph("", nodes.Text(name))
---- a/Doc/tools/extensions/availability.py
-+++ b/Doc/tools/extensions/availability.py
+Index: Python-3.12.10/Doc/tools/extensions/availability.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/extensions/availability.py 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/tools/extensions/availability.py 2025-04-11 21:18:23.185756636 +0200
@@ -1,8 +1,6 @@
"""Support for documenting platform availability"""
@@ -254,7 +264,7 @@
from docutils import nodes
from sphinx import addnodes
-@@ -53,7 +51,7 @@ class Availability(SphinxDirective):
+@@ -53,7 +51,7 @@
optional_arguments = 0
final_argument_whitespace = True
@@ -263,7 +273,7 @@
title = sphinx_gettext("Availability")
refnode = addnodes.pending_xref(
title,
-@@ -77,7 +75,7 @@ class Availability(SphinxDirective):
+@@ -77,7 +75,7 @@
return [cnode]
@@ -272,7 +282,7 @@
"""Parse platform information from arguments
Arguments is a comma-separated string of platforms. A platform may
-@@ -96,12 +94,13 @@ class Availability(SphinxDirective):
+@@ -96,12 +94,13 @@
platform, _, version = arg.partition(" >= ")
if platform.startswith("not "):
version = False
@@ -288,7 +298,7 @@
logger.warning(
"Unknown platform%s or syntax '%s' in '.. availability:: %s', "
"see %s:KNOWN_PLATFORMS for a set of known platforms.",
-@@ -114,7 +113,7 @@ class Availability(SphinxDirective):
+@@ -114,7 +113,7 @@
return platforms
@@ -297,9 +307,11 @@
app.add_directive("availability", Availability)
return {
---- a/Doc/tools/extensions/c_annotations.py
-+++ b/Doc/tools/extensions/c_annotations.py
-@@ -9,22 +9,18 @@ Configuration:
+Index: Python-3.12.10/Doc/tools/extensions/c_annotations.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/extensions/c_annotations.py 2025-04-11 21:16:39.007011463 +0200
++++ Python-3.12.10/Doc/tools/extensions/c_annotations.py 2025-04-11 21:18:23.185953242 +0200
+@@ -9,22 +9,18 @@
* Set ``stable_abi_file`` to the path to stable ABI list.
"""
@@ -325,7 +337,7 @@
ROLE_TO_OBJECT_TYPE = {
"func": "function",
-@@ -35,20 +31,20 @@ ROLE_TO_OBJECT_TYPE = {
+@@ -35,20 +31,20 @@
}
@@ -350,7 +362,7 @@
class StableABIEntry:
# Role of the object.
# Source: Each [item_kind] in stable_abi.toml is mapped to a C Domain role.
-@@ -67,7 +63,7 @@ class StableABIEntry:
+@@ -67,7 +63,7 @@
struct_abi_kind: str
@@ -359,7 +371,7 @@
refcount_data = {}
refcounts = refcount_filename.read_text(encoding="utf8")
for line in refcounts.splitlines():
-@@ -103,7 +99,7 @@ def read_refcount_data(refcount_filename
+@@ -103,7 +99,7 @@
return refcount_data
@@ -368,7 +380,7 @@
stable_abi_data = {}
with open(stable_abi_file, encoding="utf8") as fp:
for record in csv.DictReader(fp):
-@@ -127,11 +123,14 @@ def add_annotations(app: Sphinx, doctree
+@@ -127,11 +123,14 @@
continue
if not par[0].get("ids", None):
continue
@@ -385,7 +397,7 @@
if ROLE_TO_OBJECT_TYPE[record.role] != objtype:
msg = (
f"Object type mismatch in limited API annotation for {name}: "
-@@ -238,7 +237,7 @@ def _unstable_api_annotation() -> nodes.
+@@ -238,7 +237,7 @@
)
@@ -394,7 +406,7 @@
classes = ["refcount"]
if result_refs is None:
rc = sphinx_gettext("Return value: Always NULL.")
-@@ -258,7 +257,7 @@ class LimitedAPIList(SphinxDirective):
+@@ -258,7 +257,7 @@
optional_arguments = 0
final_argument_whitespace = True
@@ -403,7 +415,7 @@
state = self.env.domaindata["c_annotations"]
content = [
f"* :c:{record.role}:`{record.name}`"
-@@ -281,13 +280,23 @@ def init_annotations(app: Sphinx) -> Non
+@@ -281,13 +280,23 @@
)
@@ -428,8 +440,10 @@
return {
"version": "1.0",
"parallel_read_safe": True,
---- a/Doc/tools/extensions/changes.py
-+++ b/Doc/tools/extensions/changes.py
+Index: Python-3.12.10/Doc/tools/extensions/changes.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/extensions/changes.py 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/tools/extensions/changes.py 2025-04-11 21:18:23.186150755 +0200
@@ -1,7 +1,5 @@
"""Support for documenting version of changes, additions, deprecations."""
@@ -438,7 +452,7 @@
from typing import TYPE_CHECKING
from sphinx.domains.changeset import (
-@@ -25,7 +23,7 @@ def expand_version_arg(argument: str, re
+@@ -25,7 +23,7 @@
class PyVersionChange(VersionChange):
@@ -447,7 +461,7 @@
# Replace the 'next' special token with the current development version
self.arguments[0] = expand_version_arg(
self.arguments[0], self.config.release
-@@ -43,7 +41,7 @@ class DeprecatedRemoved(VersionChange):
+@@ -43,7 +41,7 @@
"Deprecated since version %s, removed in version %s"
)
@@ -456,7 +470,7 @@
# Replace the first two arguments (deprecated version and removed version)
# with a single tuple of both versions.
version_deprecated = expand_version_arg(
-@@ -73,7 +71,7 @@ class DeprecatedRemoved(VersionChange):
+@@ -73,7 +71,7 @@
versionlabel_classes[self.name] = ""
@@ -465,8 +479,10 @@
# Override Sphinx's directives with support for 'next'
app.add_directive("versionadded", PyVersionChange, override=True)
app.add_directive("versionchanged", PyVersionChange, override=True)
---- a/Doc/tools/extensions/glossary_search.py
-+++ b/Doc/tools/extensions/glossary_search.py
+Index: Python-3.12.10/Doc/tools/extensions/glossary_search.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/extensions/glossary_search.py 2025-04-11 21:16:39.007340209 +0200
++++ Python-3.12.10/Doc/tools/extensions/glossary_search.py 2025-04-11 21:18:23.186307620 +0200
@@ -1,18 +1,14 @@
"""Feature search results for glossary items prominently."""
@@ -488,7 +504,7 @@
logger = logging.getLogger(__name__)
-@@ -60,7 +56,7 @@ def write_glossary_json(app: Sphinx, _ex
+@@ -60,7 +56,7 @@
dest.write_text(json.dumps(app.env.glossary_terms), encoding='utf-8')
@@ -497,8 +513,10 @@
app.connect('doctree-resolved', process_glossary_nodes)
app.connect('build-finished', write_glossary_json)
---- a/Doc/tools/extensions/misc_news.py
-+++ b/Doc/tools/extensions/misc_news.py
+Index: Python-3.12.10/Doc/tools/extensions/misc_news.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/extensions/misc_news.py 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/tools/extensions/misc_news.py 2025-04-11 21:18:23.186501571 +0200
@@ -1,7 +1,5 @@
"""Support for including Misc/NEWS."""
@@ -507,7 +525,7 @@
import re
from pathlib import Path
from typing import TYPE_CHECKING
-@@ -24,13 +22,13 @@ Python News
+@@ -24,13 +22,13 @@
+++++++++++
"""
@@ -524,7 +542,7 @@
r"^what's new in (.*?)\??$", re.ASCII | re.IGNORECASE | re.MULTILINE
)
-@@ -42,7 +40,7 @@ class MiscNews(SphinxDirective):
+@@ -42,7 +40,7 @@
final_argument_whitespace = False
option_spec = {}
@@ -533,7 +551,7 @@
# Get content of NEWS file
source, _ = self.get_source_info()
news_file = Path(source).resolve().parent / self.arguments[0]
-@@ -54,7 +52,7 @@ class MiscNews(SphinxDirective):
+@@ -54,7 +52,7 @@
return [nodes.strong(text, text)]
# remove first 3 lines as they are the main heading
@@ -542,7 +560,7 @@
news_text = bpo_issue_re.sub(r":issue:`\1`", news_text)
# Fallback handling for GitHub issues
-@@ -65,7 +63,7 @@ class MiscNews(SphinxDirective):
+@@ -65,7 +63,7 @@
return []
@@ -551,8 +569,10 @@
app.add_directive("miscnews", MiscNews)
return {
---- a/Doc/tools/extensions/patchlevel.py
-+++ b/Doc/tools/extensions/patchlevel.py
+Index: Python-3.12.10/Doc/tools/extensions/patchlevel.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/extensions/patchlevel.py 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/tools/extensions/patchlevel.py 2025-04-11 21:18:23.186669122 +0200
@@ -3,7 +3,7 @@
import re
import sys
@@ -562,7 +582,7 @@
CPYTHON_ROOT = Path(
__file__, # cpython/Doc/tools/extensions/patchlevel.py
-@@ -26,7 +26,7 @@ class version_info(NamedTuple): # noqa:
+@@ -26,7 +26,7 @@
major: int #: Major release number
minor: int #: Minor release number
micro: int #: Patch release number
@@ -571,7 +591,7 @@
serial: int #: Serial release number
-@@ -37,7 +37,8 @@ def get_header_version_info() -> version
+@@ -37,7 +37,8 @@
defines = {}
patchlevel_h = PATCHLEVEL_H.read_text(encoding="utf-8")
for line in patchlevel_h.splitlines():
@@ -581,7 +601,7 @@
name, value = m.groups()
defines[name] = value
-@@ -50,7 +51,7 @@ def get_header_version_info() -> version
+@@ -50,7 +51,7 @@
)
diff --git a/docs-docutils_014-Sphinx_420.patch b/docs-docutils_014-Sphinx_420.patch
index 2ef9053..664d553 100644
--- a/docs-docutils_014-Sphinx_420.patch
+++ b/docs-docutils_014-Sphinx_420.patch
@@ -1,12 +1,13 @@
---
Doc/tools/extensions/c_annotations.py | 6 +++++-
Doc/tools/extensions/glossary_search.py | 12 ++++++++++--
- Doc/tools/extensions/pyspecific.py | 5 ++++-
- 3 files changed, 19 insertions(+), 4 deletions(-)
+ 2 files changed, 15 insertions(+), 3 deletions(-)
---- a/Doc/tools/extensions/c_annotations.py
-+++ b/Doc/tools/extensions/c_annotations.py
-@@ -117,7 +117,11 @@ def add_annotations(app: Sphinx, doctree
+Index: Python-3.12.10/Doc/tools/extensions/c_annotations.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/extensions/c_annotations.py 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/tools/extensions/c_annotations.py 2025-04-11 21:16:39.007011463 +0200
+@@ -117,7 +117,11 @@
state = app.env.domaindata["c_annotations"]
refcount_data = state["refcount_data"]
stable_abi_data = state["stable_abi_data"]
@@ -19,9 +20,11 @@
par = node.parent
if par["domain"] != "c":
continue
---- a/Doc/tools/extensions/glossary_search.py
-+++ b/Doc/tools/extensions/glossary_search.py
-@@ -30,8 +30,16 @@ def process_glossary_nodes(
+Index: Python-3.12.10/Doc/tools/extensions/glossary_search.py
+===================================================================
+--- Python-3.12.10.orig/Doc/tools/extensions/glossary_search.py 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/tools/extensions/glossary_search.py 2025-04-11 21:16:39.007340209 +0200
+@@ -30,8 +30,16 @@
else:
terms = app.env.glossary_terms = {}
@@ -40,17 +43,3 @@
term = glossary_item[0].astext()
definition = glossary_item[-1]
---- a/Doc/tools/extensions/pyspecific.py
-+++ b/Doc/tools/extensions/pyspecific.py
-@@ -25,7 +25,10 @@ from sphinx.domains.python import PyFunc
- from sphinx.locale import _ as sphinx_gettext
- from sphinx.util.docutils import SphinxDirective
- from sphinx.writers.text import TextWriter, TextTranslator
--from sphinx.util.display import status_iterator
-+try:
-+ from sphinx.util.display import status_iterator
-+except ModuleNotFoundError:
-+ from sphinx.util import status_iterator
-
-
- ISSUE_URI = 'https://bugs.python.org/issue?@action=redirect&bpo=%s'
diff --git a/fix_configure_rst.patch b/fix_configure_rst.patch
index 19cd4f9..836b0f5 100644
--- a/fix_configure_rst.patch
+++ b/fix_configure_rst.patch
@@ -3,9 +3,11 @@
Misc/NEWS | 2 +-
2 files changed, 1 insertion(+), 3 deletions(-)
---- a/Doc/using/configure.rst
-+++ b/Doc/using/configure.rst
-@@ -640,13 +640,11 @@ macOS Options
+Index: Python-3.12.10/Doc/using/configure.rst
+===================================================================
+--- Python-3.12.10.orig/Doc/using/configure.rst 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Doc/using/configure.rst 2025-04-11 21:16:27.319169087 +0200
+@@ -640,13 +640,11 @@
See ``Mac/README.rst``.
@@ -19,9 +21,11 @@
.. option:: --enable-framework=INSTALLDIR
Create a Python.framework rather than a traditional Unix install. Optional
---- a/Misc/NEWS
-+++ b/Misc/NEWS
-@@ -14838,7 +14838,7 @@ C API
+Index: Python-3.12.10/Misc/NEWS
+===================================================================
+--- Python-3.12.10.orig/Misc/NEWS 2025-04-08 13:35:47.000000000 +0200
++++ Python-3.12.10/Misc/NEWS 2025-04-11 21:16:27.326169052 +0200
+@@ -15106,7 +15106,7 @@
- bpo-40939: Removed documentation for the removed ``PyParser_*`` C API.
- bpo-43795: The list in :ref:`limited-api-list` now shows the public name
diff --git a/python312.changes b/python312.changes
index e0b69de..6482f07 100644
--- a/python312.changes
+++ b/python312.changes
@@ -1,3 +1,169 @@
+-------------------------------------------------------------------
+Fri Apr 11 19:22:06 UTC 2025 - Matej Cepl
+
+- Update to 3.12.10:
+ - gh-131852: msgfmt no longer adds the POT-Creation-Date to
+ generated .mo files for consistency with GNU msgfmt.
+ - gh-85012: Correctly reset msgctxt when compiling messages in
+ msgfmt.
+ - gh-131050: test_ssl.test_dh_params is skipped if the
+ underlying TLS library does not support finite-field
+ ephemeral Diffie-Hellman.
+ - gh-119727: Add --single-process command line option to Python
+ test runner (regrtest). Patch by Victor Stinner.
+ - gh-131809: Update bundled libexpat to 2.7.1
+ - gh-131261: Upgrade to libexpat 2.7.0
+ - gh-127371: Avoid unbounded buffering for
+ tempfile.SpooledTemporaryFile.writelines(). Previously, disk
+ spillover was only checked after the lines iterator had been
+ exhausted. This is now done after each line is written.
+ - gh-121284: Fix bug in the folding of rfc2047 encoded-words
+ when flattening an email message using a modern email
+ policy. Previously when an encoded-word was too long for
+ a line, it would be decoded, split across lines, and
+ re-encoded. But commas and other special characters in the
+ original text could be left unencoded and unquoted. This
+ could theoretically be used to spoof header lines using a
+ carefully constructed encoded-word if the resulting rendered
+ email was transmitted or re-parsed.
+ - gh-116608: undeprecate functional API for importlib.resources
+ - gh-132075: Fix possible use of socket address structures
+ with uninitialized members. Now all structure members are
+ initialized with zeroes by default.
+ - gh-132002: Fix crash when deallocating contextvars.ContextVar
+ with weird unahashable string names.
+ - gh-131668: socket: Fix code parsing AF_BLUETOOTH socket
+ addresses.
+ - gh-131492: Fix a resource leak when constructing a
+ gzip.GzipFile with a filename fails, for example when passing
+ an invalid compresslevel.
+ - gh-131325: Fix sendfile fallback implementation to drain data
+ after writing to transport in asyncio.
+ - gh-129843: Fix incorrect argument passing in
+ warnings.warn_explicit().
+ - gh-131204: Use monospace font from System Font Stack for
+ cross-platform support in difflib.HtmlDiff.
+ - gh-131045: Fix issue with __contains__, values, and
+ pseudo-members for enum.Flag.
+ - gh-130959: Fix pure-Python implementation of
+ datetime.time.fromisoformat() to reject times with spaces in
+ fractional part (for example, 12:34:56.400 +02:00), matching
+ the C implementation. Patch by Michał Gorny.
+ - gh-130637: Add validation for numeric response data in
+ poplib.POP3.stat() method
+ - gh-130461: Remove .. index:: directives from the uuid module
+ documentation. These directives previously created entries
+ in the general index for getnode() as well as the uuid1(),
+ uuid3(), uuid4(), and uuid5() constructor functions.
+ - gh-130285: Fix corner case for random.sample() allowing the
+ counts parameter to specify an empty population. So now,
+ sample([], 0, counts=[]) and sample('abc', k=0, counts=[0, 0,
+ 0]) both give the same result as sample([], 0).
+ - gh-130250: Fix regression in traceback.print_last().
+ - gh-118761: Reverts a change in the previous release
+ attempting to make some stdlib imports used within the
+ subprocess module lazy as this was causing errors during
+ __del__ finalizers calling methods such as terminate, or
+ kill, or send_signal.
+ - gh-130164: Fixed failure to raise TypeError in
+ inspect.Signature.bind() for positional-only arguments
+ provided by keyword when a variadic keyword argument (e.g.
+ **kwargs) is present.
+ - gh-130151: Fix reference leaks in _hashlib.hmac_new() and
+ _hashlib.hmac_digest(). Patch by Bénédikt Tran.
+ - gh-129726: Fix gzip.GzipFile raising an unraisable exception
+ during garbage collection when referring to a temporary
+ object by breaking the reference loop with weakref.
+ - gh-129583: Update bundled pip to 25.0.1
+ - gh-97850: Update the deprecation warning of
+ importlib.abc.Loader.load_module().
+ - gh-129603: Fix bugs where sqlite3.Row objects could segfault
+ if their inherited description was set to None. Patch by
+ Erlend Aasland.
+ - gh-117779: Fix reading duplicated entries in zipfile by
+ name. Reading duplicated entries (except the last one) by
+ ZipInfo now emits a warning instead of raising an exception.
+ - gh-128772: Fix pydoc for methods with the __module__
+ attribute equal to None.
+ - gh-92897: Scheduled the deprecation of the check_home
+ argument of sysconfig.is_python_build() to Python 3.15.
+ - gh-128703: Fix mimetypes.guess_type() to use default mapping
+ for empty Content-Type in registry.
+ - gh-126037: xml.etree.ElementTree: Fix a crash in
+ Element.find, Element.findtext and Element.findall when
+ the tag to find implements an __eq__() method mutating the
+ element being queried. Patch by Bénédikt Tran.
+ - gh-127712: Fix handling of the secure argument of
+ logging.handlers.SMTPHandler.
+ - gh-126033: xml.etree.ElementTree: Fix a crash in
+ Element.remove when the element is concurrently
+ mutated. Patch by Bénédikt Tran.
+ - gh-125553: Fix round-trip invariance for backslash
+ continuations in tokenize.untokenize().
+ - gh-101137: Mime type text/x-rst is now supported by
+ mimetypes.
+ - gh-113238: Add Anchor to importlib.resources (in order for
+ the code to comply with the documentation)
+ - gh-89039: When replace() method is called on a subclass
+ of datetime, date or time, properly call derived
+ constructor. Previously, only the base class’s constructor
+ was called.
+ - Also, make sure to pass non-zero fold values when creating
+ subclasses in various methods. Previously, fold was silently
+ ignored.
+ - gh-129873: Simplify displaying the IDLE doc by only copying
+ the text section of idle.html to idlelib/help.html. Patch by
+ Stan Ulbrych.
+ - gh-131417: Mention asyncio.Future and asyncio.Task in generic
+ classes list.
+ - gh-125722: Require Sphinx 8.2.0 or later to build the Python
+ documentation. Patch by Adam Turner.
+ - gh-129712: The wheel tags supported by each macOS universal
+ SDK option are now documented.
+ - gh-46236: C API: Document PyUnicode_RSplit(),
+ PyUnicode_Partition() and PyUnicode_RPartition().
+ - gh-131670: Fix anext() failing on sync __anext__() raising an
+ exception.
+ - gh-130809: Fixed an issue where _PyFrame_LocalsToFast tries
+ to write module level values to hidden fasts.
+ - gh-130775: Do not crash on negative column and end_column in
+ ast locations.
+ - gh-130618: Fix a bug that was causing UnicodeDecodeError or
+ SystemError to be raised when using f-strings with lambda
+ expressions with non-ASCII characters. Patch by Pablo Galindo
+ - gh-130163: Fix possible crashes related to concurrent change
+ and use of the sys module attributes.
+ - gh-88887: Fixing multiprocessing Resource Tracker process
+ leaking, usually observed when running Python as PID 1.
+ - gh-116042: Fix location for SyntaxErrors of invalid escapes
+ in the tokenizer. Patch by Pablo Galindo
+ - gh-128632: Disallow __classdict__ as the name of a type
+ parameter. Using this name would previously crash the
+ interpreter in some circumstances.
+ - gh-125331: from __future__ import barry_as_FLUFL now works in
+ more contexts, including when it is used in files, with the
+ -c flag, and in the REPL when there are multiple statements
+ on the same line. Previously, it worked only on subsequent
+ lines in the REPL, and when the appropriate flags were passed
+ directly to compile(). Patch by Pablo Galindo.
+ - gh-107526: Revert converting vars, dir, next, getattr, and
+ iter to argument clinic.
+ - gh-107674: Fixed performance regression in sys.settrace.
+ - gh-131740: Update PyUnstable_GC_VisitObjects to traverse perm
+ gen.
+ - gh-131865: The DTrace build now properly passes the CC
+ and CFLAGS variables to the dtrace command when utilizing
+ SystemTap on Linux.
+ - gh-130740: Ensure that Python.h is included before
+ stdbool.h unless pyconfig.h is included before or in some
+ platform-specific contexts.
+ - gh-129838: Don’t redefine _Py_NO_SANITIZE_UNDEFINED when
+ compiling with a recent GCC version and undefined sanitizer
+ enabled.
+ - gh-129660: Drop test_embed from PGO training, whose
+ contribution in recent versions is considered to be
+ ignorable.
+
-------------------------------------------------------------------
Mon Mar 10 15:44:31 UTC 2025 - Bernhard Wiedemann
diff --git a/python312.spec b/python312.spec
index 6c5e5db..3d57886 100644
--- a/python312.spec
+++ b/python312.spec
@@ -118,7 +118,7 @@
# _md5.cpython-38m-x86_64-linux-gnu.so
%define dynlib() %{sitedir}/lib-dynload/%{1}.cpython-%{abi_tag}-%{archname}-%{_os}%{?_gnu}%{?armsuffix}.so
Name: %{python_pkg_name}%{psuffix}
-Version: 3.12.9
+Version: 3.12.10
Release: 0
Summary: Python 3 Interpreter
License: Python-2.0
diff --git a/subprocess-raise-timeout.patch b/subprocess-raise-timeout.patch
index a15acaa..e142103 100644
--- a/subprocess-raise-timeout.patch
+++ b/subprocess-raise-timeout.patch
@@ -1,18 +1,21 @@
---
- Lib/test/test_subprocess.py | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
+ Lib/test/test_subprocess.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
-Index: Python-3.12.4/Lib/test/test_subprocess.py
+Index: Python-3.12.10/Lib/test/test_subprocess.py
===================================================================
---- Python-3.12.4.orig/Lib/test/test_subprocess.py
-+++ Python-3.12.4/Lib/test/test_subprocess.py
-@@ -280,7 +280,8 @@ class ProcessTestCase(BaseTestCase):
- "time.sleep(3600)"],
- # Some heavily loaded buildbots (sparc Debian 3.x) require
- # this much time to start and print.
-- timeout=3)
-+ # OBS might require even more
-+ timeout=10)
- self.fail("Expected TimeoutExpired.")
- self.assertEqual(c.exception.output, b'BDFL')
+--- Python-3.12.10.orig/Lib/test/test_subprocess.py 2025-04-11 21:04:45.154639562 +0200
++++ Python-3.12.10/Lib/test/test_subprocess.py 2025-04-11 21:12:03.374471647 +0200
+@@ -274,7 +274,11 @@
+ output = subprocess.check_output(
+ [sys.executable, "-c",
+ "import time; time.sleep(3600)"],
+- timeout=0.1)
++ # Some heavily loaded buildbots (sparc Debian 3.x) require
++ # this much time to start and print.
++ # timeout=0.1)
++ # OBS might require even more
++ timeout=10)
+ def test_call_kwargs(self):
+ # call() function with keyword args