From d6112732ca4cf3e64b659be9005c3fa84040cd3a Mon Sep 17 00:00:00 2001 From: Kevin Mihelich Date: Sat, 27 Apr 2024 15:55:46 +0000 Subject: [PATCH] core/python to 3.12.3-1 --- core/python/.SRCINFO | 14 +-- core/python/PKGBUILD | 39 ++---- core/python/canrebuild | 114 ++++++++++++++++++ core/python/genrebuild | 2 +- ...69605F62C751356D054A26A821E680E5FA6305.asc | 104 ++++++++++++++++ 5 files changed, 235 insertions(+), 38 deletions(-) create mode 100755 core/python/canrebuild create mode 100644 core/python/keys/pgp/7169605F62C751356D054A26A821E680E5FA6305.asc diff --git a/core/python/.SRCINFO b/core/python/.SRCINFO index be3cc73ab..97a4654f9 100644 --- a/core/python/.SRCINFO +++ b/core/python/.SRCINFO @@ -1,6 +1,6 @@ pkgbase = python pkgdesc = The Python programming language - pkgver = 3.11.8 + pkgver = 3.12.3 pkgrel = 1 url = https://www.python.org/ arch = x86_64 @@ -8,7 +8,6 @@ pkgbase = python makedepends = tk makedepends = sqlite makedepends = bluez-libs - makedepends = mpdecimal makedepends = llvm makedepends = gdb makedepends = xorg-server-xvfb @@ -22,16 +21,16 @@ pkgbase = python depends = openssl depends = zlib depends = tzdata - source = https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tar.xz - source = https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tar.xz.asc - source = python-expat-2.6.patch::https://github.com/python/cpython/pull/115289.patch + depends = mpdecimal + source = https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz + source = https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz.asc source = EXTERNALLY-MANAGED validpgpkeys = 0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D validpgpkeys = E3FF2839C048B25C084DEBE9B26995E310250568 validpgpkeys = A035C8C19219BA821ECEA86B64E628F8D684696D - sha512sums = 434e727fa370def348838fd84acb69b4d309cfb03f61bf5069150164e9ca005637ac01dfbf997f445607d4e28d02c8bed0858b36589240ccadaa4c14c19f2320 + validpgpkeys = 7169605F62C751356D054A26A821E680E5FA6305 + sha512sums = 4a2213b108e7f1f1525baa8348e68b2a2336d925e60d0a59f0225fc470768a2c8031edafc0b8243f94dbae18afda335ee5adf2785328c2218fd64cbb439f13a4 sha512sums = SKIP - sha512sums = 0868854a6b2647706a3c98443fbacf275fe31f85c7cb78301db46e395c17cac9a02512cf0db40b981eae9ffe9d9d5fc8e0a83635adb0e2545ca134d9830cd1e0 sha512sums = 62a6fbfbaeaa3ba7c54e109d9c3b7f67e73bb21986da4c1fcc5d28cca83d71e0fcae28e1fc70ee8ddce7dea8cd0b64e18d1031dae3a2eae5eaa379c53efd53a0 pkgname = python @@ -39,7 +38,6 @@ pkgname = python optdepends = python-pip: for installing Python packages using tooling that is usually bundled with Python optdepends = python-pipx: for installing Python software not packaged on Arch Linux optdepends = sqlite: for a default database integration - optdepends = mpdecimal: for decimal optdepends = xz: for lzma optdepends = tk: for tkinter provides = python3 diff --git a/core/python/PKGBUILD b/core/python/PKGBUILD index 5b378764f..28d35c5b7 100644 --- a/core/python/PKGBUILD +++ b/core/python/PKGBUILD @@ -13,29 +13,27 @@ shopt -s extglob pkgbase=python pkgname=(python python-tests) -pkgver=3.11.8 +pkgver=3.12.3 pkgrel=1 _pybasever=${pkgver%.*} pkgdesc="The Python programming language" arch=('x86_64') license=('PSF-2.0') url="https://www.python.org/" -depends=('bzip2' 'expat' 'gdbm' 'libffi' 'libnsl' 'libxcrypt' 'openssl' 'zlib') -makedepends=('tk' 'sqlite' 'bluez-libs' 'mpdecimal' 'llvm' 'gdb' 'xorg-server-xvfb' 'ttf-font') +depends=('bzip2' 'expat' 'gdbm' 'libffi' 'libnsl' 'libxcrypt' 'openssl' 'zlib' 'tzdata' 'mpdecimal') +makedepends=('tk' 'sqlite' 'bluez-libs' 'llvm' 'gdb' 'xorg-server-xvfb' 'ttf-font') source=("https://www.python.org/ftp/python/${pkgver%rc*}/Python-${pkgver}.tar.xz"{,.asc} - python-expat-2.6.patch::https://github.com/python/cpython/pull/115289.patch EXTERNALLY-MANAGED) -sha512sums=('434e727fa370def348838fd84acb69b4d309cfb03f61bf5069150164e9ca005637ac01dfbf997f445607d4e28d02c8bed0858b36589240ccadaa4c14c19f2320' +sha512sums=('4a2213b108e7f1f1525baa8348e68b2a2336d925e60d0a59f0225fc470768a2c8031edafc0b8243f94dbae18afda335ee5adf2785328c2218fd64cbb439f13a4' 'SKIP' - '0868854a6b2647706a3c98443fbacf275fe31f85c7cb78301db46e395c17cac9a02512cf0db40b981eae9ffe9d9d5fc8e0a83635adb0e2545ca134d9830cd1e0' '62a6fbfbaeaa3ba7c54e109d9c3b7f67e73bb21986da4c1fcc5d28cca83d71e0fcae28e1fc70ee8ddce7dea8cd0b64e18d1031dae3a2eae5eaa379c53efd53a0') validpgpkeys=('0D96DF4D4110E5C43FBFB17F2D347EA6AA65421D' # Ned Deily (Python release signing key) 'E3FF2839C048B25C084DEBE9B26995E310250568' # Ɓukasz Langa (GPG langa.pl) - 'A035C8C19219BA821ECEA86B64E628F8D684696D') # Pablo Galindo Salgado + 'A035C8C19219BA821ECEA86B64E628F8D684696D' # Pablo Galindo Salgado + '7169605F62C751356D054A26A821E680E5FA6305') # Thomas Wouters prepare() { cd Python-${pkgver} - patch -Np1 -i ../python-expat-2.6.patch # FS#23997 sed -i -e "s|^#.* /usr/local/bin/python|#!/usr/bin/python|" Lib/cgi.py @@ -43,7 +41,6 @@ prepare() { # Ensure that we are using the system copy of various libraries (expat, libffi, and libmpdec), # rather than copies shipped in the tarball rm -r Modules/expat - rm -r Modules/_ctypes/{darwin,libffi}* rm -r Modules/_decimal/libmpdec } @@ -80,6 +77,7 @@ check() { # the to-be-installed debug package # test_socket: https://github.com/python/cpython/issues/79428 # test_unittest: https://github.com/python/cpython/issues/108927 + # test_tkk: AssertionError: Tuples differ: (0,) != ('0',) cd Python-${pkgver} @@ -89,7 +87,8 @@ check() { LD_LIBRARY_PATH="${srcdir}/Python-${pkgver}":${LD_LIBRARY_PATH} \ LC_CTYPE=en_US.UTF-8 xvfb-run -s "-screen 0 1920x1080x16 -ac +extension GLX" -a -n "$servernum" \ - "${srcdir}/Python-${pkgver}/python" -m test.regrtest -v -uall -x test_tk -x test_pyexpat -x test_socket -x test_unittest + "${srcdir}/Python-${pkgver}/python" -m test.regrtest -v -uall -x test_tk -x test_ttk -x test_ttk.test_widgets \ + -x test_tkinter -x test_pyexpat -x test_socket -x test_unittest } package_python() { @@ -97,7 +96,6 @@ package_python() { 'python-pip: for installing Python packages using tooling that is usually bundled with Python' 'python-pipx: for installing Python software not packaged on Arch Linux' 'sqlite: for a default database integration' - 'mpdecimal: for decimal' 'xz: for lzma' 'tk: for tkinter') provides=('python3' 'python-externally-managed') @@ -130,10 +128,7 @@ package_python() { # Split tests cd "$pkgdir"/usr/lib/python*/ - rm -r {ctypes/test,distutils/tests,idlelib/idle_test,lib2to3/tests,tkinter/test,unittest/test} - cd test - # FS#76193 - rm -r !(support) + rm -r {test,idlelib/idle_test} } package_python-tests() { @@ -144,19 +139,5 @@ package_python-tests() { make DESTDIR="${pkgdir}" EXTRA_CFLAGS="$CFLAGS" libinstall cd "$pkgdir"/usr/lib/python*/ - rm -r !(test|ctypes|distutils|idlelib|lib2to3|tkinter|unittest) - cd "$pkgdir"/usr/lib/python*/test - rm -r support - cd "$pkgdir"/usr/lib/python*/ctypes - rm -r !(test) - cd "$pkgdir"/usr/lib/python*/distutils - rm -r !(tests) - cd "$pkgdir"/usr/lib/python*/idlelib - rm -r !(idle_test) - cd "$pkgdir"/usr/lib/python*/lib2to3 - rm -r !(tests) - cd "$pkgdir"/usr/lib/python*/tkinter - rm -r !(test) - cd "$pkgdir"/usr/lib/python*/unittest rm -r !(test) } diff --git a/core/python/canrebuild b/core/python/canrebuild new file mode 100755 index 000000000..da69c4e16 --- /dev/null +++ b/core/python/canrebuild @@ -0,0 +1,114 @@ +#!/usr/bin/python + +""" +Generates a list of packages which can be rebuild depending on the already +rebuild packages in our staging repositories +""" + +import argparse +import tempfile + +from pyalpm import Handle +import pyalpm + +ARCH = "x86_64" +MIRROR_URL = "https://mirror.pkgbuild.com/{}/os/{}" + +def register_dbs(handle, reponames): + repos = [] + + for reponame in reponames: + repo = handle.register_syncdb(reponame, pyalpm.SIG_DATABASE_OPTIONAL) + repo.servers = [MIRROR_URL.format(reponame, ARCH)] + repo.update(False) + repos.append(repo) + + return repos + + +def find_package_anywhere(handle, pkgname): + for db in handle.get_syncdbs(): + pkg = db.get_pkg(pkgname) + if pkg: + return pkg + + return None + + +def can_rebuild(rebuild_packages, stable_handle, staging_handle): + rebuild_packages_set = set(rebuild_packages) + + def is_all_rebuild(depends): + for pkg in depends: + if pkg not in rebuild_packages_set: + continue + + if not find_package_anywhere(staging_handle, pkg): + return False + + return True + + can_rebuild_list = [] + for pkgname in rebuild_packages: + # Already rebuild + pkg = find_package_anywhere(staging_handle, pkgname) + if pkg is not None: + continue + + pkg = find_package_anywhere(stable_handle, pkgname) + # Can never happen + if pkg is None: + continue + + if is_all_rebuild(pkg.depends) and is_all_rebuild(pkg.makedepends) and is_all_rebuild(pkg.checkdepends): + can_rebuild_list.append(pkgname) + + return can_rebuild_list + + +def compare_repos(rebuild_packages, staging_handle): + missing = [] + for pkgname in rebuild_packages: + if find_package_anywhere(staging_handle, pkgname) is None: + missing.append(pkgname) + + return missing + +def main(filename, verify, output_format): + # Output of `genrebuild`. + rebuild_packages = [] + packages = [] + + with open(filename, 'r') as fp: + rebuild_packages = fp.read().splitlines() + + with tempfile.TemporaryDirectory() as stable_tmpdir: + with tempfile.TemporaryDirectory() as staging_tmpdir: + stable_handle = Handle(".", stable_tmpdir) + staging_handle = Handle(".", staging_tmpdir) + + register_dbs(stable_handle, ["core", "extra", "multilib"]) + register_dbs(staging_handle, ["core-staging", "extra-staging", "multilib-staging"]) + + if verify: + packages = compare_repos(rebuild_packages, staging_handle) + else: + packages = can_rebuild(rebuild_packages, stable_handle, staging_handle) + + if output_format == 'space': + print(' '.join(packages)) + elif output_format == 'newline': + print('\n'.join(packages)) + else: + print('unsupported output format') + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + prog='canrebuild', + description='Returns packges which can be rebuild in the staging repositories') + parser.add_argument('filename') + parser.add_argument('--format', default='space', choices=['space', 'newline']) + parser.add_argument('--verify', action=argparse.BooleanOptionalAction, help='compare staging versus stable packages') + + args = parser.parse_args() + main(args.filename, args.verify, args.format) diff --git a/core/python/genrebuild b/core/python/genrebuild index 735710eee..f8779e543 100755 --- a/core/python/genrebuild +++ b/core/python/genrebuild @@ -8,5 +8,5 @@ exclude=('python2' 'python2-.*' 'pypy3\?' 'cython2' 'cuda' 'cuda-tools' pacman -Fq /usr/lib/python${pyver}/ | grep -v archlinuxcn | cut -d / -f 2 pacman -Fxq "\.cpython-${pyver/.}.pyc$" | grep -v archlinuxcn | cut -d / -f 2 sogrep all libpython${pyver}.so -ssh build.archlinux.org "parallel \"zstdgrep -q 'Py_Initialize\|PyInit_\|PyModule_Create2' {} && pacman -Qpq {}\" ::: /srv/ftp/pool/*/*.zst" +ssh build.archlinux.org "parallel \"zstdgrep -q 'Py_Initialize\|PyInit_\|PyModule_Create2' {} && pacman -Qpq {}\" ::: /srv/ftp/pool/packages/*.zst" } | grep -xvf <(printf "%s\n" "${exclude[@]}") | sort -u diff --git a/core/python/keys/pgp/7169605F62C751356D054A26A821E680E5FA6305.asc b/core/python/keys/pgp/7169605F62C751356D054A26A821E680E5FA6305.asc new file mode 100644 index 000000000..90b22ec2a --- /dev/null +++ b/core/python/keys/pgp/7169605F62C751356D054A26A821E680E5FA6305.asc @@ -0,0 +1,104 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +C6/APmOJmVcMLJ0h7XxC7aBkrGsDdum8ym50bA== +=FLhQ +-----END PGP PUBLIC KEY BLOCK-----