core/python to 3.12.3-1

This commit is contained in:
Kevin Mihelich 2024-04-27 15:55:46 +00:00
parent 3aa8cbcc0c
commit d6112732ca
5 changed files with 235 additions and 38 deletions

View file

@ -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

View file

@ -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) <nad@python.org>
'E3FF2839C048B25C084DEBE9B26995E310250568' # Łukasz Langa (GPG langa.pl) <lukasz@langa.pl>
'A035C8C19219BA821ECEA86B64E628F8D684696D') # Pablo Galindo Salgado <pablogsal@gmail.com>
'A035C8C19219BA821ECEA86B64E628F8D684696D' # Pablo Galindo Salgado <pablogsal@gmail.com>
'7169605F62C751356D054A26A821E680E5FA6305') # Thomas Wouters <thomas@xs4all.nl>
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)
}

114
core/python/canrebuild Executable file
View file

@ -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)

View file

@ -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

View file

@ -0,0 +1,104 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
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
C6/APmOJmVcMLJ0h7XxC7aBkrGsDdum8ym50bA==
=FLhQ
-----END PGP PUBLIC KEY BLOCK-----