From 8cfc75604b17308c23f6edcf58bc8b2f55e1debb Mon Sep 17 00:00:00 2001 From: Timothy Pansino <11214426+TimPansino@users.noreply.github.com> Date: Sat, 16 Sep 2023 01:02:21 -0700 Subject: [PATCH 001/246] Fix get-pip urls for older pypy versions (#2788) --- plugins/python-build/bin/python-build | 6 +-- plugins/python-build/test/pyenv_ext.bats | 56 ++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 3 deletions(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 2f1d8ebb..6d777af2 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -2337,7 +2337,7 @@ if [ -z "${GET_PIP_URL}" ]; then 2.6 | 2.6.* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/2.6/get-pip.py" ;; - 2.7 | 2.7.* ) + 2.7 | 2.7.* | pypy2.7 | pypy2.7-* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/2.7/get-pip.py" ;; 3.2 | 3.2.* ) @@ -2349,10 +2349,10 @@ if [ -z "${GET_PIP_URL}" ]; then 3.4 | 3.4.* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.4/get-pip.py" ;; - 3.5 | 3.5.* ) + 3.5 | 3.5.* | pypy3.5 | pypy3.5-* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.5/get-pip.py" ;; - 3.6 | 3.6.* ) + 3.6 | 3.6.* | pypy3.6 | pypy3.6-* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.6/get-pip.py" ;; * ) diff --git a/plugins/python-build/test/pyenv_ext.bats b/plugins/python-build/test/pyenv_ext.bats index ccf6f4c6..6212638b 100644 --- a/plugins/python-build/test/pyenv_ext.bats +++ b/plugins/python-build/test/pyenv_ext.bats @@ -393,6 +393,14 @@ OUT assert_success } +@test "use the custom GET_PIP_URL for 2.7 versions" { + run_inline_definition_with_name --name=2.7 < Date: Sat, 16 Sep 2023 03:48:52 -0700 Subject: [PATCH 002/246] Update openssl url for 3.12.0rc2 The old 3.1.1s URL returns a 404 --- plugins/python-build/share/python-build/3.12.0rc2 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/share/python-build/3.12.0rc2 b/plugins/python-build/share/python-build/3.12.0rc2 index 1abccea1..6d5b1cc7 100644 --- a/plugins/python-build/share/python-build/3.12.0rc2 +++ b/plugins/python-build/share/python-build/3.12.0rc2 @@ -1,6 +1,6 @@ prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.1.1s" "https://www.openssl.org/source/openssl-3.1.1s.tar.gz#b3aa61334233b852b63ddb048df181177c2c659eb9d4376008118f9c08d07674" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.0rc2" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0rc2.tar.xz#11eb10376e6baf7bea53001f5181eaee1797788c4db6e83a061e422357927674" standard verify_py312 copy_python_gdb ensurepip From 64af7c3e54b71ee169ceaa73432ff58b6c244acf Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Sun, 17 Sep 2023 10:47:49 +0300 Subject: [PATCH 003/246] v2.3.27 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fef38f0e..98b34c58 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Version History +# Release v2.3.27 + +* Prefer OpenSSL 3 in Homebrew since 3.12 by @native-api in https://github.com/pyenv/pyenv/pull/2781 +* Fix get-pip urls for older pypy versions by @TimPansino in https://github.com/pyenv/pyenv/pull/2788 +* Update openssl url for 3.12.0rc2 by @zsol in https://github.com/pyenv/pyenv/pull/2789 + ## Release v2.3.26 * Prevent `grep` warning in `conda.bash` by @aphedges in https://github.com/pyenv/pyenv/pull/2768 From c844b332ca9744ee5273a8c40396f29b0d730bdf Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Sun, 17 Sep 2023 10:48:10 +0300 Subject: [PATCH 004/246] v2.3.27 --- libexec/pyenv---version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 181315c4..7b6e566c 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.26" +version="2.3.27" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From d2c4d963d2992ce89cacf7806cc1e07c20e67c8c Mon Sep 17 00:00:00 2001 From: native-api Date: Mon, 18 Sep 2023 00:46:59 +0300 Subject: [PATCH 005/246] Prioritize 'zlib from xcode sdk' flag correctly (#2791) All include directories should go into CPPFLAGS. XCode SDK was being added to CFLAGS instead which caused old Tcl/Tk in the SDK to override a newer one in Homebrew. --- plugins/python-build/bin/python-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 6d777af2..349c8de5 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -1616,7 +1616,7 @@ use_xcode_sdk_zlib() { local xc_sdk_path="$(xcrun --show-sdk-path 2>/dev/null || true)" if [ -d "$xc_sdk_path" ]; then echo "python-build: use zlib from xcode sdk" - export CFLAGS="${CFLAGS:+$CFLAGS }-I${xc_sdk_path}/usr/include" + export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I${xc_sdk_path}/usr/include" if is_mac -ge 1100; then export LDFLAGS="${LDFLAGS:+$LDFLAGS }-L${xc_sdk_path}/usr/lib" fi From a82598e17413f04c001b43cb2468a5a2962377bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Mon, 18 Sep 2023 22:53:45 -0600 Subject: [PATCH 006/246] Prefer OpenSSL 3 in Homebrew in 3.13-dev (#2793) --- plugins/python-build/share/python-build/3.13-dev | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/python-build/share/python-build/3.13-dev b/plugins/python-build/share/python-build/3.13-dev index 5384da3a..8c4740e4 100644 --- a/plugins/python-build/share/python-build/3.13-dev +++ b/plugins/python-build/share/python-build/3.13-dev @@ -1,7 +1,7 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 -install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.13-dev" "https://github.com/python/cpython" main standard verify_py313 copy_python_gdb ensurepip From bed2ec2f73e6b9cf820ca99a2a191279e7d75800 Mon Sep 17 00:00:00 2001 From: Saaket Prakash Date: Tue, 19 Sep 2023 20:31:10 +0530 Subject: [PATCH 007/246] Add CPython 3.12.0rc3 (#2795) --- .../python-build/share/python-build/{3.12.0rc2 => 3.12.0rc3} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename plugins/python-build/share/python-build/{3.12.0rc2 => 3.12.0rc3} (58%) diff --git a/plugins/python-build/share/python-build/3.12.0rc2 b/plugins/python-build/share/python-build/3.12.0rc3 similarity index 58% rename from plugins/python-build/share/python-build/3.12.0rc2 rename to plugins/python-build/share/python-build/3.12.0rc3 index 6d5b1cc7..b822de1c 100644 --- a/plugins/python-build/share/python-build/3.12.0rc2 +++ b/plugins/python-build/share/python-build/3.12.0rc3 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.12.0rc2" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0rc2.tar.xz#11eb10376e6baf7bea53001f5181eaee1797788c4db6e83a061e422357927674" standard verify_py312 copy_python_gdb ensurepip + install_package "Python-3.12.0rc3" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0rc3.tar.xz#96397e891e98802b1d399dee3ceaeb9bcf0aa2566c8a7b1cce4d0196c277506a" standard verify_py312 copy_python_gdb ensurepip else - install_package "Python-3.12.0rc2" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0rc2.tgz#c3ef992c5c0067bc9a185de79fe0c1650a9a061b4d47d8787de20e04f22e2b29" standard verify_py312 copy_python_gdb ensurepip + install_package "Python-3.12.0rc3" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0rc3.tgz#b808294fb2e1c4511ec2ec3c0b643a047f94de64f95ec912e3880bbcc73bd101" standard verify_py312 copy_python_gdb ensurepip fi From 8b0c743f122a29023797047f9b5fe4c833fb5902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20=C5=A0im=C3=A1=C4=8Dek?= Date: Tue, 19 Sep 2023 19:48:31 +0200 Subject: [PATCH 008/246] Add graalpy-23.1.0 (#2796) --- .../python-build/graalpy-community-23.1.0 | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-community-23.1.0 diff --git a/plugins/python-build/share/python-build/graalpy-community-23.1.0 b/plugins/python-build/share/python-build/graalpy-community-23.1.0 new file mode 100644 index 00000000..dcda3848 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-23.1.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='23.1.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="720334d90d52b5337db018ad6582953e9383c27188f08810250c2fe14a11db5a" + ;; +"linux-aarch64" ) + checksum="c7dc4f94413e667070f7d46f57af04c4db53383e721be9637b58cb030dfa1f58" + ;; +"macos-amd64" ) + checksum="13583382ba716231edce1b71d53e9efba776fef003ef2f515bda9c00a831779a" + ;; +"macos-aarch64" ) + checksum="5bc39af6938c507ec169b02a34237b6f4b286982e5be04b3109c171becc1949d" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-${VERSION}${BUILD}" "${url}" "copy" ensurepip From f7f096503aec966bd7a0573b77085bc73391277f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Papp?= <108480845+lpapp-foundry@users.noreply.github.com> Date: Sat, 23 Sep 2023 17:47:15 +0100 Subject: [PATCH 009/246] Update the OpenSSL dependency for Python 2.7.18 to 1.1 (#2797) It seems that pyenv cannot install 2.7.18 on Mac M1 (Apple ARM). openssl 1.0.2 does not have ARM support. M1 support was added in 1.1.1i according to https://www.openssl.org/news/cl111.txt --- plugins/python-build/share/python-build/2.7.18 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/share/python-build/2.7.18 b/plugins/python-build/share/python-build/2.7.18 index 544f3a7e..5725575d 100644 --- a/plugins/python-build/share/python-build/2.7.18 +++ b/plugins/python-build/share/python-build/2.7.18 @@ -1,5 +1,5 @@ export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="openssl@1.1 openssl@1.0 openssl" -install_package "openssl-1.0.2q" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2q.tar.gz#5744cfcbcec2b1b48629f7354203bc1e5e9b5466998bbccc5b5fcde3b18eb684" mac_openssl --if has_broken_mac_openssl +install_package "openssl-1.1.1v" "https://www.openssl.org/source/openssl-1.1.1v.tar.gz" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz#b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43" standard verify_py27 copy_python_gdb ensurepip From 3fda63be304d959fa071ad99d1513599801d231e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Mon, 2 Oct 2023 08:54:31 -0600 Subject: [PATCH 010/246] Add CPython 3.12.0 --- plugins/python-build/share/python-build/3.12-dev | 2 +- plugins/python-build/share/python-build/{3.12.0rc3 => 3.12.0} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename plugins/python-build/share/python-build/{3.12.0rc3 => 3.12.0} (52%) diff --git a/plugins/python-build/share/python-build/3.12-dev b/plugins/python-build/share/python-build/3.12-dev index 7fbdcf5f..69ca817b 100644 --- a/plugins/python-build/share/python-build/3.12-dev +++ b/plugins/python-build/share/python-build/3.12-dev @@ -2,6 +2,6 @@ prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 -install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline install_git "Python-3.12-dev" "https://github.com/python/cpython" 3.12 standard verify_py312 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.12.0rc3 b/plugins/python-build/share/python-build/3.12.0 similarity index 52% rename from plugins/python-build/share/python-build/3.12.0rc3 rename to plugins/python-build/share/python-build/3.12.0 index b822de1c..605867fa 100644 --- a/plugins/python-build/share/python-build/3.12.0rc3 +++ b/plugins/python-build/share/python-build/3.12.0 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.12.0rc3" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0rc3.tar.xz#96397e891e98802b1d399dee3ceaeb9bcf0aa2566c8a7b1cce4d0196c277506a" standard verify_py312 copy_python_gdb ensurepip + install_package "Python-3.12.0" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz#795c34f44df45a0e9b9710c8c71c15c671871524cd412ca14def212e8ccb155d" standard verify_py312 copy_python_gdb ensurepip else - install_package "Python-3.12.0rc3" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0rc3.tgz#b808294fb2e1c4511ec2ec3c0b643a047f94de64f95ec912e3880bbcc73bd101" standard verify_py312 copy_python_gdb ensurepip + install_package "Python-3.12.0" "https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz#51412956d24a1ef7c97f1cb5f70e185c13e3de1f50d131c0aac6338080687afb" standard verify_py312 copy_python_gdb ensurepip fi From 3edc31eb3d3d305a0996869e0b97c3ff00e32c49 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Mon, 2 Oct 2023 19:53:49 +0300 Subject: [PATCH 011/246] v2.3.28 --- CHANGELOG.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 98b34c58..dc1f1c50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Version History +# Release v2.3.28 + +* Prioritize 'zlib from xcode sdk' flag correctly by @native-api in https://github.com/pyenv/pyenv/pull/2791 +* Prefer OpenSSL 3 in Homebrew in 3.13-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2793 +* Add CPython 3.12.0rc3 by @saaketp in https://github.com/pyenv/pyenv/pull/2795 +* Add graalpy-23.1.0 and split between graalpy and graalpy-community by @msimacek in https://github.com/pyenv/pyenv/pull/2796 +* Update the OpenSSL dependency for Python 2.7.18 by @lpapp-foundry in https://github.com/pyenv/pyenv/pull/2797 +* Add CPython 3.12.0 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2804 + # Release v2.3.27 * Prefer OpenSSL 3 in Homebrew since 3.12 by @native-api in https://github.com/pyenv/pyenv/pull/2781 From a19d6138778fbe5f76816ad162ccd1de3da47d4e Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Mon, 2 Oct 2023 19:54:11 +0300 Subject: [PATCH 012/246] Update CHANGELOG.md --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc1f1c50..cb1f051d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Version History -# Release v2.3.28 +## Release v2.3.28 * Prioritize 'zlib from xcode sdk' flag correctly by @native-api in https://github.com/pyenv/pyenv/pull/2791 * Prefer OpenSSL 3 in Homebrew in 3.13-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2793 @@ -9,7 +9,7 @@ * Update the OpenSSL dependency for Python 2.7.18 by @lpapp-foundry in https://github.com/pyenv/pyenv/pull/2797 * Add CPython 3.12.0 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2804 -# Release v2.3.27 +## Release v2.3.27 * Prefer OpenSSL 3 in Homebrew since 3.12 by @native-api in https://github.com/pyenv/pyenv/pull/2781 * Fix get-pip urls for older pypy versions by @TimPansino in https://github.com/pyenv/pyenv/pull/2788 From 28e7000b485bff61235d8a691c3989c9a5ed0a53 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Mon, 2 Oct 2023 19:54:39 +0300 Subject: [PATCH 013/246] v2.3.28 --- libexec/pyenv---version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 7b6e566c..a8e76e14 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.27" +version="2.3.28" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 7fbec9a971ba877245199e0128e5535997f24d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Rom=C3=A1n?= Date: Mon, 2 Oct 2023 14:10:51 -0700 Subject: [PATCH 014/246] Add CPython 3.11.6 --- plugins/python-build/share/python-build/3.11.6 | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.11.6 diff --git a/plugins/python-build/share/python-build/3.11.6 b/plugins/python-build/share/python-build/3.11.6 new file mode 100644 index 00000000..de1bdbd4 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.6 @@ -0,0 +1,10 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.6" "https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tar.xz#0fab78fa7f133f4f38210c6260d90d7c0d5c7198446419ce057ec7ac2e6f5f38" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.6" "https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tgz#c049bf317e877cbf9fce8c3af902436774ecef5249a29d10984ca3a37f7f4736" standard verify_py311 copy_python_gdb ensurepip +fi From 931a7d7c7f5a4f854262167c0df5ddd775776b0e Mon Sep 17 00:00:00 2001 From: Benoit Daloze Date: Thu, 5 Oct 2023 12:03:39 +0200 Subject: [PATCH 015/246] Add GraalPy 23.1.0 definition using the faster Oracle GraalVM distribution * Use the new Oracle GraalVM distribution to provide the best user experience, as it significantly faster than GraalVM CE and is free for development and production use: https://medium.com/graalvm/whats-new-in-graalvm-languages-161527df3d76 --- .../share/python-build/graalpy-23.1.0 | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-23.1.0 diff --git a/plugins/python-build/share/python-build/graalpy-23.1.0 b/plugins/python-build/share/python-build/graalpy-23.1.0 new file mode 100644 index 00000000..c7915da0 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-23.1.0 @@ -0,0 +1,63 @@ +# Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='23.1.0' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-23.1.0" && echo + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="afbb81f034e77aecf4717fe14f2a7403aa1b82f0abf53a2e55e46bd49efe8c39" + ;; +"linux-aarch64" ) + checksum="be1e21ea245ddbdb9c266e670d6f1e76a55c693f98cee44aa74a76b249e53f96" + ;; +"macos-amd64" ) + checksum="6445537c597567ccf5ae37d296ecd988a92149fb4a1fb57088811e75f19c6da4" + ;; +"macos-aarch64" ) + checksum="f1b9b22cd8c0afb7eabd59fad554c23f452fbafcdffccf8a22eca037199d62ae" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip From 928f69cf9ab4df25074de1196e9c3cffe02087f6 Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Thu, 5 Oct 2023 23:59:29 -0400 Subject: [PATCH 016/246] Install ncurses from Homebrew, if available (#2813) XCode Command Line Tools 15.0 was recently released, and it contains a broken version of ncurses 6.0. Some uses of Python's `curses` module will segfault when compiled with it. The solution is to switch to using the version of ncurses from Homebrew, which is currently 6.4. Support for ncurses 6 was added to Python 3.7 and was backported to 3.6 and 2.7, so this change should not break any recently supported Python versions. Tested with Python 3.12, 3.11, and 2.7, and all tests in the `test.test_curses` module pass without issue. See https://github.com/python/cpython/issues/109617 and https://github.com/python/cpython/issues/69906 for more information. --- plugins/python-build/bin/python-build | 13 ++++ plugins/python-build/test/build.bats | 96 ++++++++++++++++-------- plugins/python-build/test/compiler.bats | 2 +- plugins/python-build/test/pyenv_ext.bats | 2 +- 4 files changed, 78 insertions(+), 35 deletions(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 349c8de5..783848dc 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -803,6 +803,7 @@ build_package_standard_build() { use_homebrew || true use_tcltk || true use_homebrew_readline || use_freebsd_pkg || true + use_homebrew_ncurses || true if is_mac -ge 1014; then use_xcode_sdk_zlib || use_homebrew_zlib || true else @@ -1468,6 +1469,18 @@ use_homebrew_readline() { fi } +use_homebrew_ncurses() { + can_use_homebrew || return 1 + local libdir="$(brew --prefix ncurses 2>/dev/null || true)" + if [ -d "$libdir" ]; then + echo "python-build: use ncurses from homebrew" + export CPPFLAGS="-I$libdir/include${CPPFLAGS:+ $CPPFLAGS}" + export LDFLAGS="-L$libdir/lib${LDFLAGS:+ $LDFLAGS}" + else + return 1 + fi +} + prefer_openssl11() { # Allow overriding the preference of OpenSSL version per definition basis (#1302, #1325, #1326) PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl@1.1 openssl}" diff --git a/plugins/python-build/test/build.bats b/plugins/python-build/test/build.bats index 8a0dee1c..f050e4b5 100644 --- a/plugins/python-build/test/build.bats +++ b/plugins/python-build/test/build.bats @@ -62,7 +62,7 @@ assert_build_log() { cached_tarball "yaml-0.1.6" cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Linux'; done + for i in {1..10}; do stub uname '-s : echo Linux'; done stub brew false stub_make_install stub_make_install @@ -89,7 +89,7 @@ OUT cached_tarball "yaml-0.1.6" cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Linux'; done + for i in {1..10}; do stub uname '-s : echo Linux'; done stub brew false stub_make_install stub_make_install @@ -119,7 +119,7 @@ OUT cached_tarball "yaml-0.1.6" cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Linux'; done + for i in {1..10}; do stub uname '-s : echo Linux'; done stub brew false stub_make_install stub_make_install @@ -151,7 +151,7 @@ OUT BREW_PREFIX="$TMP/homebrew-prefix" mkdir -p "$BREW_PREFIX" - for i in {1..8}; do stub uname '-s : echo Darwin'; done + for i in {1..9}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done stub brew "--prefix : echo '$BREW_PREFIX'" false stub_make_install @@ -179,10 +179,10 @@ OUT brew_libdir="$TMP/homebrew-yaml" mkdir -p "$brew_libdir" - for i in {1..9}; do stub uname '-s : echo Darwin'; done + for i in {1..10}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done stub brew "--prefix libyaml : echo '$brew_libdir'" - for i in {1..4}; do stub brew false; done + for i in {1..5}; do stub brew false; done stub_make_install install_fixture definitions/needs-yaml @@ -205,7 +205,7 @@ OUT cached_tarball "yaml-0.1.6" cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Linux'; done + for i in {1..10}; do stub uname '-s : echo Linux'; done stub brew true; brew stub_make_install stub_make_install @@ -234,11 +234,11 @@ OUT readline_libdir="$TMP/homebrew-readline" mkdir -p "$readline_libdir" - for i in {1..7}; do stub uname '-s : echo Darwin'; done + for i in {1..8}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done for i in {1..2}; do stub brew false; done stub brew "--prefix readline : echo '$readline_libdir'" - stub brew false + for i in {1..2}; do stub brew false; done stub_make_install run_inline_definition <>"$tcl_tk_libdir/lib/tclConfig.sh" - for i in {1..9}; do stub uname '-s : echo Darwin'; done + for i in {1..10}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done stub brew false for i in {1..2}; do stub brew "--prefix tcl-tk : echo '$tcl_tk_libdir'"; done - for i in {1..2}; do stub brew false; done + for i in {1..3}; do stub brew false; done stub_make_install @@ -452,10 +482,10 @@ OUT tcl_tk_version_long="8.6.10" tcl_tk_version="${tcl_tk_version_long%.*}" - for i in {1..8}; do stub uname '-s : echo Darwin'; done + for i in {1..9}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done - for i in {1..4}; do stub brew false; done + for i in {1..5}; do stub brew false; done stub_make_install export PYTHON_CONFIGURE_OPTS="--with-tcltk-libs='-L${TMP}/custom-tcl-tk/lib -ltcl$tcl_tk_version -ltk$tcl_tk_version'" @@ -480,7 +510,7 @@ OUT @test "tcl-tk is linked from Homebrew via pkgconfig only when envvar is set" { cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Darwin'; done + for i in {1..10}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done tcl_tk_libdir="$TMP/homebrew-tcl-tk" @@ -488,7 +518,7 @@ OUT stub brew false for i in {1..2}; do stub brew "--prefix tcl-tk : echo '${tcl_tk_libdir}'"; done - for i in {1..2}; do stub brew false; done + for i in {1..3}; do stub brew false; done stub_make_install @@ -513,7 +543,7 @@ OUT @test "number of CPU cores defaults to 2" { cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Darwin'; done + for i in {1..10}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 10.10'; done stub sysctl false @@ -540,7 +570,7 @@ OUT @test "number of CPU cores is detected on Mac" { cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Darwin'; done + for i in {1..10}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 10.10'; done stub sysctl '-n hw.ncpu : echo 4' @@ -570,7 +600,7 @@ OUT for i in {1..7}; do stub uname '-s : echo FreeBSD'; done stub uname '-r : echo 11.0-RELEASE' - for i in {1..2}; do stub uname '-s : echo FreeBSD'; done + for i in {1..3}; do stub uname '-s : echo FreeBSD'; done for i in {1..3}; do stub pkg false; done stub sysctl '-n hw.ncpu : echo 1' @@ -597,7 +627,7 @@ OUT @test "setting PYTHON_MAKE_INSTALL_OPTS to a multi-word string" { cached_tarball "Python-3.6.2" - for i in {1..8}; do stub uname '-s : echo Linux'; done + for i in {1..9}; do stub uname '-s : echo Linux'; done stub_make_install @@ -621,7 +651,7 @@ OUT @test "(PYTHON_)CONFIGURE_OPTS and (PYTHON_)MAKE_OPTS take priority over automatically added options" { cached_tarball "Python-3.6.2" - for i in {1..8}; do stub uname '-s : echo Linux'; done + for i in {1..9}; do stub uname '-s : echo Linux'; done stub_make_install @@ -649,7 +679,7 @@ OUT @test "--enable-shared is not added if --disable-shared is passed" { cached_tarball "Python-3.6.2" - for i in {1..8}; do stub uname '-s : echo Linux'; done + for i in {1..9}; do stub uname '-s : echo Linux'; done stub_make_install @@ -673,9 +703,9 @@ OUT @test "configuring with dSYM in MacOS" { cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Darwin'; done + for i in {1..10}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done - for i in {1..4}; do stub brew false; done + for i in {1..5}; do stub brew false; done stub_make_install run_inline_definition <> build.log' stub_make_install diff --git a/plugins/python-build/test/compiler.bats b/plugins/python-build/test/compiler.bats index 8f9f3eea..63da5800 100644 --- a/plugins/python-build/test/compiler.bats +++ b/plugins/python-build/test/compiler.bats @@ -69,7 +69,7 @@ DEF mkdir -p "$INSTALL_ROOT" cd "$INSTALL_ROOT" - for i in {1..9}; do stub uname '-s : echo Darwin'; done + for i in {1..10}; do stub uname '-s : echo Darwin'; done for i in {1..3}; do stub sw_vers '-productVersion : echo 10.10'; done stub cc 'false' diff --git a/plugins/python-build/test/pyenv_ext.bats b/plugins/python-build/test/pyenv_ext.bats index 6212638b..a4d45901 100644 --- a/plugins/python-build/test/pyenv_ext.bats +++ b/plugins/python-build/test/pyenv_ext.bats @@ -325,7 +325,7 @@ EOS cached_tarball "Python-3.6.2" for i in {1..4}; do stub brew false; done - for i in {1..7}; do stub uname '-s : echo Linux'; done + for i in {1..8}; do stub uname '-s : echo Linux'; done stub "$MAKE" \ " : echo \"$MAKE \$@\" >> build.log" \ " : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" From 7d7e7e5b93b12c83823fd975ee0d67026401dc31 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Fri, 6 Oct 2023 08:05:28 +0300 Subject: [PATCH 017/246] v2.3.29 --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index cb1f051d..09099846 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Version History +## Release v2.3.29 + +* Add CPython 3.11.6 by @thecesrom in https://github.com/pyenv/pyenv/pull/2806 +* Add GraalPy 23.1.0 definition using the faster Oracle GraalVM distribution by @eregon in https://github.com/pyenv/pyenv/pull/2812 +* Install ncurses from Homebrew, if available by @aphedges in https://github.com/pyenv/pyenv/pull/2813 + ## Release v2.3.28 * Prioritize 'zlib from xcode sdk' flag correctly by @native-api in https://github.com/pyenv/pyenv/pull/2791 From bb38acd99460f6dd2c5367cbc28947c4ef2fc209 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Fri, 6 Oct 2023 08:05:47 +0300 Subject: [PATCH 018/246] v2.3.29 --- libexec/pyenv---version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/pyenv---version b/libexec/pyenv---version index a8e76e14..3e3017a2 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.28" +version="2.3.29" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From dee8a9dbadd87ec6fa677c73a5e0c306aef42935 Mon Sep 17 00:00:00 2001 From: native-api Date: Thu, 12 Oct 2023 22:09:48 +0300 Subject: [PATCH 019/246] Fix intermittent "broken pipe" in version sort test (#2817) --- test/versions.bats | 1 + 1 file changed, 1 insertion(+) diff --git a/test/versions.bats b/test/versions.bats index 895e550f..ad2cf07a 100644 --- a/test/versions.bats +++ b/test/versions.bats @@ -201,6 +201,7 @@ OUT create_version "1.218.0" create_executable sort </dev/null if [ "\$1" == "--version-sort" ]; then echo "${PYENV_ROOT}/versions/1.9.0" echo "${PYENV_ROOT}/versions/1.53.0" From b8b6846a21536c9321b4787138889fbe180113c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Fri, 13 Oct 2023 12:07:42 -0600 Subject: [PATCH 020/246] Add CPython 3.13.0a1 (#2818) --- plugins/python-build/share/python-build/3.13.0a1 | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.13.0a1 diff --git a/plugins/python-build/share/python-build/3.13.0a1 b/plugins/python-build/share/python-build/3.13.0a1 new file mode 100644 index 00000000..6ec8bbcf --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0a1 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.0a1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a1.tar.xz#f0281bf22cc00414361c14fc9197183e7eb2eabb729656b69442224fbb63eecb" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.0a1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a1.tgz#fb1674c6317651bc9c1dfeb6339cd706b84c95f8e614f395d2ffb0af19bbe885" standard verify_py313 copy_python_gdb ensurepip +fi From c6f0d31dc937f8805d231987f030ac506be19130 Mon Sep 17 00:00:00 2001 From: Dan Dees Date: Wed, 4 Oct 2023 02:30:27 +0300 Subject: [PATCH 021/246] pypy 3.7.13 --- .../share/python-build/pypy2.7-7.3.13 | 81 +++++++++++++++++++ .../share/python-build/pypy2.7-7.3.13-src | 14 ++++ .../share/python-build/pypy3.10-7.3.13 | 81 +++++++++++++++++++ .../share/python-build/pypy3.10-7.3.13-src | 14 ++++ .../share/python-build/pypy3.9-7.3.13 | 81 +++++++++++++++++++ .../share/python-build/pypy3.9-7.3.13-src | 14 ++++ 6 files changed, 285 insertions(+) create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.13 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.13-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.13 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.13-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.13 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.13-src diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.13 b/plugins/python-build/share/python-build/pypy2.7-7.3.13 new file mode 100644 index 00000000..627ffc42 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.13 @@ -0,0 +1,81 @@ +VERSION='7.3.13' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=f1e20f833cc86a097c1f1318069fc17d01c3988678c1438fe27ed567fcb5cfd0 +linux32_hash=b727d2e759a740f45bab1e333029d001c4384b52949bcbb4bd2ad7912eae8dad +linux64_hash=e41ceb5dc6c4d3a9311ed5f88edfeedbf3e8abbd1ed3c4f2e151a90a5cf4e1d7 +osarm64_hash=5b86cf0750abc188a0355380d10c7bab1dec51b610cde23ce78f30a9ef296618 +osx64_hash=50769df0091e8fa51c9e4356e0cb204e6f6aa54f502ec5a6e55aef03d0ac5675 +s390x_hash=fbb2f3d92831c02b094f17e9609b95a6202d4bdcddae437e380ab14388d4556e + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.13-src b/plugins/python-build/share/python-build/pypy2.7-7.3.13-src new file mode 100644 index 00000000..275d8091 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.13-src @@ -0,0 +1,14 @@ +VERSION='7.3.13' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=976984bc6ca5ec9d37ae4e219b020cbed2751d1a02267033f59ed700ba8cec40 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.13 b/plugins/python-build/share/python-build/pypy3.10-7.3.13 new file mode 100644 index 00000000..1690b6ee --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.13 @@ -0,0 +1,81 @@ +VERSION='7.3.13' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=ac476f01c9653358404f2e4b52f62307b2f64ccdb8c96dadcbfe355824d81a63 +linux32_hash=bfba57eb1f859dd0ad0d6fe841bb12e1256f1f023c7fbca083b536cccbc1233b +linux64_hash=54936eeafd9350a5ea0375b036272a260871b9bca82e1b0bb3201deea9f5a442 +osarm64_hash=efb3007b7aace0af6e3b30d381088a5bbc175973a6627b6b0d624a2ca2dc63ce +osx64_hash=2c6238b9ece7b94ffdfd1d9b50619edef4b169a5c78adcdb691fce6709cd6610 +s390x_hash=3c813c7efa6a026b281313b299c186c585155fc164c7538e65d41efdabff87c9 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.13-src b/plugins/python-build/share/python-build/pypy3.10-7.3.13-src new file mode 100644 index 00000000..4ebe5f2f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.13-src @@ -0,0 +1,14 @@ +VERSION='7.3.13' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=4ac1733c19d014d3193c804e7f40ffccbf6924bcaaee1b6089b82b9bf9353a6d + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.13 b/plugins/python-build/share/python-build/pypy3.9-7.3.13 new file mode 100644 index 00000000..2161b5ce --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.13 @@ -0,0 +1,81 @@ +VERSION='7.3.13' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=317d7876c5825a086f854253648b967a432b993ce87695d2895d3ad6ed0d2716 +linux32_hash=ac695238b4a3635ac6b482e74e04e2ea78b31acca0decd5de601dfd2f4ebf35a +linux64_hash=323b05a9f607e932cda1995cbe77a96e4ea35994631aa6d734c8035e8479b74e +osarm64_hash=333131d62c502aa5d5fb58a58cdf01de4bfb2c1db5a9bb4c04515258abe6bced +osx64_hash=fb1ff67340353e837498102fec2b0b45744bb189dced57ee2e00045785e69662 +s390x_hash=213c88f652a99c4dc4e8e00b4b5b58f381c7f7e9ea1a9b65801fc0eb1e50df0a + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.13-src b/plugins/python-build/share/python-build/pypy3.9-7.3.13-src new file mode 100644 index 00000000..07ff9893 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.13-src @@ -0,0 +1,14 @@ +VERSION='7.3.13' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=bc6147268105e7cb3bd57b401e6d97f66aa4ede269104b2712a7cdd9f02f68cd + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' From 509d3a88556dafeb3a5ad985c1d67d0c0a08ad36 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 13 Oct 2023 22:24:38 +0300 Subject: [PATCH 022/246] Use pip<21 syntax in ensurepip call for pypy2.7-7.3.13 and 2.7.18 --- plugins/python-build/bin/python-build | 11 ++++++++++- plugins/python-build/share/python-build/2.7.18 | 4 ++-- .../python-build/share/python-build/pypy2.7-7.3.13 | 2 +- .../share/python-build/pypy2.7-7.3.13-src | 2 +- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 783848dc..95d56af2 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -2037,14 +2037,23 @@ build_package_get_pip() { build_package_symlink_version_suffix } +# Pip <21 (in 2.7 and derivatives like PyPy-2.7) doesn't support -I +build_package_ensurepip_lt21() { + build_package_ensurepip lt21 +} + build_package_ensurepip() { + local mode="$1" local ensurepip_opts # Install as `--altinstall` if the Python is installed as `altinstall` (#255) if [[ "$PYTHON_MAKE_INSTALL_TARGET" == *"altinstall"* ]]; then ensurepip_opts="--altinstall" fi + local python_opts="-I" + if [[ $mode == "lt21" ]]; then python_opts="-s"; fi + # FIXME: `--altinstall` with `get-pip.py` - "$PYTHON_BIN" -I -m ensurepip ${ensurepip_opts} 1>/dev/null 2>&1 || build_package_get_pip "$@" || return 1 + "$PYTHON_BIN" $python_opts -m ensurepip ${ensurepip_opts} 1>/dev/null 2>&1 || build_package_get_pip "$@" || return 1 build_package_symlink_version_suffix } diff --git a/plugins/python-build/share/python-build/2.7.18 b/plugins/python-build/share/python-build/2.7.18 index 5725575d..6576ca67 100644 --- a/plugins/python-build/share/python-build/2.7.18 +++ b/plugins/python-build/share/python-build/2.7.18 @@ -2,7 +2,7 @@ export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="openssl@1.1 openssl@1.0 openssl" install_package "openssl-1.1.1v" "https://www.openssl.org/source/openssl-1.1.1v.tar.gz" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz#b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43" standard verify_py27 copy_python_gdb ensurepip + install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tar.xz#b62c0e7937551d0cc02b8fd5cb0f544f9405bafc9a54d3808ed4594812edef43" standard verify_py27 copy_python_gdb ensurepip_lt21 else - install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz#da3080e3b488f648a3d7a4560ddee895284c3380b11d6de75edb986526b9a814" standard verify_py27 copy_python_gdb ensurepip + install_package "Python-2.7.18" "https://www.python.org/ftp/python/2.7.18/Python-2.7.18.tgz#da3080e3b488f648a3d7a4560ddee895284c3380b11d6de75edb986526b9a814" standard verify_py27 copy_python_gdb ensurepip_lt21 fi diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.13 b/plugins/python-build/share/python-build/pypy2.7-7.3.13 index 627ffc42..0239066b 100644 --- a/plugins/python-build/share/python-build/pypy2.7-7.3.13 +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.13 @@ -78,4 +78,4 @@ function pypy_pkg_data { declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" # install -${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.13-src b/plugins/python-build/share/python-build/pypy2.7-7.3.13-src index 275d8091..4704161e 100644 --- a/plugins/python-build/share/python-build/pypy2.7-7.3.13-src +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.13-src @@ -11,4 +11,4 @@ url="https://downloads.python.org/pypy/${ver}.tar.bz2" prefer_openssl11 install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl -install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' From 709534c21f223a466b9644679d815ddb0b48c6b1 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 15 Oct 2023 15:03:49 +0300 Subject: [PATCH 023/246] CI: add 3.12 --- .github/workflows/macos_build.yml | 1 + .github/workflows/ubuntu_build.yml | 1 + 2 files changed, 2 insertions(+) diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index dfd6f3b4..f24b5f4d 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -14,6 +14,7 @@ jobs: - "3.9" - "3.10" - "3.11" + - "3.12" runs-on: macos-11 steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/ubuntu_build.yml b/.github/workflows/ubuntu_build.yml index ac4434de..e5ba9a4d 100644 --- a/.github/workflows/ubuntu_build.yml +++ b/.github/workflows/ubuntu_build.yml @@ -14,6 +14,7 @@ jobs: - "3.9" - "3.10" - "3.11" + - "3.12" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v3 From d25cd0d0f52b5a90ad3150852d378908abcdfe87 Mon Sep 17 00:00:00 2001 From: startergo <7897244+startergo@users.noreply.github.com> Date: Sun, 15 Oct 2023 10:17:22 -0400 Subject: [PATCH 024/246] Fix linking against Homebrew's Tcl/Tk 8.6.13 in MacOS (#2820) Headers have been moved to the 'tcl-tk' subdir This was causing Tcl/Tk 8.5 from XCode SDK to be silently picked instead --- plugins/python-build/bin/python-build | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 95d56af2..0ddebaac 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -1629,6 +1629,9 @@ use_xcode_sdk_zlib() { local xc_sdk_path="$(xcrun --show-sdk-path 2>/dev/null || true)" if [ -d "$xc_sdk_path" ]; then echo "python-build: use zlib from xcode sdk" + # Even though SDK's compiler uses the SDK dirs implicitly, + # CPython's setup.py has to have nonstandard paths specified explicitly + # to search for zlib.h in them export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I${xc_sdk_path}/usr/include" if is_mac -ge 1100; then export LDFLAGS="${LDFLAGS:+$LDFLAGS }-L${xc_sdk_path}/usr/lib" @@ -1645,7 +1648,15 @@ use_homebrew_tcltk() { if [[ -z "$PYTHON_BUILD_TCLTK_USE_PKGCONFIG" ]]; then local tcltk_version="$(sh -c '. '"$tcltk_libdir"'/lib/tclConfig.sh; echo $TCL_VERSION')" package_option python configure --with-tcltk-libs="-L$tcltk_libdir/lib -ltcl$tcltk_version -ltk$tcltk_version" - package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include" + # In Homebrew Tcl/Tk 8.6.13, headers have been moved to the 'tcl-tk' subdir. + # We're not using tclConfig.sh here 'cuz it produces the version-specific path to /Cellar + # and we'd rather have rpath set to /opt/<...> to allow micro release upgrades without rebuilding + # XXX: do use tclConfig.sh and translate the paths if more path shenanigans appear in later releases + if [ -d "$tcltk_libdir/include/tcl-tk" ]; then + package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include/tcl-tk" + else + package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include" + fi fi export PKG_CONFIG_PATH="${tcltk_libdir}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" fi From 9c8f92cf4e3518c00a21c45d2c6e9f4e9f289c98 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Mon, 16 Oct 2023 21:36:46 +0300 Subject: [PATCH 025/246] v2.3.30 --- libexec/pyenv---version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 3e3017a2..0ae03bc3 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.29" +version="2.3.30" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From f50b99265c3abd72064f2ea5f4f6ae583e8f3688 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Mon, 16 Oct 2023 21:37:24 +0300 Subject: [PATCH 026/246] v2.3.30 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 09099846..0068f266 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Version History +## Release v2.3.30 + +* Fix intermittent "broken pipe" in tests by @native-api in https://github.com/pyenv/pyenv/pull/2817 +* Add CPython 3.13.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2818 +* Add PyPy 7.3.13 by @dand-oss in https://github.com/pyenv/pyenv/pull/2807 +* Fix linking against Homebrew's Tcl/Tk 8.6.13 in MacOS by @startergo in https://github.com/pyenv/pyenv/pull/2820 + ## Release v2.3.29 * Add CPython 3.11.6 by @thecesrom in https://github.com/pyenv/pyenv/pull/2806 From 27525adece4cfbfd4efac00bf079c8a5b24861c3 Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Sat, 21 Oct 2023 19:05:48 -0400 Subject: [PATCH 027/246] Determine Python versions properly for Anaconda The code for determining which Python version is bundled with which version of Anaconda has not been updated in a while. I have added 3.10 and 3.11, both of which were used in bundles this year. I also updated the URL for the source of this data, the Anaconda release notes, because it has moved. --- plugins/python-build/scripts/add_miniconda.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/python-build/scripts/add_miniconda.py b/plugins/python-build/scripts/add_miniconda.py index 929ec880..3ecb80d6 100755 --- a/plugins/python-build/scripts/add_miniconda.py +++ b/plugins/python-build/scripts/add_miniconda.py @@ -193,7 +193,11 @@ class CondaVersion(NamedTuple): else: return PyVersion.PY37 if self.flavor == "anaconda": - # https://docs.anaconda.com/anaconda/reference/release-notes/ + # https://docs.anaconda.com/free/anaconda/reference/release-notes/ + if v >= (2023,7): + return PyVersion.PY311 + if v >= (2023,3): + return PyVersion.PY310 if v >= (2021,11): return PyVersion.PY39 if v >= (2020,7): From 968fc797c32ef1eca3d652b0d5b684c0a6bb8df8 Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Fri, 20 Oct 2023 17:23:33 -0400 Subject: [PATCH 028/246] Update anaconda and miniconda with `add_miniconda.py` This adds anaconda 2023.09 and miniconda 23.9.0. --- .../share/python-build/anaconda3-2023.09-0 | 28 +++++++++++++++++++ .../python-build/miniconda3-3.10-23.9.0-0 | 28 +++++++++++++++++++ .../python-build/miniconda3-3.11-23.9.0-0 | 28 +++++++++++++++++++ .../python-build/miniconda3-3.8-23.9.0-0 | 28 +++++++++++++++++++ .../python-build/miniconda3-3.9-23.9.0-0 | 28 +++++++++++++++++++ 5 files changed, 140 insertions(+) create mode 100644 plugins/python-build/share/python-build/anaconda3-2023.09-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.9.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.9.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.9.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.9.0-0 diff --git a/plugins/python-build/share/python-build/anaconda3-2023.09-0 b/plugins/python-build/share/python-build/anaconda3-2023.09-0 new file mode 100644 index 00000000..58141219 --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2023.09-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2023.09-0-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-aarch64.sh#69ee26361c1ec974199bce5c0369e3e9a71541de7979d2b9cfa4af556d1ae0ea" "anaconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Anaconda3-2023.09-0-Linux-ppc64le" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-ppc64le.sh#5ea1ed9808af95eb2655fe6a4ffdb66bea66ecd1d053fc2ee69eacc7685ef665" "anaconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2023.09-0-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-s390x.sh#ee817071a2ad94e044fb48061a721bc86606b2f4906b705e4f42177eeb3ca7c5" "anaconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2023.09-0-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh#6c8a4abb36fbb711dc055b7049a23bbfd61d356de9468b41c5140f8a11abd851" "anaconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2023.09-0-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-MacOSX-arm64.sh#34121775d9e30a6ea12af0a462e1881670b0c175b426e06fd7b1581625ebd69b" "anaconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2023.09-0-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2023.09-0-MacOSX-x86_64.sh#0c64a2c634fe31335079d97340c277c81b3f0c9dfe862a06599570640ac897a4" "anaconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.9.0-0 b/plugins/python-build/share/python-build/miniconda3-3.10-23.9.0-0 new file mode 100644 index 00000000..81da0efd --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.9.0-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-aarch64.sh#bc0f7f0a1c83cdf1330726168518b55454d092c64593f82872a50c4b5742b958" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-ppc64le.sh#fa9d79e1df278dc72e5935fec3c87c6897a9388895a2a47b0ed49935d71c92e7" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-s390x.sh#e10a160a44b0356f2ce59ce562855461499202976197ca7e1bf25ccb51dabb57" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-Linux-x86_64.sh#b272a5f843762f0a18f6b70a162cd554a43a06adcd6f5a2102840e41907fffe5" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-MacOSX-arm64.sh#3178aad8c75b30830e97d9a232433df1dfbe6cd34f55e0d7769cfaa17aa49e84" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.9.0-0-MacOSX-x86_64.sh#88266dda3e812bf6789fceeb9cfcfbbcada860aa4050ae2a781812fbd077ed35" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.9.0-0 b/plugins/python-build/share/python-build/miniconda3-3.11-23.9.0-0 new file mode 100644 index 00000000..4c32258c --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.9.0-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-aarch64.sh#1242847b34b23353d429fcbcfb6586f0c373e63070ad7d6371c23ddbb577778a" "miniconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py311_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-ppc64le.sh#07b53e411c2e4423bd34c3526d6644b916c4b2143daa8fbcb36b8ead412239b9" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-s390x.sh#707c68e25c643c84036a16acdf836a3835ea75ffd2341c05ec2da6db1f3e9963" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-Linux-x86_64.sh#43651393236cb8bb4219dcd429b3803a60f318e5507d8d84ca00dafa0c69f1bb" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-MacOSX-arm64.sh#4215f6fc572207f73a8f64692b4936b1952051f4cd620eec2ebd1f946e98b886" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.9.0-0-MacOSX-x86_64.sh#4b60eb49cf8fea6272bd2060878ab02cbab187dffd2fd732685c3c92a60b62ed" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.9.0-0 b/plugins/python-build/share/python-build/miniconda3-3.8-23.9.0-0 new file mode 100644 index 00000000..dd256a9d --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.9.0-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-aarch64.sh#c59fbb2565812573f39b88425ef48607de70d1feadc522204811555e58bb972c" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-ppc64le.sh#4d1903b396de1c3473a81b2794f0d9792b30b4e9d98ae1c9dcfeef3aba15435b" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-s390x.sh#57cf786d2c30aed186a14e9319c596579750ef75d1c8c039734492b5e6d6762c" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-Linux-x86_64.sh#3c684c1c22d3a0e6bd5ab28186fd7b068b5c552f0937ee927ad117f35a5573fc" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-MacOSX-arm64.sh#694facc3601da8a93592d6f947818c2064d6854ca1f2a7e5b40b3e2e91e65baa" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.9.0-0-MacOSX-x86_64.sh#6fab242ca8200a1d59e54c5cc1abb89f7519a136da234e2ab77a30fb87c4ce7d" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.9.0-0 b/plugins/python-build/share/python-build/miniconda3-3.9-23.9.0-0 new file mode 100644 index 00000000..c2b8ca43 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.9.0-0 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.9.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-aarch64.sh#b3ae7a36e3adbe9f9ab152b645d8d20b09bd25b4f0a9be15bfb4d36aafdedd98" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_23.9.0-0-Linux-ppc64le" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-ppc64le.sh#f7699ab404cbcba918e1977cc54ee8573902835d3272e3d80b5a107f8c5b5b38" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.9.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-s390x.sh#eab9add06fe3b0beb9b54b3ab3fc57b944dc370a3c9342216082f7747d6c74a7" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.9.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-Linux-x86_64.sh#9200a10c762186391c35709382ed7cfa6578a051c9c76ea58f998df62c5afab0" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.9.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-MacOSX-arm64.sh#3143f830fdff011a3d389fdb53b8021e90b662615a1ed62a0bcad099cef35c26" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.9.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.9.0-0-MacOSX-x86_64.sh#763c08ad5bdf159d32e406bd3b03394e1fba6923f1936271ca27c8073f744ac2" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 011bbf0ccaf17a11e22db2d1909784de29c9c87c Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Sun, 22 Oct 2023 12:35:36 +0300 Subject: [PATCH 029/246] v2.3.31 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0068f266..dfadf9fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Version History +## Release v2.3.31 +* Add new anaconda and miniconda definitions by @aphedges in https://github.com/pyenv/pyenv/pull/2824 + ## Release v2.3.30 * Fix intermittent "broken pipe" in tests by @native-api in https://github.com/pyenv/pyenv/pull/2817 From 54f7a7c0464f4feb3ba61cfee72fc14db802f98f Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Sun, 22 Oct 2023 12:35:53 +0300 Subject: [PATCH 030/246] v2.3.31 --- libexec/pyenv---version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 0ae03bc3..34053d8a 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.30" +version="2.3.31" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 63c471d0204f0b06cca640c3a49037e4f914b63f Mon Sep 17 00:00:00 2001 From: fsc-eriker <72394365+fsc-eriker@users.noreply.github.com> Date: Mon, 30 Oct 2023 21:10:26 +0200 Subject: [PATCH 031/246] Describe --no-rehash option in the manpage (#2832) (Closes: #2831) --- man/man1/pyenv.1 | 1 + 1 file changed, 1 insertion(+) diff --git a/man/man1/pyenv.1 b/man/man1/pyenv.1 index 0629e894..c3d2de1b 100644 --- a/man/man1/pyenv.1 +++ b/man/man1/pyenv.1 @@ -234,6 +234,7 @@ Skip this section unless you must know what every line in your shell profile is \fBSets up your shims path\.\fR This is the only requirement for pyenv to function properly\. You can do this by hand by prepending \fB$(pyenv root)/shims\fR to your \fB$PATH\fR\. .IP "2." 4 \fBRehashes shims\.\fR From time to time you'll need to rebuild your shim files\. Doing this on init makes sure everything is up to date\. You can always run \fBpyenv rehash\fR manually\. +You can disable this functionality by adding \fB--no-rehash\fR to the end of your \fBpyenv init\fR command line. .IP "3." 4 \fBInstalls the sh dispatcher\.\fR This bit is also optional, but allows pyenv and plugins to change variables in your current shell, making commands like \fBpyenv shell\fR possible\. The sh dispatcher doesn't do anything crazy like override \fBcd\fR or hack your shell prompt, but if for some reason you need \fBpyenv\fR to be a real script rather than a shell function, you can safely skip it\. .IP "" 0 From 087793a660f1b8c53f1dbf90f7ac2ef38777c0ea Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 12 Nov 2023 11:58:17 +0300 Subject: [PATCH 032/246] Make adding $PYENV_ROOT/bin to PATH independent of other software (#2837) Fixes breakage in WSL with Pyenv-win installed in the host system; doesn't affect other supported installation scenarios. --- README.md | 4 ++-- libexec/pyenv-init | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ea739f39..ab5ded5f 100644 --- a/README.md +++ b/README.md @@ -317,14 +317,14 @@ See [Advanced configuration](#advanced-configuration) for details and more confi * to add to `~/.bash_profile`: ~~~ bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile - echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(pyenv init -)"' >> ~/.bash_profile ~~~ - For **Zsh**: ~~~ zsh echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc - echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc echo 'eval "$(pyenv init -)"' >> ~/.zshrc ~~~ diff --git a/libexec/pyenv-init b/libexec/pyenv-init index c1e0da7b..5ce275e1 100755 --- a/libexec/pyenv-init +++ b/libexec/pyenv-init @@ -165,7 +165,7 @@ function help_() { fi echo echo 'export PYENV_ROOT="$HOME/.pyenv"' - echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' echo 'eval "$(pyenv init -)"' ;; esac From fb2c65f149507c694b99abecd5f714e0368d4eb8 Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 12 Nov 2023 12:41:13 +0300 Subject: [PATCH 033/246] Make `pyenv init` output insertable to startup files (#2838) --- libexec/pyenv-init | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libexec/pyenv-init b/libexec/pyenv-init index 5ce275e1..a875bb31 100755 --- a/libexec/pyenv-init +++ b/libexec/pyenv-init @@ -160,8 +160,8 @@ function help_() { echo "$profile :" else echo - echo "${profile_explain:-$profile} (for login shells)" - echo "and $rc (for interactive shells) :" + echo "# ${profile_explain:-$profile} (for login shells)" + echo "# and $rc (for interactive shells) :" fi echo echo 'export PYENV_ROOT="$HOME/.pyenv"' From 988258ea5f769566b9b2ab4ead6ca99d1f51f24e Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Sun, 12 Nov 2023 18:52:52 +0300 Subject: [PATCH 034/246] v2.3.32 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfadf9fe..239fa99c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Version History +## Release v2.3.32 +* Describe --no-rehash option in the manpage by @fsc-eriker in https://github.com/pyenv/pyenv/pull/2832 +* Make adding $PYENV_ROOT/bin to PATH independent of other software by @native-api in https://github.com/pyenv/pyenv/pull/2837 +* Make `pyenv init` output insertable to startup files by @native-api in https://github.com/pyenv/pyenv/pull/2838 + ## Release v2.3.31 * Add new anaconda and miniconda definitions by @aphedges in https://github.com/pyenv/pyenv/pull/2824 From d31230109957392ddf178ddfe78db195afbe8ccf Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Sun, 12 Nov 2023 18:53:11 +0300 Subject: [PATCH 035/246] v2.3.32 --- libexec/pyenv---version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 34053d8a..86d9973e 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.31" +version="2.3.32" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 62242c1d561040d7d2b082b88b85c822558b4b40 Mon Sep 17 00:00:00 2001 From: Michael Goerz Date: Mon, 13 Nov 2023 12:39:23 -0500 Subject: [PATCH 036/246] Add miniforge3-23.3.1-1 --- .../share/python-build/miniforge3-23.3.1-1 | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniforge3-23.3.1-1 diff --git a/plugins/python-build/share/python-build/miniforge3-23.3.1-1 b/plugins/python-build/share/python-build/miniforge3-23.3.1-1 new file mode 100644 index 00000000..aac3c7ca --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.3.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.3.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-Linux-aarch64.sh#dc5d94b83251621f088bd82df896ea45e63597293ece7ccd923b2346aed34b89" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.3.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-Linux-ppc64le.sh#2eafa28fee5f1dfffb01feaca70de000f8e8335e1f659603ef0b9a40b9d1f213" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.3.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-Linux-x86_64.sh#b3e14bd70f99bc8959445fad3532128a6af36c5e77bc62226db0e80d1df0e9e9" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.3.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-MacOSX-arm64.sh#51d15ed1471ef8633f99574dc0c43fc972ce1981ebf08eade4d9b249bb7640e4" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.3.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Miniforge3-23.3.1-1-MacOSX-x86_64.sh#d8eef4816b28f1bfc099d8fc2cdac4fb0ebbe1ddd27f4acb66d83d66c260cb63" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From ef0c2a787b9db55f2554caf6d77ee53b40c37bf0 Mon Sep 17 00:00:00 2001 From: binbjz Date: Sat, 18 Nov 2023 15:53:40 +0800 Subject: [PATCH 037/246] Add support for miniconda3-3.11-23.10.0-1 --- .../python-build/miniconda3-3.11-23.10.0-1 | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.10.0-1 diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.10.0-1 b/plugins/python-build/share/python-build/miniconda3-3.11-23.10.0-1 new file mode 100644 index 00000000..e1e50bad --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.10.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-aarch64.sh#a60e70ad7e8ac5bb44ad876b5782d7cdc66e10e1f45291b29f4f8d37cc4aa2c8" "miniconda" verify_py311 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py311_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-ppc64le.sh#1a2eda0a9a52a4bd058abbe9de5bb2bc751fcd7904c4755deffdf938d6f4436e" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-s390x.sh#ae212385c9d7f7473da7401d3f5f6cbbbc79a1fce730aa48531947e9c07e0808" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-Linux-x86_64.sh#d0643508fa49105552c94a523529f4474f91730d3e0d1f168f1700c43ae67595" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script ""Miniconda3-py311_23.10.0-1-MacOSX-arm64.sh "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-MacOSX-arm64.sh#5043144d7eaea2286e30d091b62fcf50f7ed983b092230e56c370b592e7a57f2" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script ""Miniconda3-py311_23.10.0-1-MacOSX-x86_64.sh "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.10.0-1-MacOSX-x86_64.sh#8c50faa3880fdef96967477af09d41c52332998beeee7ef8116c79d4f5023d72" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From ae1c5d2bff324cf859d37d08bd7f264ab2b46ade Mon Sep 17 00:00:00 2001 From: binbjz Date: Sat, 18 Nov 2023 16:39:57 +0800 Subject: [PATCH 038/246] =?UTF-8?q?Add=20support=20for=20miniconda3-3.10-2?= =?UTF-8?q?3.10.0-1=E3=80=81miniconda3-3.9-23.10.0-1=E3=80=81miniconda3-3.?= =?UTF-8?q?8-23.10.0-1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../python-build/miniconda3-3.10-23.10.0-1 | 28 +++++++++++++++++++ .../python-build/miniconda3-3.8-23.10.0-1 | 28 +++++++++++++++++++ .../python-build/miniconda3-3.9-23.10.0-1 | 28 +++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.10.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.10.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.10.0-1 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.10.0-1 b/plugins/python-build/share/python-build/miniconda3-3.10-23.10.0-1 new file mode 100644 index 00000000..ecdea4ed --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.10.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-aarch64.sh#3b8698e433dd9e8f948f94939b176b7819807bedb86020b81e2fca674d3df3b4" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py310_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-ppc64le.sh#8ba2b32ee15be9e43c3712d9235e8c6f1350de733e72f67ef035c878eee134e5" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-s390x.sh#ab037a5df6414fe48979285769a61bf99e46d1efd1c98bd3b0a9ab767862f86b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-Linux-x86_64.sh#c7a34df472feb69805b64df6e8db58363c5ccab41cd3b40b07e3e6dfb924359a" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.10.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-MacOSX-arm64.sh#a1477dfb4edfe922c2d1ed8dce90c16e6c57b3008f9503fae804acfda67736ae" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.10.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.10.0-1-MacOSX-x86_64.sh#bea320962dce404ecc1f6f4b0c0462cd3300df8ab165e5cb5bcee372c498535f" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.10.0-1 b/plugins/python-build/share/python-build/miniconda3-3.8-23.10.0-1 new file mode 100644 index 00000000..77d18874 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.10.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-aarch64.sh#aee297bdefb15cfee9e2cb4c0881f811ce18c1a066ac75b811b21967ccd41acd" "miniconda" verify_py38 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py38_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-ppc64le.sh#1d7ccb2fa31042116b38ec518a63428d9cf87adba8771ffa9f0e3241f6b5a72a" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-s390x.sh#095bfb828b3155e6a345b7e821010451dfd291e8373b618a3b72a050a1c7a909" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-Linux-x86_64.sh#6842afb93a64fd4f04daa0f49f4618857d2327ead1366851eb0e49f1ae460f00" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.10.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-MacOSX-arm64.sh#c5ece9fce0a2f3c68600476e4256146f03511f82f76d05324eedbdc9eb06bed7" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script ""Miniconda3-py38_23.10.0-1-MacOSX-x86_64.sh "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.10.0-1-MacOSX-x86_64.sh#0e6921f44b4278aa178969f59da57ca4ced2a55ef7730c774296f1de1801c561" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.10.0-1 b/plugins/python-build/share/python-build/miniconda3-3.9-23.10.0-1 new file mode 100644 index 00000000..04cd1e60 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.10.0-1 @@ -0,0 +1,28 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.10.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-aarch64.sh#e7558e2a628ce2f40e8ea792763b942ba587b01b33a677d2d22e7372ec50dbb7" "miniconda" verify_py39 + ;; +"Linux-ppc64le" ) + install_script "Miniconda3-py39_23.10.0-1-Linux-ppc64le.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-ppc64le.sh#cd92b3272d85c94ef54b685d49fbbd9d36c6680e6b518f1806c039ddb34fc754" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.10.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-s390x.sh#1aa4b984316faa9917c0dce8656bf3b32941def86397815adbe124185b7d3cdb" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.10.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-Linux-x86_64.sh#3dbb87a74f80c84ae166a380bf51da8ef75699ce97c234e3e196afa20d1a9319" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.10.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-MacOSX-arm64.sh#adfac9e92405a6fdb60cc3b39018cb5084d096799be8f82fa88d26dadbe719b6" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.10.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.10.0-1-MacOSX-x86_64.sh#6d26cbe11e964bf573c459420154139d922ffa2e5c690c9c1e9bdb84f17f83af" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From ae74597dedc9a2994679f3f23966d30d4eb1a571 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Wed, 22 Nov 2023 16:25:45 -0600 Subject: [PATCH 039/246] Add CPython 3.13.0a2 --- .../python-build/share/python-build/{3.13.0a1 => 3.13.0a2} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename plugins/python-build/share/python-build/{3.13.0a1 => 3.13.0a2} (57%) diff --git a/plugins/python-build/share/python-build/3.13.0a1 b/plugins/python-build/share/python-build/3.13.0a2 similarity index 57% rename from plugins/python-build/share/python-build/3.13.0a1 rename to plugins/python-build/share/python-build/3.13.0a2 index 6ec8bbcf..896e5edf 100644 --- a/plugins/python-build/share/python-build/3.13.0a1 +++ b/plugins/python-build/share/python-build/3.13.0a2 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.13.0a1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a1.tar.xz#f0281bf22cc00414361c14fc9197183e7eb2eabb729656b69442224fbb63eecb" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0a2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a2.tar.xz#b6d46b44190c4c02421eb69a042d16b0c55481bdda818c6c416dc244113a9c2d" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.13.0a1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a1.tgz#fb1674c6317651bc9c1dfeb6339cd706b84c95f8e614f395d2ffb0af19bbe885" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0a2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a2.tgz#9a3c363589ec882f2d1ff008f29f66231ccb552366dd9d8041a65c7e799cbafd" standard verify_py313 copy_python_gdb ensurepip fi From 1239b7cb1f9424a17d515ece0c1aa495a0da1b44 Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 26 Nov 2023 12:59:10 +0300 Subject: [PATCH 040/246] python-build: Document PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA and PYTHON_BUILD_HTTP_CLIENT (#2853) grammar --- plugins/python-build/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index d3eec17d..7b0601cd 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -113,7 +113,9 @@ You can set certain environment variables to control the build process. checksum of the file to the mirror URL. * `PYTHON_BUILD_SKIP_MIRROR`, if set, forces python-build to download packages from their original source URLs instead of using a mirror. -* `PYTHON_BUILD_SKIP_HOMEBREW`, if set, will not search for libraries installed by Homebrew on macOS. +* `PYTHON_BUILD_HTTP_CLIENT`, explicitly specify the HTTP client type to use. `aria2`, `curl` and `wget` are the supported values and by default, are searched in that order. +* `PYTHON_BUILD_SKIP_HOMEBREW`, if set, will not search for libraries installed by Homebrew in macOS. +* `PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA`, override the Homebrew OpenSSL formula to use. * `PYTHON_BUILD_ROOT` overrides the default location from where build definitions in `share/python-build/` are looked up. * `PYTHON_BUILD_DEFINITIONS` can be a list of colon-separated paths that get From efb01775c0c413f964a098c75372d847b0811312 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Mon, 27 Nov 2023 15:54:25 +0300 Subject: [PATCH 041/246] v2.3.33 --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 239fa99c..56d28d27 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Version History +## Release v2.3.33 +* Add miniforge3-23.3.1-1 by @goerz in https://github.com/pyenv/pyenv/pull/2839 +* Add support for miniconda3-3.11-23.10.0-1 by @binbjz in https://github.com/pyenv/pyenv/pull/2843 +* Add support for miniconda3 23.10.0-1 with py3.10、py3.9、py3.8 by @binbjz in https://github.com/pyenv/pyenv/pull/2844 +* Add CPython 3.13.0a2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2849 +* python-build: Document PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA and PYTHON_BUILD_HTTP_CLIENT by @native-api in https://github.com/pyenv/pyenv/pull/2853 + ## Release v2.3.32 * Describe --no-rehash option in the manpage by @fsc-eriker in https://github.com/pyenv/pyenv/pull/2832 * Make adding $PYENV_ROOT/bin to PATH independent of other software by @native-api in https://github.com/pyenv/pyenv/pull/2837 From 2fb5b9e9a3c498dbc74c3452851ff90c95dcdc5a Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Mon, 27 Nov 2023 15:54:43 +0300 Subject: [PATCH 042/246] v2.3.33 --- libexec/pyenv---version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 86d9973e..f6b4c1ae 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.32" +version="2.3.33" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From ebff965cc6dc17d90d0ec82af5a4fb47fd4a5907 Mon Sep 17 00:00:00 2001 From: native-api Date: Wed, 29 Nov 2023 22:57:28 +0300 Subject: [PATCH 043/246] Fix graalpy-community to use a separate package name (#2855) Using the same name as graalpy causes a cache clash --- .../python-build/share/python-build/graalpy-community-23.1.0 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/share/python-build/graalpy-community-23.1.0 b/plugins/python-build/share/python-build/graalpy-community-23.1.0 index dcda3848..ff46e4d5 100644 --- a/plugins/python-build/share/python-build/graalpy-community-23.1.0 +++ b/plugins/python-build/share/python-build/graalpy-community-23.1.0 @@ -51,4 +51,4 @@ else url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" fi -install_package "graalpy-${VERSION}${BUILD}" "${url}" "copy" ensurepip +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip From 3e1b4e0be1b01737560d0ec8b741c7d8fd704c22 Mon Sep 17 00:00:00 2001 From: native-api Date: Wed, 29 Nov 2023 23:39:14 +0300 Subject: [PATCH 044/246] Move 3.11.5+ to OpenSSL 3 by default (#2858) As per https://docs.python.org/3.11/whatsnew/3.11.html#notable-changes-in-3-11-5, OpenSSL 3.0 support in CPython is finally official since 3.11.5. --- plugins/python-build/share/python-build/3.11.5 | 4 ++-- plugins/python-build/share/python-build/3.11.6 | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/python-build/share/python-build/3.11.5 b/plugins/python-build/share/python-build/3.11.5 index 39f21e4f..5e822dfe 100644 --- a/plugins/python-build/share/python-build/3.11.5 +++ b/plugins/python-build/share/python-build/3.11.5 @@ -1,7 +1,7 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 -install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.5" "https://www.python.org/ftp/python/3.11.5/Python-3.11.5.tar.xz#85cd12e9cf1d6d5a45f17f7afe1cebe7ee628d3282281c492e86adf636defa3f" standard verify_py311 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.11.6 b/plugins/python-build/share/python-build/3.11.6 index de1bdbd4..efcaeecd 100644 --- a/plugins/python-build/share/python-build/3.11.6 +++ b/plugins/python-build/share/python-build/3.11.6 @@ -1,7 +1,7 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 -install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.6" "https://www.python.org/ftp/python/3.11.6/Python-3.11.6.tar.xz#0fab78fa7f133f4f38210c6260d90d7c0d5c7198446419ce057ec7ac2e6f5f38" standard verify_py311 copy_python_gdb ensurepip From 1a9e9ee5da412abd47636085ec7b811c652d8135 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Mon, 4 Dec 2023 23:44:38 -0600 Subject: [PATCH 045/246] Add CPython 3.11.7 --- plugins/python-build/share/python-build/3.11.7 | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.11.7 diff --git a/plugins/python-build/share/python-build/3.11.7 b/plugins/python-build/share/python-build/3.11.7 new file mode 100644 index 00000000..2f19ba8e --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.7 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.0" "https://www.openssl.org/source/openssl-3.2.0.tar.gz#14c826f07c7e433706fb5c69fa9e25dab95684844b4c962a2cf1bf183eb4690e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.7" "https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tar.xz#18e1aa7e66ff3a58423d59ed22815a6954e53342122c45df20c96877c062b9b7" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.7" "https://www.python.org/ftp/python/3.11.7/Python-3.11.7.tgz#068c05f82262e57641bd93458dfa883128858f5f4997aad7a36fd25b13b29209" standard verify_py311 copy_python_gdb ensurepip +fi From 99d74e78f71bc6035514faa7a9341f52e9a352be Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Wed, 6 Dec 2023 06:56:03 +0300 Subject: [PATCH 046/246] v2.3.34 --- libexec/pyenv---version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/pyenv---version b/libexec/pyenv---version index f6b4c1ae..5adeafcf 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.33" +version="2.3.34" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From d3766f22a588519cb640771130fa8ed6985f0556 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Wed, 6 Dec 2023 06:56:43 +0300 Subject: [PATCH 047/246] v2.3.34 --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56d28d27..fae6a22f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Version History +## Release v2.3.34 +* Fix graalpy-community to use a separate package name by @native-api in https://github.com/pyenv/pyenv/pull/2855 +* Move 3.11.5+ to OpenSSL 3 by default by @native-api in https://github.com/pyenv/pyenv/pull/2858 +* Add CPython 3.11.7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2860 + ## Release v2.3.33 * Add miniforge3-23.3.1-1 by @goerz in https://github.com/pyenv/pyenv/pull/2839 * Add support for miniconda3-3.11-23.10.0-1 by @binbjz in https://github.com/pyenv/pyenv/pull/2843 From fce51d45a074d86455e49acb2809e5b99d6ce276 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Thu, 7 Dec 2023 18:52:56 -0600 Subject: [PATCH 048/246] Add CPython 3.12.1 --- plugins/python-build/share/python-build/3.12.1 | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.12.1 diff --git a/plugins/python-build/share/python-build/3.12.1 b/plugins/python-build/share/python-build/3.12.1 new file mode 100644 index 00000000..636724c9 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.1 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.1" "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tar.xz#8dfb8f426fcd226657f9e2bd5f1e96e53264965176fa17d32658e873591aeb21" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.1" "https://www.python.org/ftp/python/3.12.1/Python-3.12.1.tgz#d01ec6a33bc10009b09c17da95cc2759af5a580a7316b3a446eb4190e13f97b2" standard verify_py312 copy_python_gdb ensurepip +fi From dfde39650e13c4ae9f5f909d3f525275e683b905 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Fri, 8 Dec 2023 13:22:44 +0300 Subject: [PATCH 049/246] v2.3.35 --- libexec/pyenv---version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 5adeafcf..f157bf02 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.34" +version="2.3.35" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 74a2523c97d2e5c1dbdca7b58f3372324ccad4e6 Mon Sep 17 00:00:00 2001 From: Anton Petrov Date: Fri, 8 Dec 2023 13:23:20 +0300 Subject: [PATCH 050/246] v2.3.35 --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index fae6a22f..380cf08a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Version History +## Release v2.3.35 +* Add CPython 3.12.1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2861 + ## Release v2.3.34 * Fix graalpy-community to use a separate package name by @native-api in https://github.com/pyenv/pyenv/pull/2855 * Move 3.11.5+ to OpenSSL 3 by default by @native-api in https://github.com/pyenv/pyenv/pull/2858 From 3c92216ea229f24f9f59f638a82ca26f6c0f19bc Mon Sep 17 00:00:00 2001 From: Kurt McKee Date: Mon, 11 Dec 2023 22:29:06 -0600 Subject: [PATCH 051/246] Add a Dependabot config to auto-update GitHub action versions (#2863) --- .github/dependabot.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..2390d8c8 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: "github-actions" + directory: "/" + schedule: + interval: "monthly" + groups: + github-actions: + patterns: + - "*" From 96f93fd5531afa2fb5a826c92770293e500f9ab6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Dec 2023 08:04:41 +0300 Subject: [PATCH 052/246] Bump the github-actions group with 1 update (#2864) Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout). - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/v3...v4) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-major dependency-group: github-actions ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/macos_build.yml | 2 +- .github/workflows/modified_scripts_build.yml | 6 +++--- .github/workflows/pyenv_tests.yml | 2 +- .github/workflows/ubuntu_build.yml | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index f24b5f4d..3f299f80 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -17,7 +17,7 @@ jobs: - "3.12" runs-on: macos-11 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Normally, we would use the superbly maintained... # - uses: actions/setup-python@v2 # with: diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml index be106ee5..0beef58e 100644 --- a/.github/workflows/modified_scripts_build.yml +++ b/.github/workflows/modified_scripts_build.yml @@ -6,7 +6,7 @@ jobs: outputs: versions: ${{steps.modified-versions.outputs.versions}} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: git fetch origin "$GITHUB_BASE_REF" - shell: bash run: > @@ -33,7 +33,7 @@ jobs: os: ["macos-11", "macos-12"] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: | #envvars export PYENV_ROOT="$GITHUB_WORKSPACE" @@ -93,7 +93,7 @@ jobs: os: ["ubuntu-20.04", "ubuntu-22.04"] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - run: | #envvars export PYENV_ROOT="$GITHUB_WORKSPACE" diff --git a/.github/workflows/pyenv_tests.yml b/.github/workflows/pyenv_tests.yml index dc905d14..f05430cd 100644 --- a/.github/workflows/pyenv_tests.yml +++ b/.github/workflows/pyenv_tests.yml @@ -16,7 +16,7 @@ jobs: - macos-11 runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Normally, we would use the superbly maintained... # - uses: actions/setup-python@v2 # with: diff --git a/.github/workflows/ubuntu_build.yml b/.github/workflows/ubuntu_build.yml index e5ba9a4d..e3951d3c 100644 --- a/.github/workflows/ubuntu_build.yml +++ b/.github/workflows/ubuntu_build.yml @@ -17,7 +17,7 @@ jobs: - "3.12" runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 # Normally, we would use the superbly maintained... # - uses: actions/setup-python@v2 # with: From 2c69732fec100d953b44d3c31b97b8a5f61e50c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20H=C3=A4user?= <8659494+mhaeuser@users.noreply.github.com> Date: Tue, 26 Dec 2023 01:43:53 +0100 Subject: [PATCH 053/246] Add installation prefix to `python-config --ldflags` output (#2865) Needed to link against libpython of the Pyenv-controlled installation --- plugins/python-build/bin/python-build | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 0ddebaac..a93baa11 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -1383,6 +1383,19 @@ configured_with_package_dir() { return 1 } +# `python-config` ignores LDFLAGS envvar. Adding to LIBS is the only way to add extra stuff +# to `python-config --ldflags` output +append_ldflags_libs() { + local args="$1" + export LDFLAGS="${LDFLAGS:+$LDFLAGS }$args" + export LIBS="${LIBS:+${LIBS% } }$args" +} +prepend_ldflags_libs() { + local args="$1" + export LDFLAGS="$args${LDFLAGS:+ $LDFLAGS}" + export LIBS="$args${LIBS:+ $LIBS}" +} + use_homebrew() { can_use_homebrew || return 1 # unless Homebrew is at the default /usr/local, need to add its paths to @@ -1392,10 +1405,7 @@ use_homebrew() { # /usr/local/lib:/usr/lib is the default library search path if [[ -n $brew_prefix && $brew_prefix != "/usr" && $brew_prefix != "/usr/local" ]]; then export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }-I${brew_prefix}/include" - export LDFLAGS="${LDFLAGS:+$LDFLAGS }-L${brew_prefix}/lib -Wl,-rpath,${brew_prefix}/lib" - # `python-config` ignores LDFLAGS envvar. Adding to LIBS is the only way to add extra stuff - # to `python-config --ldflags` output - export LIBS="${LIBS:+${LIBS% } }-L${brew_prefix}/lib -Wl,-rpath,${brew_prefix}/lib" + append_ldflags_libs "-L${brew_prefix}/lib -Wl,-rpath,${brew_prefix}/lib" fi fi } @@ -2258,13 +2268,13 @@ package_option python configure --libdir="${PREFIX_PATH}/lib" if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS ${PYTHON_CONFIGURE_OPTS_ARRAY[@]}" == *"--enable-shared"* ]]; then # The ld on Darwin embeds the full paths to each dylib by default if [[ "$LDFLAGS" != *"-rpath="* ]] ; then - export LDFLAGS="-Wl,-rpath,${PREFIX_PATH}/lib${LDFLAGS:+ $LDFLAGS}" + prepend_ldflags_libs "-Wl,-rpath,${PREFIX_PATH}/lib" fi fi # python-build: Set `RPATH` if --shared` was given for PyPy (#244) if [[ "$PYPY_OPTS" == *"--shared"* ]]; then - export LDFLAGS="-Wl,-rpath=${PREFIX_PATH}/lib${LDFLAGS:+ $LDFLAGS}" + prepend_ldflags_libs "-Wl,-rpath=${PREFIX_PATH}/lib" fi # Add support for framework installation (`--enable-framework`) of CPython (#55, #99) @@ -2446,7 +2456,7 @@ if [ -n "$VERBOSE" ]; then trap "kill $TAIL_PID" SIGINT SIGTERM EXIT fi -export LDFLAGS="-L${PREFIX_PATH}/lib${LDFLAGS:+ $LDFLAGS}" +prepend_ldflags_libs "-L${PREFIX_PATH}/lib" export CPPFLAGS="-I${PREFIX_PATH}/include${CPPFLAGS:+ $CPPFLAGS}" unset PYTHONHOME From 2798a6694deca46201095ace7e4b75494a60925f Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Tue, 26 Dec 2023 08:51:40 +0800 Subject: [PATCH 054/246] Add support for miniconda3 23.11.0-1, 23.11.0-2 with py3.11, py3.10, py3.9, py3.8 (#2870) Co-authored-by: binbjz --- .../python-build/miniconda3-3.10-23.11.0-1 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.10-23.11.0-2 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-23.11.0-1 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-23.11.0-2 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.8-23.11.0-1 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.8-23.11.0-2 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-23.11.0-1 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-23.11.0-2 | 25 +++++++++++++++++++ 8 files changed, 200 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-2 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-1 b/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-1 new file mode 100644 index 00000000..1be16cea --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-Linux-aarch64.sh#30b3f26fee441c5d70bd50ec06ea1acaa0e373ad30771165eada3f6bdf27766a" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-Linux-s390x.sh#54bfe6a47e24ddaa74b02c88d64596c1234fdf6c3789740471dea2bf3c685392" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-Linux-x86_64.sh#6581658486be8e700d77e24eccafba586a0fbafafadcf73d35ab13eaee4b80b1" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-MacOSX-arm64.sh#570f66f7264d8ba3195fc0755baed35320842b36fb34ef16bdc142f1dc616cae" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-1-MacOSX-x86_64.sh#6517332e5af2088a0413dd9f536f258814efb6d5b9f78011a6f2ea53e2874484" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-2 b/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-2 new file mode 100644 index 00000000..bf84089b --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-23.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-aarch64.sh#85bb96bca04b75f2081b4c0f7f10476fd67fba1637c18b07272aa3a518df5596" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-s390x.sh#fd506291eb51641e8cd3164c09fec31826f26dc446c3da9bb4c88fe35c95dfe7" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-Linux-x86_64.sh#35a58b8961e1187e7311b979968662c6223e86e1451191bed2e67a72b6bd0658" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-MacOSX-arm64.sh#958a8d6e14d9eb843b24ba4019a1b62e0dedd819d844247485fd0c0ea4acbc61" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_23.11.0-2-MacOSX-x86_64.sh#07a6f46146993510d5d839ee014fc2229f7870d92aa73a52f11dd240833f08fb" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-1 b/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-1 new file mode 100644 index 00000000..f395b7fb --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-Linux-aarch64.sh#63c06a1974695e50bbe767a030903d169e637e42d5b7b6d30876b19a01fbbad8" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-Linux-s390x.sh#04586c734987a39114b81384014c2cfa89360c518371b6fa249d3062efca27fe" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-Linux-x86_64.sh#5b3cefe534e23541f5f703f40d4818e361c3615dbf14651a0f29554c3fc3d0fd" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-MacOSX-arm64.sh#7901f8f272478657bd023cfd6d832b53213053897efd23c1061bcc35c68c0637" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-1-MacOSX-x86_64.sh#7ee24fb01fbe1081d6dd600805f5f9c6a3a12714670ecad65a6dfcf870c8a74d" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-2 b/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-2 new file mode 100644 index 00000000..493e0922 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-23.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-Linux-aarch64.sh#decd447fb99dbd0fc5004481ec9bf8c04f9ba28b35a9292afe49ecefe400237f" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-Linux-s390x.sh#53a9e9eb97cd6e318f4f184add069436e1a46124cf864bf2d7bd67043e50e471" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-Linux-x86_64.sh#c9ae82568e9665b1105117b4b1e499607d2a920f0aea6f94410e417a0eff1b9c" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-MacOSX-arm64.sh#5694c382e6056d62ed874f22692224c4f53bca22e8135b6f069111e081be07aa" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_23.11.0-2-MacOSX-x86_64.sh#2b7f9e46308c28c26dd83abad3e72121ef63916eaf17b63723b5a1f728dc3032" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-1 b/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-1 new file mode 100644 index 00000000..c0653ac0 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-Linux-aarch64.sh#3b28bce7689d42c85190e86738f152efc88a7d17cbcd90b4eb8cb92be42e3bff" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-Linux-s390x.sh#38e4050d6b73814071c065d36c41c6fea553fbf973e72e6375b958fcff747b69" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-Linux-x86_64.sh#ad3cb53ddfbadd190172b864337572206733ae75515fcfb17157cc8f2cb907a5" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-MacOSX-arm64.sh#89b1b0428e68fea63af15193237f2efed9a3c80cffa2fc221cca0af2465d3fd2" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-1-MacOSX-x86_64.sh#5056bea02062a198991a09c8c9c02c39735ad2d26cdbf21863eaa799bcacd8ab" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-2 b/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-2 new file mode 100644 index 00000000..24ff73eb --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.8-23.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py38_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-aarch64.sh#6e439ae5373d35b78a3f45775fa69f0afddd0c0a9e5e545cd2f75f913a6d143b" "miniconda" verify_py38 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py38_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-s390x.sh#4d53356e80b3be7e90dbcf021d40cd3d7f889cf4d19574c9957ba22f5a9d98f2" "miniconda" verify_py38 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py38_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-Linux-x86_64.sh#cb908ddbd603d789d94076ea4dd3f8517b15866719e007725dca778a8dfab823" "miniconda" verify_py38 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py38_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-MacOSX-arm64.sh#5b0258717b9c53c90fc9255ef739d766325fc284761b637837e3d378bb12d3e3" "miniconda" verify_py38 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py38_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py38_23.11.0-2-MacOSX-x86_64.sh#143d79c7018c66ef452a27711090367dc36e0046ae765f514bc2b1c2b4f76746" "miniconda" verify_py38 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-1 b/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-1 new file mode 100644 index 00000000..1f2aa85b --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.11.0-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-Linux-aarch64.sh#a8a9c37882209680d9258e57ce5d5ca0e186f0159e703736b9f5122e94864083" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.11.0-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-Linux-s390x.sh#719c653d7e4b724566c2a9fa365f7b6dbb830d279513ae62e02e11144722c1c9" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.11.0-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-Linux-x86_64.sh#d36c0f778b6b164223a174acafbe8556b841b67e53cb84b3eb24f1956b62121a" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.11.0-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-MacOSX-arm64.sh#1f345d26837e505713aa7b9332cc740c7f2319c7208dc6bd7b95b6a251a9b665" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.11.0-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-1-MacOSX-x86_64.sh#7b05aff168e441ec500e038bb3e252e5b01f3059a74f92fb7f3a7630eb6a6b13" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-2 b/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-2 new file mode 100644 index 00000000..f99536de --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-23.11.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_23.11.0-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-aarch64.sh#465f30688bae46f73b8497bb601face6b652092ace0e515c898e2a64f8c0f15f" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_23.11.0-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-s390x.sh#ff1de437a3f9110d8d7665c1f6d178bb797150689264bec5d0d8b36604e3823a" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_23.11.0-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-Linux-x86_64.sh#b911ff745c55db982078ac51ed4d848da0170f16ba642822a3bc7dd3fc8c61ba" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_23.11.0-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-MacOSX-arm64.sh#0234becafc167a475fbbcd9a59dda0eec288343695ff6b9645b34fcb9f124bb5" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_23.11.0-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_23.11.0-2-MacOSX-x86_64.sh#cc22270c81080d50e518f74d36a151fd3727e2cd6fccc4b1fd345f9a852d5762" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 2d85075123fd52c2932564c1580fc26c4a8b4c3e Mon Sep 17 00:00:00 2001 From: cpzt Date: Wed, 27 Dec 2023 03:45:07 +0800 Subject: [PATCH 055/246] Add micropython 1.20.0 and 1.21.0 (#2869) --- plugins/python-build/bin/python-build | 8 +++++++- .../python-build/share/python-build/micropython-1.20.0 | 4 ++++ .../python-build/share/python-build/micropython-1.21.0 | 4 ++++ plugins/python-build/share/python-build/micropython-1.9.3 | 2 +- plugins/python-build/share/python-build/micropython-1.9.4 | 2 +- plugins/python-build/test/compiler.bats | 2 +- 6 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 plugins/python-build/share/python-build/micropython-1.20.0 create mode 100644 plugins/python-build/share/python-build/micropython-1.21.0 diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index a93baa11..ae4246f8 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -925,7 +925,13 @@ build_package_ironpython_builder() { ( cd "Stage/Release/IronPython-"* && build_package_ironpython ) } +build_package_micropython_1_9() { + # supported version 1.9.3 and 1.9.4 + build_package_micropython "with_axtls" +} + build_package_micropython() { + # supported version 1.10 and higher if [ "${MAKEOPTS+defined}" ]; then MAKE_OPTS="$MAKEOPTS" elif [ -z "${MAKE_OPTS+defined}" ]; then @@ -934,7 +940,7 @@ build_package_micropython() { { cd mpy-cross "$MAKE" $MAKE_OPTS cd ../ports/unix - "$MAKE" $MAKE_OPTS axtls + [ "$1" = "with_axtls" ] && "$MAKE" $MAKE_OPTS axtls "$MAKE" $MAKE_OPTS CFLAGS_EXTRA="-DMICROPY_PY_SYS_PATH_DEFAULT='\".frozen:${PREFIX_PATH}/lib/micropython\"' $CFLAGS_EXTRA" "$MAKE" install $MAKE_INSTALL_OPTS PREFIX="${PREFIX_PATH}" ln -fs micropython "${PREFIX_PATH}/bin/python" diff --git a/plugins/python-build/share/python-build/micropython-1.20.0 b/plugins/python-build/share/python-build/micropython-1.20.0 new file mode 100644 index 00000000..64705710 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.20.0 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.20.0.tar.xz#098ef8e40abdc62551b5460d0ffe9489074240c0cb5589ca3c3a425551beb9bf"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.20.0.zip#6a2ce86e372ee8c5b9310778fff7fca1daa580afa28ea755f1a303675a8612b7"; } +$install micropython-1.20.0 "$src" micropython diff --git a/plugins/python-build/share/python-build/micropython-1.21.0 b/plugins/python-build/share/python-build/micropython-1.21.0 new file mode 100644 index 00000000..ccd8b7d3 --- /dev/null +++ b/plugins/python-build/share/python-build/micropython-1.21.0 @@ -0,0 +1,4 @@ +has_tar_xz_support \ + && { install=install_package; src="https://micropython.org/resources/source/micropython-1.21.0.tar.xz#abd2152613559d3f44728668346e78be9d93458133a03b700baf222c322fd4d5"; } \ + || { install=install_zip; src="https://micropython.org/resources/source/micropython-1.21.0.zip#12521faacc7191353f2739267bd9fd2a5e60ea04fb47df74f8e22b6bf59ba967"; } +$install micropython-1.21.0 "$src" micropython \ No newline at end of file diff --git a/plugins/python-build/share/python-build/micropython-1.9.3 b/plugins/python-build/share/python-build/micropython-1.9.3 index bed5167a..be770437 100644 --- a/plugins/python-build/share/python-build/micropython-1.9.3 +++ b/plugins/python-build/share/python-build/micropython-1.9.3 @@ -1,4 +1,4 @@ has_tar_xz_support \ && src="https://micropython.org/resources/source/micropython-1.9.3.tar.xz#3aa37065f5ea8df372d36253d0ae6333c68572e577df8558d4b7b93e070c624d" \ || src="https://github.com/micropython/micropython/releases/download/v1.9.3/micropython-1.9.3.tar.gz#f94c0b4834edca625b86c0846c89e609ee8fbdbe98e7f719d5108d74b6b4945e" -install_package micropython-1.9.3 "$src" micropython +install_package micropython-1.9.3 "$src" micropython_1_9 diff --git a/plugins/python-build/share/python-build/micropython-1.9.4 b/plugins/python-build/share/python-build/micropython-1.9.4 index d0338c45..8d5dd562 100644 --- a/plugins/python-build/share/python-build/micropython-1.9.4 +++ b/plugins/python-build/share/python-build/micropython-1.9.4 @@ -1,4 +1,4 @@ has_tar_xz_support \ && src="https://micropython.org/resources/source/micropython-1.9.4.tar.xz#1d358d99e908a94fd6dd0d6b448ee56c5830b609cf27a42e0db3bee40cc52a9e" \ || src="https://github.com/micropython/micropython/releases/download/v1.9.4/micropython-1.9.4.tar.gz#0db042011bffcbd65362b67eb3cca87eaefa9f2a55b747fa75e922c706b8ce1a" -install_package micropython-1.9.4 "$src" micropython +install_package micropython-1.9.4 "$src" micropython_1_9 diff --git a/plugins/python-build/test/compiler.bats b/plugins/python-build/test/compiler.bats index 63da5800..61ff22be 100644 --- a/plugins/python-build/test/compiler.bats +++ b/plugins/python-build/test/compiler.bats @@ -110,7 +110,7 @@ OUT mkdir -p "$INSTALL_ROOT/bin" cd "$INSTALL_ROOT" - stub make true true '(for a in "$@"; do echo $a; done)|grep -E "^CFLAGS_EXTRA="' true + stub make true '(for a in "$@"; do echo $a; done)|grep -E "^CFLAGS_EXTRA="' true stub ln true stub mkdir true run_inline_definition < Date: Sat, 30 Dec 2023 10:11:56 -0500 Subject: [PATCH 056/246] Make "Automatic installer" command a copy-able code block (#2874) --- README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index ab5ded5f..1513c83f 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,9 @@ As far as Pyenv is concerned, version names are simply directories under ##### Automatic installer -`curl https://pyenv.run | bash` +```bash +curl https://pyenv.run | bash +``` For more details visit our other project: https://github.com/pyenv/pyenv-installer From 6e3b91a816e5551d646211b71749addffefb0c15 Mon Sep 17 00:00:00 2001 From: dand-oss Date: Mon, 1 Jan 2024 02:32:19 +0700 Subject: [PATCH 057/246] Added PyPy 7.3.14 (#2876) Co-authored-by: Dan Dees --- .../share/python-build/pypy2.7-7.3.14 | 81 +++++++++++++++++++ .../share/python-build/pypy2.7-7.3.14-src | 14 ++++ .../share/python-build/pypy3.10-7.3.14 | 81 +++++++++++++++++++ .../share/python-build/pypy3.10-7.3.14-src | 14 ++++ .../share/python-build/pypy3.9-7.3.14 | 81 +++++++++++++++++++ .../share/python-build/pypy3.9-7.3.14-src | 14 ++++ 6 files changed, 285 insertions(+) create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.14 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.14-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.14 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.14-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.14 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.14-src diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.14 b/plugins/python-build/share/python-build/pypy2.7-7.3.14 new file mode 100644 index 00000000..e7af9283 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.14 @@ -0,0 +1,81 @@ +VERSION='7.3.14' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=98468f4cc704a2821401afdd001ebddd367e594e05a70c7767fb86f1364fb21a +linux32_hash=b12b4b587da55c8f212ae854e31d29258451e069c65aca596e577644e520bc8b +linux64_hash=5938c3c6cddb2e8eb5e435cd3bf61d15134b94a9ac026e26a533bdda6c28a4a0 +osarm64_hash=a428e18fcf1470b032fb1f4d75795aeed9216b4314a4c8a3e4d7e13f10f8607e +osx64_hash=8af24683621937e65c518fbca1eb34e17ffc741c2ac917e4ca20694348157d78 +s390x_hash=5abc6a0f55a89c08def13b5f410b8e7bd706fe1b472f31db01ecbc4d0a49e8dc + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.14-src b/plugins/python-build/share/python-build/pypy2.7-7.3.14-src new file mode 100644 index 00000000..1cc47f06 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.14-src @@ -0,0 +1,14 @@ +VERSION='7.3.14' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=e096fe67ce2d8d4d5e7dceb84fe1ca854498f00766d31b27d32c8d8833131373 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.14 b/plugins/python-build/share/python-build/pypy3.10-7.3.14 new file mode 100644 index 00000000..14466576 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.14 @@ -0,0 +1,81 @@ +VERSION='7.3.14' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=fbef65dfc69dcd6006d843553d268b331f1b13dfc3938492bd35f0f477b5bcf4 +linux32_hash=d37e7c7a03bed5dceca2ab7f821ad7655808cccf6908155f78f0effd811b7f4f +linux64_hash=a83879891dc0a6c1504da0954fba1125b21a2591782897231a8168100ea72b94 +osarm64_hash=0f09584e21ed8f45e8ff1e3dd1582f077ebdd23a1068298f45006f67bc692632 +osx64_hash=31ce62b7ea3b5b5bde68241ae9404f0a68f5a7d0094ef651062b7a64caecfd4e +s390x_hash=363e87ad3b6547cc68981c665cf049449bed44cf9e49cabbbcc61df73ea2d40b + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.14-src b/plugins/python-build/share/python-build/pypy3.10-7.3.14-src new file mode 100644 index 00000000..7f469f95 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.14-src @@ -0,0 +1,14 @@ +VERSION='7.3.14' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=a3481af466103fa13740db4e27780e0423dcf8626b3340f60d3d3c28fbc11ae0 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.14 b/plugins/python-build/share/python-build/pypy3.9-7.3.14 new file mode 100644 index 00000000..340bcf5d --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.14 @@ -0,0 +1,81 @@ +VERSION='7.3.14' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=14b842f32f60ce2d9d130971f9bcbdb6875824a0e78fac36806d267e0982179c +linux32_hash=4ad89a22369a6f2f83a7d8d047e0fc4cf5597f0921fa7afa23499ed05f663503 +linux64_hash=febd770a616641ca8419c381c7fb224e515b892551d0db49a1231397ed38859d +osarm64_hash=4f8f2464a743f855b8fc8bda7ce7994a674616db3b5c2c1955cd08502fa782ca +osx64_hash=0e2fea9b2dadb82b7acf05f21c0144f7bb1cfaaa39c693ab1eba4aef5ed52680 +s390x_hash=ba2451e9081db5bc724a05530a7f98817231de83ff6fdf15bad21a4e9b6dfeae + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.14-src b/plugins/python-build/share/python-build/pypy3.9-7.3.14-src new file mode 100644 index 00000000..e572a8f8 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.14-src @@ -0,0 +1,14 @@ +VERSION='7.3.14' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=560fe6161e159557e1fe612aaadf9b293eefded1da372e70b8e3b23bba598366 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' From 46d3954bffb70a78adaba2c4d4a2601313483878 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20=C5=A0im=C3=A1=C4=8Dek?= Date: Tue, 16 Jan 2024 19:43:29 +0100 Subject: [PATCH 058/246] Add graalpy-23.1.2 (#2884) --- .../share/python-build/graalpy-23.1.2 | 64 +++++++++++++++++++ .../python-build/graalpy-community-23.1.2 | 54 ++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-23.1.2 create mode 100644 plugins/python-build/share/python-build/graalpy-community-23.1.2 diff --git a/plugins/python-build/share/python-build/graalpy-23.1.2 b/plugins/python-build/share/python-build/graalpy-23.1.2 new file mode 100644 index 00000000..50d39a63 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-23.1.2 @@ -0,0 +1,64 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='23.1.2' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-23.1.2" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="ea9c61845968dd396f57bbb6bb6ccf1608b198dffd99c6fe2e5c03d836e40a74" + ;; +"linux-aarch64" ) + checksum="715cc67f551a009a04814e7201bc33e629ba6c329e7d32c265a3ebf8619f4a66" + ;; +"macos-amd64" ) + checksum="e9e5977077ef4986fce0f8416b81c1c468add9f3f123edfb223b54a5d34a95c6" + ;; +"macos-aarch64" ) + checksum="46c859233c7c5ce44fc44e97f17a1685dc3f8516785c2e419f8661ed7b5185b1" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-23.1.2 b/plugins/python-build/share/python-build/graalpy-community-23.1.2 new file mode 100644 index 00000000..6b28b4bf --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-23.1.2 @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='23.1.2' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="27577bded9dd742c7b9b8e5315cec286657edb5842968cc966aa451ddc8729d9" + ;; +"linux-aarch64" ) + checksum="c993484132b9e196d351570ba6a74632eb8695767e383ca86ba1092c4484ff7a" + ;; +"macos-amd64" ) + checksum="e74d586f114b33e55e1a6849672e1a0ea5bd372d8f4a501b532d221c61915d3c" + ;; +"macos-aarch64" ) + checksum="d269f5fdb3e8ae323554de2876ef25d43aaa86867edc41f2b76ea53a27ee3662" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip From f82acf8d44186651455b082351dff5ff1cea46ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Wed, 17 Jan 2024 12:45:12 -0600 Subject: [PATCH 059/246] Add CPython 3.13.0a3 (#2885) --- .../python-build/share/python-build/{3.13.0a2 => 3.13.0a3} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename plugins/python-build/share/python-build/{3.13.0a2 => 3.13.0a3} (57%) diff --git a/plugins/python-build/share/python-build/3.13.0a2 b/plugins/python-build/share/python-build/3.13.0a3 similarity index 57% rename from plugins/python-build/share/python-build/3.13.0a2 rename to plugins/python-build/share/python-build/3.13.0a3 index 896e5edf..4ca10241 100644 --- a/plugins/python-build/share/python-build/3.13.0a2 +++ b/plugins/python-build/share/python-build/3.13.0a3 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.13.0a2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a2.tar.xz#b6d46b44190c4c02421eb69a042d16b0c55481bdda818c6c416dc244113a9c2d" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0a3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a3.tar.xz#20784c8304eb1c69c80f966ebdf0775be2e37e23df3b62461eec12a85dcf7ead" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.13.0a2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a2.tgz#9a3c363589ec882f2d1ff008f29f66231ccb552366dd9d8041a65c7e799cbafd" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0a3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a3.tgz#9c7c2b42a20127816f9403723bfc88d1566f47dac0c46f50492f7ff8db646d8f" standard verify_py313 copy_python_gdb ensurepip fi From 2374260efa9af987f2c046475dcd22804a81fb6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Thu, 18 Jan 2024 01:00:11 -0600 Subject: [PATCH 060/246] Add PyPy v7.3.15 (#2886) --- .../share/python-build/pypy2.7-7.3.15 | 81 +++++++++++++++++++ .../share/python-build/pypy2.7-7.3.15-src | 14 ++++ .../share/python-build/pypy3.10-7.3.15 | 81 +++++++++++++++++++ .../share/python-build/pypy3.10-7.3.15-src | 14 ++++ .../share/python-build/pypy3.9-7.3.15 | 81 +++++++++++++++++++ .../share/python-build/pypy3.9-7.3.15-src | 14 ++++ 6 files changed, 285 insertions(+) create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.15 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.15-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.15 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.15-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.15 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.15-src diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.15 b/plugins/python-build/share/python-build/pypy2.7-7.3.15 new file mode 100644 index 00000000..6e146671 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.15 @@ -0,0 +1,81 @@ +VERSION='7.3.15' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=31b41fca7280636d7818713b7a0fab8f34ece9c82cc88e51d305d43b3e6306d6 +linux32_hash=cb5c1da62a8ca31050173c4f6f537bc3ff316026895e5f1897b9bb526babae79 +linux64_hash=e857553bdc4f25ba9670a5c173a057a9ff71262d5c5da73a6ddef9d7dc5d4f5e +osarm64_hash=618d33df7ac6570d88a58183e3e15c56f63f862968cecbd2ee896eac6255cea6 +osx64_hash=72dac262fc63115b6ccd2c3c15e7afd1b2e7a65d7e97265c116246d1cf2cdffd +s390x_hash=eb442279ec3f1eb17da296e38b531d3ca50c6418eab208a020bca4646a1dea46 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.15-src b/plugins/python-build/share/python-build/pypy2.7-7.3.15-src new file mode 100644 index 00000000..65082f71 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.15-src @@ -0,0 +1,14 @@ +VERSION='7.3.15' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=a66ddaed39544a35bb7ab7a17dbf673a020c7cb3a614bd2b61a54776888daf2c + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.15 b/plugins/python-build/share/python-build/pypy3.10-7.3.15 new file mode 100644 index 00000000..e7e49cf9 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.15 @@ -0,0 +1,81 @@ +VERSION='7.3.15' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=52146fccaf64e87e71d178dda8de63c01577ec3923073dc69e1519622bcacb74 +linux32_hash=75dd58c9abd8b9d78220373148355bc3119febcf27a2c781d64ad85e7232c4aa +linux64_hash=33c584e9a70a71afd0cb7dd8ba9996720b911b3b8ed0156aea298d4487ad22c3 +osarm64_hash=d927c5105ea7880f7596fe459183e35cc17c853ef5105678b2ad62a8d000a548 +osx64_hash=559b61ba7e7c5a5c23cef5370f1fab47ccdb939ac5d2b42b4bef091abe3f6964 +s390x_hash=209e57596381e13c9914d1332f359dc4b78de06576739747eb797bdbf85062b8 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.15-src b/plugins/python-build/share/python-build/pypy3.10-7.3.15-src new file mode 100644 index 00000000..1cf78ac5 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.15-src @@ -0,0 +1,14 @@ +VERSION='7.3.15' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=837622130b36603a1893899bd9f529961a8e4a56c9eb67268d72ddf8920c9579 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.15 b/plugins/python-build/share/python-build/pypy3.9-7.3.15 new file mode 100644 index 00000000..2fbadb35 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.15 @@ -0,0 +1,81 @@ +VERSION='7.3.15' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=03e35fcba290454bb0ccf7ee57fb42d1e63108d10d593776a382c0a2fe355de0 +linux32_hash=c6209380977066c9e8b96e8258821c70f996004ce1bc8659ae83d4fd5a89ff5c +linux64_hash=f062be307200bde434817e1620cebc13f563d6ab25309442c5f4d0f0d68f0912 +osarm64_hash=300541c32125767a91b182b03d9cc4257f04971af32d747ecd4d62549d72acfd +osx64_hash=18ad7c9cb91c5e8ef9d40442b2fd1f6392ae113794c5b6b7d3a45e04f19edec6 +s390x_hash=deeb5e54c36a0fd9cfefd16e63a0d5bed4f4a43e6bbc01c23f0ed8f7f1c0aaf3 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.15-src b/plugins/python-build/share/python-build/pypy3.9-7.3.15-src new file mode 100644 index 00000000..510cc523 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.15-src @@ -0,0 +1,14 @@ +VERSION='7.3.15' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=6bb9537d85aa7ad13c0aad2e41ff7fd55080bc9b4d1361b8f502df51db816e18 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' From 9908daf81dd29bfd14deb2757e02083826f3e0f0 Mon Sep 17 00:00:00 2001 From: Ruben Laguna Date: Wed, 24 Jan 2024 22:22:54 +0100 Subject: [PATCH 061/246] Update pypy3.9-7.3.13 checksums Releases have been reuploaded upstream --- plugins/python-build/share/python-build/pypy3.9-7.3.13 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.13 b/plugins/python-build/share/python-build/pypy3.9-7.3.13 index 2161b5ce..5614ebc1 100644 --- a/plugins/python-build/share/python-build/pypy3.9-7.3.13 +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.13 @@ -5,8 +5,8 @@ PYVER='3.9' aarch64_hash=317d7876c5825a086f854253648b967a432b993ce87695d2895d3ad6ed0d2716 linux32_hash=ac695238b4a3635ac6b482e74e04e2ea78b31acca0decd5de601dfd2f4ebf35a linux64_hash=323b05a9f607e932cda1995cbe77a96e4ea35994631aa6d734c8035e8479b74e -osarm64_hash=333131d62c502aa5d5fb58a58cdf01de4bfb2c1db5a9bb4c04515258abe6bced -osx64_hash=fb1ff67340353e837498102fec2b0b45744bb189dced57ee2e00045785e69662 +osarm64_hash=a07b17a790a1952b551e69d47d77a5546ad5e666ed1bd90b9ad60baaca6aa51e +osx64_hash=180802aa0122d4a05ec480bf3130c78591ba88fdde25d8e65a92d4a798b318a3 s390x_hash=213c88f652a99c4dc4e8e00b4b5b58f381c7f7e9ea1a9b65801fc0eb1e50df0a ### end of manual settings - following lines same for every download From 443de6614bd12088e920b893064bd6802678fb3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Sat, 10 Feb 2024 04:25:30 -0600 Subject: [PATCH 062/246] Add CPython 3.12.2 (#2899) --- plugins/python-build/share/python-build/3.12.2 | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.12.2 diff --git a/plugins/python-build/share/python-build/3.12.2 b/plugins/python-build/share/python-build/3.12.2 new file mode 100644 index 00000000..cee4c606 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.2 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.2" "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tar.xz#be28112dac813d2053545c14bf13a16401a21877f1a69eb6ea5d84c4a0f3d870" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.2" "https://www.python.org/ftp/python/3.12.2/Python-3.12.2.tgz#a7c4f6a9dc423d8c328003254ab0c9338b83037bd787d680826a5bf84308116e" standard verify_py312 copy_python_gdb ensurepip +fi From aca9af761e11b2db892acf09c57103cbd88ae9d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Sat, 10 Feb 2024 04:28:24 -0600 Subject: [PATCH 063/246] Add CPython 3.11.8 (#2898) --- plugins/python-build/share/python-build/3.11.8 | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.11.8 diff --git a/plugins/python-build/share/python-build/3.11.8 b/plugins/python-build/share/python-build/3.11.8 new file mode 100644 index 00000000..b8ce8de7 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.8 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.8" "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tar.xz#9e06008c8901924395bc1da303eac567a729ae012baa182ab39269f650383bb3" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.8" "https://www.python.org/ftp/python/3.11.8/Python-3.11.8.tgz#d3019a613b9e8761d260d9ebe3bd4df63976de30464e5c0189566e1ae3f61889" standard verify_py311 copy_python_gdb ensurepip +fi From 5e4879a2bcb56b6a6842ca5a64656050af578ad0 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 14 Feb 2024 00:58:44 +0300 Subject: [PATCH 064/246] v2.3.36 --- CHANGELOG.md | 15 +++++++++++++++ libexec/pyenv---version | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 380cf08a..a1ca960f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Version History +## Release v2.3.36 +* Add a Dependabot config to auto-update GitHub action versions by @kurtmckee in https://github.com/pyenv/pyenv/pull/2863 +* Bump the github-actions group with 1 update by @dependabot in https://github.com/pyenv/pyenv/pull/2864 +* Add installation prefix to `python-config --ldflags` output by @mhaeuser in https://github.com/pyenv/pyenv/pull/2865 +* Add support for miniconda3 23.11.0-1, 23.11.0-2 with py3.11, py3.10, py3.9, py3.8 by @binbjz in https://github.com/pyenv/pyenv/pull/2870 +* Add micropython 1.20.0 and 1.21.0 by @cpzt in https://github.com/pyenv/pyenv/pull/2869 +* Make "Automatic installer" command in the README a copy-able code block by @ryan-williams in https://github.com/pyenv/pyenv/pull/2874 +* Add PyPy 7.3.14 by @dand-oss in https://github.com/pyenv/pyenv/pull/2876 +* Add graalpy-23.1.2 by @msimacek in https://github.com/pyenv/pyenv/pull/2884 +* Add CPython 3.13.0a3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2885 +* Add PyPy v7.3.15 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2886 +* Update pypy3.9-7.3.13 checksums by @ecerulm in https://github.com/pyenv/pyenv/pull/2887 +* Add CPython 3.12.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2899 +* Add CPython 3.11.8 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2898 + ## Release v2.3.35 * Add CPython 3.12.1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2861 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index f157bf02..39691f94 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.35" +version="2.3.36" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 8f8a5e03b457830c70493fa84822272b381e6d35 Mon Sep 17 00:00:00 2001 From: native-api Date: Thu, 15 Feb 2024 22:40:53 +0300 Subject: [PATCH 065/246] Better document installing the HEAD version with Homebrew --- README.md | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 1513c83f..89adb548 100644 --- a/README.md +++ b/README.md @@ -209,10 +209,15 @@ As far as Pyenv is concerned, version names are simply directories under brew update brew install pyenv ``` - 2. Then follow the rest of the post-installation steps, starting with + If you want to install (and update to) the latest development head of Pyenv + rather than the latest release, instead run: + ```sh + brew install pyenv --head + ``` + 3. Then follow the rest of the post-installation steps, starting with [Set up your shell environment for Pyenv](#set-up-your-shell-environment-for-pyenv). - 3. OPTIONAL. To fix `brew doctor`'s warning _""config" scripts exist outside your system or Homebrew directories"_ + 4. OPTIONAL. To fix `brew doctor`'s warning _""config" scripts exist outside your system or Homebrew directories"_ If you're going to build Homebrew formulae from source that link against Python like Tkinter or NumPy @@ -504,7 +509,7 @@ If you've installed Pyenv using Homebrew, upgrade using: brew upgrade pyenv ``` -To switch from a release to the latest development version of Pyenv, use: +To switch from a release to the latest development head of Pyenv, use: ```sh brew uninstall pyenv From 932dc464f5550e3c6af7f705891c1797c4ab004d Mon Sep 17 00:00:00 2001 From: Saaket Prakash Date: Tue, 20 Feb 2024 22:47:32 +0530 Subject: [PATCH 066/246] Add CPython 3.13.0a4 (#2903) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Edgar Ramírez Mondragón <16805946+edgarrmondragon@users.noreply.github.com> --- plugins/python-build/share/python-build/3.13.0a3 | 9 --------- plugins/python-build/share/python-build/3.13.0a4 | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.13.0a3 create mode 100644 plugins/python-build/share/python-build/3.13.0a4 diff --git a/plugins/python-build/share/python-build/3.13.0a3 b/plugins/python-build/share/python-build/3.13.0a3 deleted file mode 100644 index 4ca10241..00000000 --- a/plugins/python-build/share/python-build/3.13.0a3 +++ /dev/null @@ -1,9 +0,0 @@ -prefer_openssl3 -export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl -install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline -if has_tar_xz_support; then - install_package "Python-3.13.0a3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a3.tar.xz#20784c8304eb1c69c80f966ebdf0775be2e37e23df3b62461eec12a85dcf7ead" standard verify_py313 copy_python_gdb ensurepip -else - install_package "Python-3.13.0a3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a3.tgz#9c7c2b42a20127816f9403723bfc88d1566f47dac0c46f50492f7ff8db646d8f" standard verify_py313 copy_python_gdb ensurepip -fi diff --git a/plugins/python-build/share/python-build/3.13.0a4 b/plugins/python-build/share/python-build/3.13.0a4 new file mode 100644 index 00000000..bceaeb5c --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0a4 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.0a4" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a4.tar.xz#bcbd6daae3de381d64a84e9ac50889dce71c5fdff2b680b676537b09907425f6" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.0a4" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a4.tgz#84c086d639f8ccf11aedf491c0dbc5cff8383641d0828cd8333ca491b16e42e2" standard verify_py313 copy_python_gdb ensurepip +fi From f9a2bb81b69bc2fc45753f7da5d246bc2706f01d Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Tue, 20 Feb 2024 20:41:41 +0300 Subject: [PATCH 067/246] Revert "Add CPython 3.13.0a4 (#2903)" -- MacOS build is broken This reverts commit 932dc464f5550e3c6af7f705891c1797c4ab004d. --- plugins/python-build/share/python-build/3.13.0a3 | 9 +++++++++ plugins/python-build/share/python-build/3.13.0a4 | 9 --------- 2 files changed, 9 insertions(+), 9 deletions(-) create mode 100644 plugins/python-build/share/python-build/3.13.0a3 delete mode 100644 plugins/python-build/share/python-build/3.13.0a4 diff --git a/plugins/python-build/share/python-build/3.13.0a3 b/plugins/python-build/share/python-build/3.13.0a3 new file mode 100644 index 00000000..4ca10241 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0a3 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.0a3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a3.tar.xz#20784c8304eb1c69c80f966ebdf0775be2e37e23df3b62461eec12a85dcf7ead" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.0a3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a3.tgz#9c7c2b42a20127816f9403723bfc88d1566f47dac0c46f50492f7ff8db646d8f" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.0a4 b/plugins/python-build/share/python-build/3.13.0a4 deleted file mode 100644 index bceaeb5c..00000000 --- a/plugins/python-build/share/python-build/3.13.0a4 +++ /dev/null @@ -1,9 +0,0 @@ -prefer_openssl3 -export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl -install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline -if has_tar_xz_support; then - install_package "Python-3.13.0a4" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a4.tar.xz#bcbd6daae3de381d64a84e9ac50889dce71c5fdff2b680b676537b09907425f6" standard verify_py313 copy_python_gdb ensurepip -else - install_package "Python-3.13.0a4" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a4.tgz#84c086d639f8ccf11aedf491c0dbc5cff8383641d0828cd8333ca491b16e42e2" standard verify_py313 copy_python_gdb ensurepip -fi From 02e1d4a293139ecf2c94206ee9c00b388550366e Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Sun, 25 Feb 2024 16:07:52 -0500 Subject: [PATCH 068/246] Handle case where `pyenv-commands --sh` returns nothing (#2908) In exceptional cases (custom installation, malfunctions elsewhere), `pyenv-commands --sh` may return nothing. In non-Fish, this would cause "syntax error near unexpected token `)'" in `pyenv()`. Bash does not allow to specify a `case` option that would never match. This works around it by defaulting to `/`. Commands, being filenames, can never match it. In Fish, nothing needs to be done: it apparently does interpret a `case` without argument as one that never matches. --- libexec/pyenv-init | 2 +- test/init.bats | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/libexec/pyenv-init b/libexec/pyenv-init index a875bb31..492360e6 100755 --- a/libexec/pyenv-init +++ b/libexec/pyenv-init @@ -297,7 +297,7 @@ EOS fi case "\$command" in - ${commands[*]}) + ${commands[*]:-/}) eval "\$(pyenv "sh-\$command" "\$@")" ;; *) diff --git a/test/init.bats b/test/init.bats index 21109c94..53d131cc 100755 --- a/test/init.bats +++ b/test/init.bats @@ -2,6 +2,18 @@ load test_helper +setup() { + export PATH="${PYENV_TEST_DIR}/bin:$PATH" +} + +create_executable() { + local name="$1" + local bin="${PYENV_TEST_DIR}/bin" + mkdir -p "$bin" + sed -Ee '1s/^ +//' > "${bin}/$name" + chmod +x "${bin}/$name" +} + @test "creates shims and versions directories" { assert [ ! -d "${PYENV_ROOT}/shims" ] assert [ ! -d "${PYENV_ROOT}/versions" ] @@ -167,6 +179,24 @@ echo "\$PATH" assert_line ' case "$command" in' } +@test "outputs sh-compatible case syntax" { + create_executable pyenv-commands < Date: Sat, 24 Feb 2024 21:03:27 -0500 Subject: [PATCH 069/246] Fix `KeyError` when running `add_miniforge.py` I was attempting to run the script to generate build files for new versions, but it failed because version `23.1.0-4`[^1] contained a malformed `.sha256` file.[^2] I looked at the miniforge repo's script `releases.py`[^3] and copied the logic about which release artifacts should be skipped when generating a list of downloads. [^1]: https://github.com/conda-forge/miniforge/releases/tag/23.1.0-4 [^2]: https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-uninstaller-patch-Windows-x86_64.exe.sha256 [^3]: https://github.com/conda-forge/miniforge/blob/a15762906ba6f339a95b218b784e91605a24a681/docs/releases.py#L35-L36 --- plugins/python-build/scripts/add_miniforge.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/python-build/scripts/add_miniforge.py b/plugins/python-build/scripts/add_miniforge.py index e9701b8c..1290b5cb 100755 --- a/plugins/python-build/scripts/add_miniforge.py +++ b/plugins/python-build/scripts/add_miniforge.py @@ -71,8 +71,9 @@ def supported(filename): return ('pypy' not in filename) and ('Windows' not in filename) def add_version(release): + tag_name = release['tag_name'] download_urls = { f['name']: f['browser_download_url'] for f in release['assets'] } - shas = dict([download_sha(url) for (name, url) in download_urls.items() if name.endswith('.sha256')]) + shas = dict([download_sha(url) for (name, url) in download_urls.items() if name.endswith('.sha256') and tag_name in name]) specs = [create_spec(filename, sha, download_urls[filename]) for (filename, sha) in shas.items() if supported(filename)] for distribution in DISTRIBUTIONS: From a43259a186822a6090063dd905cdfa192c2e9517 Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Sat, 24 Feb 2024 21:34:50 -0500 Subject: [PATCH 070/246] Fix overly broad check for existing miniforge build files The glob pattern we were using was too permissive and detecting miniconda build scripts as miniforge build scripts when they shared the same version. I have rewritten the pattern matching code to ensure we only look at files starting with `miniforge` and `mambaforge`. --- plugins/python-build/scripts/add_miniforge.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/scripts/add_miniforge.py b/plugins/python-build/scripts/add_miniforge.py index 1290b5cb..efa17a91 100755 --- a/plugins/python-build/scripts/add_miniforge.py +++ b/plugins/python-build/scripts/add_miniforge.py @@ -100,6 +100,6 @@ for release in requests.get(f'https://api.github.com/repos/{MINIFORGE_REPO}/rele logger.info('Looking for %(version)s in %(out_dir)s', locals()) - if not list(out_dir.glob(f'*-{version}')): + if any(not list(out_dir.glob(f'{distribution}*-{version}')) for distribution in DISTRIBUTIONS): logger.info('Downloading %(version)s', locals()) add_version(release) From dbbe2b63f49354482a5e3d0021ca2b8b541b5b4b Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Sat, 24 Feb 2024 21:55:22 -0500 Subject: [PATCH 071/246] Skip check for miniforge version `4.13.0-0` We always detect missing build scripts for `4.13.0-0` because the release[^1] doesn't have any mambaforge artifacts. Given that we've already created the build files, we don't need to check the release again. [^1]: https://github.com/conda-forge/miniforge/releases/tag/4.13.0-0 --- plugins/python-build/scripts/add_miniforge.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/python-build/scripts/add_miniforge.py b/plugins/python-build/scripts/add_miniforge.py index efa17a91..741ead90 100755 --- a/plugins/python-build/scripts/add_miniforge.py +++ b/plugins/python-build/scripts/add_miniforge.py @@ -100,6 +100,11 @@ for release in requests.get(f'https://api.github.com/repos/{MINIFORGE_REPO}/rele logger.info('Looking for %(version)s in %(out_dir)s', locals()) + # Release has no mambaforge artifacts, which causes the next check to always trigger + # Build scripts have already been generated, so safe to skip this version + if version == '4.13.0-0': + continue + if any(not list(out_dir.glob(f'{distribution}*-{version}')) for distribution in DISTRIBUTIONS): logger.info('Downloading %(version)s', locals()) add_version(release) From 5d06a2711869175a9ab566397601112bef851ae1 Mon Sep 17 00:00:00 2001 From: Alex Hedges Date: Sat, 24 Feb 2024 21:16:51 -0500 Subject: [PATCH 072/246] Update miniforge and mambaforge with `add_miniforge.py` --- .../share/python-build/mambaforge-22.11.1-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-22.11.1-1 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-22.11.1-2 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-22.11.1-3 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-22.11.1-4 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.1.0-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.1.0-1 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.1.0-2 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.1.0-3 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.1.0-4 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.10.0-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.11.0-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.3.0-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.3.1-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-23.3.1-1 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-22.11.1-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-22.11.1-1 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-22.11.1-2 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-22.11.1-3 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-23.1.0-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-23.1.0-1 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-23.1.0-2 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-23.1.0-3 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-23.1.0-4 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-23.10.0-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-23.11.0-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-23.3.0-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-23.3.1-0 | 25 +++++++++++++++++++ 28 files changed, 700 insertions(+) create mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-3 create mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-4 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-3 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.1.0-4 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.10.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.11.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.3.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.3.1-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-23.3.1-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.11.1-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.11.1-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.11.1-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-22.11.1-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-3 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.1.0-4 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.10.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.11.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-23.3.1-0 diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-0 b/plugins/python-build/share/python-build/mambaforge-22.11.1-0 new file mode 100644 index 00000000..a82ade5e --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.11.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-Linux-aarch64.sh#d701d2d411fef9f7c7beddf388a9cefc354e354fa7d4c9e5663d6a7413d76aab" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.11.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-Linux-ppc64le.sh#614b8e33e9b8086c81ce45ac9763b57bc38f51e70184b15b54ef02e12a00b8c8" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.11.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-Linux-x86_64.sh#e79c9b9553ab05d3d2e5b026f38035dbc772d79a96aa883b836828a16fccf44d" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.11.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-MacOSX-arm64.sh#67e3cf19b0aa21c5a890dde5545265c51792c6c495939eb26dfccdc6d3677b36" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.11.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-MacOSX-x86_64.sh#3067c707b3f297445fc2c9b66752a6320244d8a5589488ece8f2265c45230318" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-1 b/plugins/python-build/share/python-build/mambaforge-22.11.1-1 new file mode 100644 index 00000000..4a0c3fa7 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.11.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.11.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-Linux-aarch64.sh#ae6d9c269bf49165a64dc0312e5ea7e5fe8b1e29ab7d70df778b0183ad83f026" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.11.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-Linux-ppc64le.sh#2b4ce0603ea3f5e6979e5b34415dab5c5b7f0e4bd4a34b57e6c9fa11eb6603b7" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.11.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-Linux-x86_64.sh#28e88bbcc413a841d4046f24b621c710bd6075a7fe7a7ba406dc0681f9f833a0" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.11.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-MacOSX-arm64.sh#72f0467ddabfdfaf1fc9e52c93297691e74d4ee39c1647b2c4e9f1995f4978eb" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.11.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-MacOSX-x86_64.sh#badb485c59df134134135e431f017777bf0df89dc884df44045336d79df794b7" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-2 b/plugins/python-build/share/python-build/mambaforge-22.11.1-2 new file mode 100644 index 00000000..01711f09 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.11.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.11.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-Linux-aarch64.sh#90709f5246547f2b115c630738f2ad3cb8ee12d706e8d3a81efcc96112a4d138" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.11.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-Linux-ppc64le.sh#1821e4aa5cebb929796e911991a80b10beee062d4647931a88642f0089e215f2" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.11.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-Linux-x86_64.sh#a9f94a0d94934cb2dd42d79b9af843fdd2ced7d324722e9047340af2f9837416" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.11.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-MacOSX-arm64.sh#78039894a1785e6d532fbe4d09354afb9c5779c2e087aa64c0c525505afebff2" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.11.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-MacOSX-x86_64.sh#4ab9fcb934cfe7dfe7b7382d2ec2b31470fdd932d4f979d28d33670ae90c6e32" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-3 b/plugins/python-build/share/python-build/mambaforge-22.11.1-3 new file mode 100644 index 00000000..a6d72906 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.11.1-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.11.1-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-Linux-aarch64.sh#898134462553de6b16cdcf649b2fc5f46b7bff5ac92b12cae7f6a46eeb973c8d" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.11.1-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-Linux-ppc64le.sh#446b3c31293cfec57dc651fbd0aadb9b9663746863e7601b2aa25aa005907192" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.11.1-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-Linux-x86_64.sh#dc7b120aa6f12004e406498cb605c752bd6e4bfe18da169dfe119b91d0c8c8ce" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.11.1-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-MacOSX-arm64.sh#a85225bc54ba3c5caaf202817b4f49578d6134e6818c8fbc75173af69a80847d" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.11.1-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Mambaforge-22.11.1-3-MacOSX-x86_64.sh#0b17731c449ab96b3c5e39553fd68fbe1e4c68e9b016126ccf68a8f00a4a3a38" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-4 b/plugins/python-build/share/python-build/mambaforge-22.11.1-4 new file mode 100644 index 00000000..82e3daf8 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-22.11.1-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-22.11.1-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-Linux-aarch64.sh#96191001f27e0cc76612d4498d34f9f656d8a7dddee44617159e42558651479c" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-22.11.1-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-Linux-ppc64le.sh#9ad024c2ed11e1c75324515727c70384f073be1373111c34b14b7212944e7e0d" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-22.11.1-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-Linux-x86_64.sh#16c7d256de783ceeb39970e675efa4a8eb830dcbb83187f1197abfea0bf07d30" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-22.11.1-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-MacOSX-arm64.sh#a551be4b416a05f31ba3605f78694f1e21559533744c45ded0c4bfeb7666f317" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-22.11.1-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-4/Mambaforge-22.11.1-4-MacOSX-x86_64.sh#0f0f746330259c6f9c3678fdbdb6195dddad4b9bac921a6de07c62a60234ad8d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-0 b/plugins/python-build/share/python-build/mambaforge-23.1.0-0 new file mode 100644 index 00000000..042fa441 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-Linux-aarch64.sh#01c29a399ad63c9aa28a69a622e9273e9bb8c5d504f1858ba789c5ca63ba1187" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-Linux-ppc64le.sh#ec0b8b10fbb9a7eb1b9c6ddf0487d0e8e0b16926791b84afc1623b43f45d1faf" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-Linux-x86_64.sh#0598ec82e02233e0e242b12129349416225dd07c2318f0ec1cfce4d7d9c397d8" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-MacOSX-arm64.sh#538ea7a9d24cad041a2b7fd71cf49f433137f9b4bc8e11408f2285e99cf79f96" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Mambaforge-23.1.0-0-MacOSX-x86_64.sh#61d95ff7a7bbe465a416f5ad43460fb1a50e621ed15233cc4e3441a03bb48cd4" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-1 b/plugins/python-build/share/python-build/mambaforge-23.1.0-1 new file mode 100644 index 00000000..4ba8377b --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-Linux-aarch64.sh#d9d89c9e349369702171008d9ee7c5ce80ed420e5af60bd150a3db4bf674443a" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-Linux-ppc64le.sh#f7065963c9c7eba0ea80ad6431903ddb89fe1ec34c47967cbb8a5247c613b30b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-Linux-x86_64.sh#cfb16c47dc2d115c8b114280aa605e322173f029fdb847a45348bf4bd23c62ab" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-MacOSX-arm64.sh#e519a74734f963c2fe744557115f8862fa573dea0de581b0b4a22cbd31127448" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Mambaforge-23.1.0-1-MacOSX-x86_64.sh#e33f9d426d62759e7c4adf5431fdd91a23df71732b5e22b699cace52255e8196" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-2 b/plugins/python-build/share/python-build/mambaforge-23.1.0-2 new file mode 100644 index 00000000..ef90d5cd --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-Linux-aarch64.sh#a1a3f7cd517e97ef9b0f8e4c1afeb659c7c69849e623904297984e79b1f29b37" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-Linux-ppc64le.sh#fa7e75949d227c12d152efce5ae494ad5725fb0f71151dfdbdddd60e3d265dde" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-Linux-x86_64.sh#8c9244094375379cfe1b6317afc9e693924d0f58ea5c68c64cde4463847c1e31" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-MacOSX-arm64.sh#a58be683b4c00c32591eedc7a6675c8a4d3c7cbf3ef3808f4513033de46be7c8" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Mambaforge-23.1.0-2-MacOSX-x86_64.sh#f7c53778a47579d886441747a7fe697d020da3b1726f3f7fe7d7e779c3d506e2" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-3 b/plugins/python-build/share/python-build/mambaforge-23.1.0-3 new file mode 100644 index 00000000..ce40edb8 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-Linux-aarch64.sh#b7038f4f4d972fa2589dd9edd014940b94600589f924cc6d35a9b11d37506c25" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-Linux-ppc64le.sh#b89f25891ce072a0de5f6f1f5889609dc1eee71ac1301c8ddb7538bd608f273c" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-Linux-x86_64.sh#7a6a07de6063245163a87972fb15be3a226045166eb7ee526344f82da1f3b694" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-MacOSX-arm64.sh#75368b03ac79b170537748a600ea847e35d83a4fef9ea438c34217b7e28b9330" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Mambaforge-23.1.0-3-MacOSX-x86_64.sh#7e4dd16067bbb4ab41616f3378d0c788302818c7fe13806fe8e97707471c9004" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.1.0-4 b/plugins/python-build/share/python-build/mambaforge-23.1.0-4 new file mode 100644 index 00000000..d4432ab9 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.1.0-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.1.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-Linux-aarch64.sh#95c354268f62e32d57c84f2e1a0caf9b19f77c894ecc83008db0e5e666ce3d43" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.1.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-Linux-ppc64le.sh#70ed57b9d32457c172c208b16a839937e2dd77e3fa1bff5ef1cb2f1a7da102ba" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.1.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-Linux-x86_64.sh#6ca38e02be99c410644c283bac74601f296dd10995ce1c8d345af995a39b5916" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.1.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-MacOSX-arm64.sh#baa1ae638537766cac808efba09175ba21878b34288476dc7bbd01347145721f" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.1.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Mambaforge-23.1.0-4-MacOSX-x86_64.sh#26937ea98870531e51da942b7f6cc26cc9af49bb16390486ee6dde9e0dc2c597" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.10.0-0 b/plugins/python-build/share/python-build/mambaforge-23.10.0-0 new file mode 100644 index 00000000..f48a4a90 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.10.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.10.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-Linux-aarch64.sh#38d86db6ef78caa0ac001c48f454112df2a1e90cd6884dba03a3265393f762b2" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.10.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-Linux-ppc64le.sh#8f28c516ef441c0691d94a7cf3917b8c77eda4ac378c89bd491d4d8ff4f887c8" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.10.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-Linux-x86_64.sh#cf2782419e118db664653a6e63bbf212a24cbc3126c413aa5886fd0f7d20d3c0" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.10.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-MacOSX-arm64.sh#8b300c413195f33c3965445213de2b76bbf5fcbe9087aa80b8d6bf81a21b5764" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.10.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Mambaforge-23.10.0-0-MacOSX-x86_64.sh#8f1ddb27deffe5e631b3ce69fc3f880c7f3710ee08a42fee64e2b2e1a039683f" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.11.0-0 b/plugins/python-build/share/python-build/mambaforge-23.11.0-0 new file mode 100644 index 00000000..e22937ed --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-Linux-aarch64.sh#71320f28280b4e41f37469f6b0ae85e31ba9c26a87c7ee69cecaae3eaa5a4057" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-Linux-ppc64le.sh#148b18f94b5a0878d5fa1190b41cad5a803eca1cd15429e26571fef11422e2b2" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-Linux-x86_64.sh#3dfdcc162bf0df83b5025608dc2acdbbc575bd416b75701fb5863343c0517a78" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-MacOSX-arm64.sh#dd832d8a65a861b5592b2cf1d55f26031f7c1491b30321754443931e7b1e6832" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Mambaforge-23.11.0-0-MacOSX-x86_64.sh#c6ac073b80cedb313561bc11c2e61b0bd102b74df0363ed6c1e90303b322092a" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.3.0-0 b/plugins/python-build/share/python-build/mambaforge-23.3.0-0 new file mode 100644 index 00000000..6a75d2bb --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-Linux-aarch64.sh#ae506f8013fc3f487dd3c9a4fde0b1a529b02bb5478921913c46a115dbcd7d1f" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-Linux-ppc64le.sh#f8c0e24abaedfcf611c70451d0bb771f453a0eb4cc0bbbb0670f9753817827a6" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-Linux-x86_64.sh#f8b12a9815575b0fec9c85100053ef24e59043194546826fb565288c51ba930d" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-MacOSX-arm64.sh#82ed548de9de74d2b6dda9830f581d897eb82694c1df79d957eaef9066dd7ef4" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Mambaforge-23.3.0-0-MacOSX-x86_64.sh#d4603c9b380d5daa923f8d0543de5df57ba971a1562a519c6e3fe1240963012a" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.3.1-0 b/plugins/python-build/share/python-build/mambaforge-23.3.1-0 new file mode 100644 index 00000000..3a2c8f7b --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.3.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.3.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-Linux-aarch64.sh#6e4feeafeff69f35a7455a35f763eb6d5a1e946e7b9b321099640ac93e619a53" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.3.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-Linux-ppc64le.sh#6518bf3aa2499a4c76fee54d33450d386a1d4c1bf2e0b2ddaec03f8f7b4319d2" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.3.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-Linux-x86_64.sh#c425dcc3501692f23564d8b0a7b3ba69166c61424e9ce0d825f64f9479dcafa1" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.3.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-MacOSX-arm64.sh#71e7ea4295d22f0c7ab08b334c07d9540e10775c8abd456314e186625cfb3bf1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.3.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Mambaforge-23.3.1-0-MacOSX-x86_64.sh#b7b5fe0690528a4d449597e49edb2595625f2cf29e0473fd2a8d2dabc4d948f5" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-23.3.1-1 b/plugins/python-build/share/python-build/mambaforge-23.3.1-1 new file mode 100644 index 00000000..1e579c4b --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-23.3.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-23.3.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-Linux-aarch64.sh#32dcc92b4f0b0108ac0734721fb65172395f6c39ecdcaf5bf63edc01f0932020" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-23.3.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-Linux-ppc64le.sh#93fa681cadda8b73bd93a1bf2f60aaa577fe02ef537ee5300eab33af2b45f6d0" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-23.3.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-Linux-x86_64.sh#dbe92c011a1315b9626e2f93a165892f4b89177145bc350b3859a483a3642a24" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-23.3.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-MacOSX-arm64.sh#1b07c1a231a18f21da6aac1abe87dd173ce141ce7612f06eab962eb9f8353a27" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-23.3.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-1/Mambaforge-23.3.1-1-MacOSX-x86_64.sh#ee707e117c4eb54b7a02a0ba1b2fc2b60325ce6f767e76274e45dbe7743efa7d" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.11.1-0 b/plugins/python-build/share/python-build/miniforge3-22.11.1-0 new file mode 100644 index 00000000..a9b8551b --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.11.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-Linux-aarch64.sh#ebdb58e3f3c3372433ee7c5a72069aea97dbde3c0c5c3bf37f84f072479499fd" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.11.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-Linux-ppc64le.sh#831b26fa4d5aae8668327b75e1c7ade2d6c1614eb986c7d9221082ce8b511e74" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.11.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-Linux-x86_64.sh#2235f18922121544d2a8152ebda278d70525aa7909cd1ff3cb3ff41f0553ddd8" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.11.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-MacOSX-arm64.sh#aa19baf0ee1e50d308635835ef8b982679aaad13a48cbebf003d50eaadc947f5" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.11.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-MacOSX-x86_64.sh#330b78000c33603e2f87d1c2d693a4f7a76d46ae8cdb79293f934cc812037b4e" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.11.1-1 b/plugins/python-build/share/python-build/miniforge3-22.11.1-1 new file mode 100644 index 00000000..adf5d55b --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.11.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.11.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-Linux-aarch64.sh#12177bf63a76067d83b974ed303c3ce70e33f62d0ee5efec1c8ac09503334904" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.11.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-Linux-ppc64le.sh#5a09b7b136787b4460edf3798e37676983b4233782a3ab9ddb6bade44f0e3ee3" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.11.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-Linux-x86_64.sh#5c8e437632c7ed52034f4cb766a3bc49cecda5fec824c7173a3ba1fc8dc9ee29" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.11.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-MacOSX-arm64.sh#611452c8acc69f6323ffbbb0bb1c4b2244006eb3a9d5214017059a85f3b8abda" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.11.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-MacOSX-x86_64.sh#9542378343fc2d009335cbca212ce5d413c4b3ee25afecba1683b5d2291d1aa3" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.11.1-2 b/plugins/python-build/share/python-build/miniforge3-22.11.1-2 new file mode 100644 index 00000000..b8810e83 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.11.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.11.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-Linux-aarch64.sh#a56ca2e0fe901e809b3add4235e06221b94d207d6513019985bde8509062d7bc" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.11.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-Linux-ppc64le.sh#6bc85189bad2f1b45a36b0368b10ee0154268c38c7b0770d225158fc48e14f17" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.11.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-Linux-x86_64.sh#79f7de7a1a48f82b08b2d7f16503daf9de7de7423f4e70372a30919b9cbe35b6" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.11.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-MacOSX-arm64.sh#7e9d1848df1a049daeba8e1d8d0cb9fffdd511571df7cae075e7ee4f1efd2fc0" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.11.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-MacOSX-x86_64.sh#7c8e1a35ad9d41a1969d47cfe4dca44d9e422607ab704e5850b15a3bc1331cc5" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.11.1-3 b/plugins/python-build/share/python-build/miniforge3-22.11.1-3 new file mode 100644 index 00000000..4d6a3639 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-22.11.1-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-22.11.1-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-Linux-aarch64.sh#6ee6fbbaaf900f090e9786b093ad829f0d3e6224d8c50ee37d5fc2c1317b2521" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-22.11.1-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-Linux-ppc64le.sh#bfccb07a65500c7ed2a7eb363c720caf69dc6baaa36ef52b1224df270c215c2c" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-22.11.1-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-Linux-x86_64.sh#b96991615834e66a34f3653f12597b5938425bb00a0ce47dc493ea03ecf6f339" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-22.11.1-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-MacOSX-arm64.sh#f416cc5ceb8420d12d078254f161f7c59fd41ca4dfcd86ce6a67c9c34069a15e" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-22.11.1-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-3/Miniforge3-22.11.1-3-MacOSX-x86_64.sh#9e590b6635d97a81fcb8b5366384317db544629b290f34423f3710a6917d2d58" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-0 b/plugins/python-build/share/python-build/miniforge3-23.1.0-0 new file mode 100644 index 00000000..a67b8772 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-Linux-aarch64.sh#4972174d7bc88c636f50257fd2dc718abfd648b227dacbde4c8db716d05bb08b" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-Linux-ppc64le.sh#21ccc195bdee24caf9eef5e8fdd250d3fba9147a68e1cd114c2375cb03ba6043" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-Linux-x86_64.sh#9bbcc29e8e43151bd4634fbe086e3d7914aba3963ac6b1e8d59c530435bd33d9" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-MacOSX-arm64.sh#0aece610f84e023d062e1c88bfc6033dd60101ec9b79819f87fc1b009263989b" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-0/Miniforge3-23.1.0-0-MacOSX-x86_64.sh#a9665fec3c8c1abd572666d4c49d512b3c27082324a1713ca2fde6efb8ce7856" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-1 b/plugins/python-build/share/python-build/miniforge3-23.1.0-1 new file mode 100644 index 00000000..83a0638a --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-Linux-aarch64.sh#9083f5aa0a125bfbc1a8e8d5eb57812a2761b884e0806a75ebc3c95be894791e" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-Linux-ppc64le.sh#6b9d4af128f6378ec688ce412fb1a4fe8ce298df9d05bb7092637c8047faeb26" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-Linux-x86_64.sh#7a5859e873ed36fc9a141fff0ac60e133b971b3413aed49a4c82693d4f4a2ad2" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-MacOSX-arm64.sh#147ee54acc6ebd5148d712945fed29c4e01a247528f28fd958615f63bfc75687" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-1/Miniforge3-23.1.0-1-MacOSX-x86_64.sh#7c737a78918164c5a07a6489b8429f9788aadb58536434c0d34316e7686dc424" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-2 b/plugins/python-build/share/python-build/miniforge3-23.1.0-2 new file mode 100644 index 00000000..538280fd --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-Linux-aarch64.sh#ca662b0c5620cc4f70afe75a674b212a424bb16da103251d07afe8cfa268983c" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-Linux-ppc64le.sh#34e7db7d071b15abb07603108d5a74c4878aa25be30005163ed9bdbafe8ecf79" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-Linux-x86_64.sh#ee75d00832ef4aeb1ae04ac62ffb1dc917409696cfbe50f5f93125ab9b165278" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-MacOSX-arm64.sh#05891e572dedd62c128c51ed7cdcceba191155779f5ea1abdf0e57e3fba8a982" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-2/Miniforge3-23.1.0-2-MacOSX-x86_64.sh#1d837379b50b57bf009b6a6956a7cff10dc25ca52a940a35b7090f2e9b6c5482" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-3 b/plugins/python-build/share/python-build/miniforge3-23.1.0-3 new file mode 100644 index 00000000..dcfb05ac --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-3 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-3-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-Linux-aarch64.sh#2e180aa558ff38481ec5147b7f06060c3c8cfbd12894abe31b5f75fc23f7d09a" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-3-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-Linux-ppc64le.sh#00722f3dd257143816d94d8fc97a3c43ccc3046e31956240d14c210268ccc64e" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-3-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-Linux-x86_64.sh#d4e4750ac95508512c52ff33fa71834e7839e8c51224694a544aecdd655ce29c" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-3-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-MacOSX-arm64.sh#85f4f38d3502871c09d94ab2fd43fe221284eb33c361c486c2b420a726328a7e" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-3-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-3/Miniforge3-23.1.0-3-MacOSX-x86_64.sh#846df715e78ef3b875d1cbf17ed124e261f5ece2dd0e2556310cf4dfbc1238f6" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.1.0-4 b/plugins/python-build/share/python-build/miniforge3-23.1.0-4 new file mode 100644 index 00000000..0aa8686e --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.1.0-4 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.1.0-4-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-Linux-aarch64.sh#bf6a4b9d3e0195b9c64b58f0e28738edc259a214f362edbc23884e82ad59cb8c" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.1.0-4-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-Linux-ppc64le.sh#0e49480e6a3429d9578bdbdc154d623375273b3e8c205353c1cc9d6e0cce1f59" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.1.0-4-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-Linux-x86_64.sh#35c531207d2a8d212215bdb7f998c926f24bc8686e1cf46a693a3ea375613a7f" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.1.0-4-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-MacOSX-arm64.sh#de48052b85900a3878cedbb25add7e17b14d5bdfba8ba523791851a10a6b84fe" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.1.0-4-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.1.0-4/Miniforge3-23.1.0-4-MacOSX-x86_64.sh#a43f4e34aa27b5cb849027b01b03931df52f768fc8b82b1f72f40ff064abb6f3" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.10.0-0 b/plugins/python-build/share/python-build/miniforge3-23.10.0-0 new file mode 100644 index 00000000..ef4624c4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.10.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.10.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-Linux-aarch64.sh#3760323416d2ce48ca8445386a8c12b453a92f111614dd1870f0ea684d6d32a8" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.10.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-Linux-ppc64le.sh#d1a5287138cc4bcc70dad3d1dcf770d8ec13f93c82aeea481bb727860b0f4b5c" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.10.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-Linux-x86_64.sh#da66ba24d5ffdf4c339ec8923de9e207f682f2027f9f382103080dea4407ef33" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.10.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-MacOSX-arm64.sh#057b6ba35d5872b33b6342183546bd0d5e838460bb019a2fe4db2208eb042135" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.10.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.10.0-0/Miniforge3-23.10.0-0-MacOSX-x86_64.sh#a1785d943daba4f23dac64fc389b4e5929aee6d20eb8ba245671887249238df9" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.11.0-0 b/plugins/python-build/share/python-build/miniforge3-23.11.0-0 new file mode 100644 index 00000000..3873f0f0 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-Linux-aarch64.sh#775968746d062a14bd84db3ae72f18f60f4acf229bd840625805e87668486bf4" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-Linux-ppc64le.sh#a77f1293dbc2a70c5b58f495f70dfc143f3455ca9da9edbc1afa66157c1c722a" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-Linux-x86_64.sh#73576b96409ed38a7ca596bece058e8c77c6ef3eab42af7cfdf2ae975e8f3928" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-MacOSX-arm64.sh#9382007611d4ad7201976a33cd65aaf2b3de582285b76c894d8c71eac544bfe1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.11.0-0/Miniforge3-23.11.0-0-MacOSX-x86_64.sh#6e586a93cc8c6d21deb543d46740806795eae4ff16a76bc5f8a57673e3044c73" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.3.0-0 b/plugins/python-build/share/python-build/miniforge3-23.3.0-0 new file mode 100644 index 00000000..58204c91 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-Linux-aarch64.sh#ca3ccf3006d7923b91157c434c4a9ba58b99812a00cf48aa83f2835ea3f7d167" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-Linux-ppc64le.sh#4b12965a0c0746110480c61440ba836022db72cdfed69616de3dfa66ba7c92df" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-Linux-x86_64.sh#17484f59cbe983abb953cc33e7a4c0ee0b33153de61d5465bb1aaf176e43d038" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-MacOSX-arm64.sh#37ca7c33fefcfb45deef58eaa690970c7392a87f01a076f932dd7f3f684888d7" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.0-0/Miniforge3-23.3.0-0-MacOSX-x86_64.sh#32f797ba073ae153bd1fd36a556833c0082c3cd44ac25f13fc5228258aadf7a5" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-23.3.1-0 b/plugins/python-build/share/python-build/miniforge3-23.3.1-0 new file mode 100644 index 00000000..941d15e6 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-23.3.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-23.3.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-Linux-aarch64.sh#b71277b8b40a6817d923fde0b858f56a4504f4e9b659d343dd8eae9d9473ab7f" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-23.3.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-Linux-ppc64le.sh#434b461d309110bfeb72198541a541985aa197e3b605de27978c15f31d1520ef" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-23.3.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-Linux-x86_64.sh#9be723d231609919fa3e3bb06f899a9a9c22e92e570bada8129a1bf50fee8d73" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-23.3.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-MacOSX-arm64.sh#32632039d6f457e56589591bd893f62cba85e31379ec8b663f8b06f35b0860e7" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-23.3.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/23.3.1-0/Miniforge3-23.3.1-0-MacOSX-x86_64.sh#e9447f308499d99821c48293fe258bb47595f238140cd9c834f57321d3839cd0" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 2aa13dc4fe27b0784171dc016cfd44cc1f09bef1 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Tue, 27 Feb 2024 18:35:43 +0300 Subject: [PATCH 073/246] Remove broken miniforge3 and mambaforge 22.11.1-0 to 22.11.1-2 Cause 403s on dependency packages --- .../share/python-build/mambaforge-22.11.1-0 | 25 ------------------- .../share/python-build/mambaforge-22.11.1-1 | 25 ------------------- .../share/python-build/mambaforge-22.11.1-2 | 25 ------------------- .../share/python-build/miniforge3-22.11.1-0 | 25 ------------------- .../share/python-build/miniforge3-22.11.1-1 | 25 ------------------- .../share/python-build/miniforge3-22.11.1-2 | 25 ------------------- 6 files changed, 150 deletions(-) delete mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-0 delete mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-1 delete mode 100644 plugins/python-build/share/python-build/mambaforge-22.11.1-2 delete mode 100644 plugins/python-build/share/python-build/miniforge3-22.11.1-0 delete mode 100644 plugins/python-build/share/python-build/miniforge3-22.11.1-1 delete mode 100644 plugins/python-build/share/python-build/miniforge3-22.11.1-2 diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-0 b/plugins/python-build/share/python-build/mambaforge-22.11.1-0 deleted file mode 100644 index a82ade5e..00000000 --- a/plugins/python-build/share/python-build/mambaforge-22.11.1-0 +++ /dev/null @@ -1,25 +0,0 @@ -case "$(anaconda_architecture 2>/dev/null || true)" in -"Linux-aarch64" ) - install_script "Mambaforge-22.11.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-Linux-aarch64.sh#d701d2d411fef9f7c7beddf388a9cefc354e354fa7d4c9e5663d6a7413d76aab" "miniconda" verify_py310 - ;; -"Linux-ppc64le" ) - install_script "Mambaforge-22.11.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-Linux-ppc64le.sh#614b8e33e9b8086c81ce45ac9763b57bc38f51e70184b15b54ef02e12a00b8c8" "miniconda" verify_py310 - ;; -"Linux-x86_64" ) - install_script "Mambaforge-22.11.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-Linux-x86_64.sh#e79c9b9553ab05d3d2e5b026f38035dbc772d79a96aa883b836828a16fccf44d" "miniconda" verify_py310 - ;; -"MacOSX-arm64" ) - install_script "Mambaforge-22.11.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-MacOSX-arm64.sh#67e3cf19b0aa21c5a890dde5545265c51792c6c495939eb26dfccdc6d3677b36" "miniconda" verify_py310 - ;; -"MacOSX-x86_64" ) - install_script "Mambaforge-22.11.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Mambaforge-22.11.1-0-MacOSX-x86_64.sh#3067c707b3f297445fc2c9b66752a6320244d8a5589488ece8f2265c45230318" "miniconda" verify_py310 - ;; -* ) - { echo - colorize 1 "ERROR" - echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." - echo - } >&2 - exit 1 - ;; -esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-1 b/plugins/python-build/share/python-build/mambaforge-22.11.1-1 deleted file mode 100644 index 4a0c3fa7..00000000 --- a/plugins/python-build/share/python-build/mambaforge-22.11.1-1 +++ /dev/null @@ -1,25 +0,0 @@ -case "$(anaconda_architecture 2>/dev/null || true)" in -"Linux-aarch64" ) - install_script "Mambaforge-22.11.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-Linux-aarch64.sh#ae6d9c269bf49165a64dc0312e5ea7e5fe8b1e29ab7d70df778b0183ad83f026" "miniconda" verify_py310 - ;; -"Linux-ppc64le" ) - install_script "Mambaforge-22.11.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-Linux-ppc64le.sh#2b4ce0603ea3f5e6979e5b34415dab5c5b7f0e4bd4a34b57e6c9fa11eb6603b7" "miniconda" verify_py310 - ;; -"Linux-x86_64" ) - install_script "Mambaforge-22.11.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-Linux-x86_64.sh#28e88bbcc413a841d4046f24b621c710bd6075a7fe7a7ba406dc0681f9f833a0" "miniconda" verify_py310 - ;; -"MacOSX-arm64" ) - install_script "Mambaforge-22.11.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-MacOSX-arm64.sh#72f0467ddabfdfaf1fc9e52c93297691e74d4ee39c1647b2c4e9f1995f4978eb" "miniconda" verify_py310 - ;; -"MacOSX-x86_64" ) - install_script "Mambaforge-22.11.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Mambaforge-22.11.1-1-MacOSX-x86_64.sh#badb485c59df134134135e431f017777bf0df89dc884df44045336d79df794b7" "miniconda" verify_py310 - ;; -* ) - { echo - colorize 1 "ERROR" - echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." - echo - } >&2 - exit 1 - ;; -esac diff --git a/plugins/python-build/share/python-build/mambaforge-22.11.1-2 b/plugins/python-build/share/python-build/mambaforge-22.11.1-2 deleted file mode 100644 index 01711f09..00000000 --- a/plugins/python-build/share/python-build/mambaforge-22.11.1-2 +++ /dev/null @@ -1,25 +0,0 @@ -case "$(anaconda_architecture 2>/dev/null || true)" in -"Linux-aarch64" ) - install_script "Mambaforge-22.11.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-Linux-aarch64.sh#90709f5246547f2b115c630738f2ad3cb8ee12d706e8d3a81efcc96112a4d138" "miniconda" verify_py310 - ;; -"Linux-ppc64le" ) - install_script "Mambaforge-22.11.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-Linux-ppc64le.sh#1821e4aa5cebb929796e911991a80b10beee062d4647931a88642f0089e215f2" "miniconda" verify_py310 - ;; -"Linux-x86_64" ) - install_script "Mambaforge-22.11.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-Linux-x86_64.sh#a9f94a0d94934cb2dd42d79b9af843fdd2ced7d324722e9047340af2f9837416" "miniconda" verify_py310 - ;; -"MacOSX-arm64" ) - install_script "Mambaforge-22.11.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-MacOSX-arm64.sh#78039894a1785e6d532fbe4d09354afb9c5779c2e087aa64c0c525505afebff2" "miniconda" verify_py310 - ;; -"MacOSX-x86_64" ) - install_script "Mambaforge-22.11.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Mambaforge-22.11.1-2-MacOSX-x86_64.sh#4ab9fcb934cfe7dfe7b7382d2ec2b31470fdd932d4f979d28d33670ae90c6e32" "miniconda" verify_py310 - ;; -* ) - { echo - colorize 1 "ERROR" - echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." - echo - } >&2 - exit 1 - ;; -esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.11.1-0 b/plugins/python-build/share/python-build/miniforge3-22.11.1-0 deleted file mode 100644 index a9b8551b..00000000 --- a/plugins/python-build/share/python-build/miniforge3-22.11.1-0 +++ /dev/null @@ -1,25 +0,0 @@ -case "$(anaconda_architecture 2>/dev/null || true)" in -"Linux-aarch64" ) - install_script "Miniforge3-22.11.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-Linux-aarch64.sh#ebdb58e3f3c3372433ee7c5a72069aea97dbde3c0c5c3bf37f84f072479499fd" "miniconda" verify_py310 - ;; -"Linux-ppc64le" ) - install_script "Miniforge3-22.11.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-Linux-ppc64le.sh#831b26fa4d5aae8668327b75e1c7ade2d6c1614eb986c7d9221082ce8b511e74" "miniconda" verify_py310 - ;; -"Linux-x86_64" ) - install_script "Miniforge3-22.11.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-Linux-x86_64.sh#2235f18922121544d2a8152ebda278d70525aa7909cd1ff3cb3ff41f0553ddd8" "miniconda" verify_py310 - ;; -"MacOSX-arm64" ) - install_script "Miniforge3-22.11.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-MacOSX-arm64.sh#aa19baf0ee1e50d308635835ef8b982679aaad13a48cbebf003d50eaadc947f5" "miniconda" verify_py310 - ;; -"MacOSX-x86_64" ) - install_script "Miniforge3-22.11.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-0/Miniforge3-22.11.1-0-MacOSX-x86_64.sh#330b78000c33603e2f87d1c2d693a4f7a76d46ae8cdb79293f934cc812037b4e" "miniconda" verify_py310 - ;; -* ) - { echo - colorize 1 "ERROR" - echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." - echo - } >&2 - exit 1 - ;; -esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.11.1-1 b/plugins/python-build/share/python-build/miniforge3-22.11.1-1 deleted file mode 100644 index adf5d55b..00000000 --- a/plugins/python-build/share/python-build/miniforge3-22.11.1-1 +++ /dev/null @@ -1,25 +0,0 @@ -case "$(anaconda_architecture 2>/dev/null || true)" in -"Linux-aarch64" ) - install_script "Miniforge3-22.11.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-Linux-aarch64.sh#12177bf63a76067d83b974ed303c3ce70e33f62d0ee5efec1c8ac09503334904" "miniconda" verify_py310 - ;; -"Linux-ppc64le" ) - install_script "Miniforge3-22.11.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-Linux-ppc64le.sh#5a09b7b136787b4460edf3798e37676983b4233782a3ab9ddb6bade44f0e3ee3" "miniconda" verify_py310 - ;; -"Linux-x86_64" ) - install_script "Miniforge3-22.11.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-Linux-x86_64.sh#5c8e437632c7ed52034f4cb766a3bc49cecda5fec824c7173a3ba1fc8dc9ee29" "miniconda" verify_py310 - ;; -"MacOSX-arm64" ) - install_script "Miniforge3-22.11.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-MacOSX-arm64.sh#611452c8acc69f6323ffbbb0bb1c4b2244006eb3a9d5214017059a85f3b8abda" "miniconda" verify_py310 - ;; -"MacOSX-x86_64" ) - install_script "Miniforge3-22.11.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-1/Miniforge3-22.11.1-1-MacOSX-x86_64.sh#9542378343fc2d009335cbca212ce5d413c4b3ee25afecba1683b5d2291d1aa3" "miniconda" verify_py310 - ;; -* ) - { echo - colorize 1 "ERROR" - echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." - echo - } >&2 - exit 1 - ;; -esac diff --git a/plugins/python-build/share/python-build/miniforge3-22.11.1-2 b/plugins/python-build/share/python-build/miniforge3-22.11.1-2 deleted file mode 100644 index b8810e83..00000000 --- a/plugins/python-build/share/python-build/miniforge3-22.11.1-2 +++ /dev/null @@ -1,25 +0,0 @@ -case "$(anaconda_architecture 2>/dev/null || true)" in -"Linux-aarch64" ) - install_script "Miniforge3-22.11.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-Linux-aarch64.sh#a56ca2e0fe901e809b3add4235e06221b94d207d6513019985bde8509062d7bc" "miniconda" verify_py310 - ;; -"Linux-ppc64le" ) - install_script "Miniforge3-22.11.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-Linux-ppc64le.sh#6bc85189bad2f1b45a36b0368b10ee0154268c38c7b0770d225158fc48e14f17" "miniconda" verify_py310 - ;; -"Linux-x86_64" ) - install_script "Miniforge3-22.11.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-Linux-x86_64.sh#79f7de7a1a48f82b08b2d7f16503daf9de7de7423f4e70372a30919b9cbe35b6" "miniconda" verify_py310 - ;; -"MacOSX-arm64" ) - install_script "Miniforge3-22.11.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-MacOSX-arm64.sh#7e9d1848df1a049daeba8e1d8d0cb9fffdd511571df7cae075e7ee4f1efd2fc0" "miniconda" verify_py310 - ;; -"MacOSX-x86_64" ) - install_script "Miniforge3-22.11.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/22.11.1-2/Miniforge3-22.11.1-2-MacOSX-x86_64.sh#7c8e1a35ad9d41a1969d47cfe4dca44d9e422607ab704e5850b15a3bc1331cc5" "miniconda" verify_py310 - ;; -* ) - { echo - colorize 1 "ERROR" - echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." - echo - } >&2 - exit 1 - ;; -esac From 57594c0600655f5211bccefc53b1b916cb83555f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Tue, 27 Feb 2024 18:49:47 +0300 Subject: [PATCH 074/246] More detailed explanation of the band-aid code --- plugins/python-build/scripts/add_miniforge.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/plugins/python-build/scripts/add_miniforge.py b/plugins/python-build/scripts/add_miniforge.py index 741ead90..bd2c91cf 100755 --- a/plugins/python-build/scripts/add_miniforge.py +++ b/plugins/python-build/scripts/add_miniforge.py @@ -100,8 +100,10 @@ for release in requests.get(f'https://api.github.com/repos/{MINIFORGE_REPO}/rele logger.info('Looking for %(version)s in %(out_dir)s', locals()) - # Release has no mambaforge artifacts, which causes the next check to always trigger - # Build scripts have already been generated, so safe to skip this version + # This release has no mambaforge artifacts which causes the next check to always trigger. + # Build scripts for miniforge3-4.13.0-0 have already been generated. + # Assuming this was a fluke, we don't yet need to implement proactively checking all releases for contents + # or ignoring a release if _any_ of the flavors is already present in Pyenv. if version == '4.13.0-0': continue From 9d8764f545facc43f82e212fd3c158ff4d5b6415 Mon Sep 17 00:00:00 2001 From: native-api Date: Tue, 27 Feb 2024 19:10:39 +0300 Subject: [PATCH 075/246] Document default build configuration customizations (#2911) --- plugins/python-build/README.md | 41 ++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index 7b0601cd..f0826fc8 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -98,6 +98,47 @@ custom definition files. [definitions]: https://github.com/pyenv/pyenv/tree/master/plugins/python-build/share/python-build +### Default build configuration + +Without the user customizing the build with environment variables (see below), +`python-build` builds Python with mostly default Configure options +to maintain the principle of the least surprise. + +The exceptions -- non-default options that are set by default -- are listed below: + +| Option/Behavior | Rationale | +|-----------------|-----------| +| `--enable-shared` is on by default. Pass `--disable-shared` to Configure options to override | The official CPython Docker image uses it. It's required to embed CPython. | +| argument to `--enable-universalsdk` is ignored and set to `/` | +| `--with-universal-archs` defaults to `universal2` on ARM64 architecture | the only dual-architecture Macs in use today are Apple Silicon which can only build that one | +| argument to `--enable-framework` is ignored and set to a specific value | CPython's build logic requires a very specific argument to avoid installing the `Applications` part globally | +| argument to `--enable-unicode` in non-MacOS is overridden to `ucs4` for 2.x-3.3 | +| `MACOSX_DEPLOYMENT_TARGET` defaults to the running MacOS version | + + +#### Integration with 3rd-party package ecosystems + +##### Homebrew + +In MacOS, Homebrew is used to find dependency packages if `brew` is found on `PATH`. + +Set `PYTHON_BUILD_SKIP_HOMEBREW` to avoid using it. + +When Homebrew is used, its `include` and `lib` paths are added to compiler search path (the latter is also set as `rpath`), +and also Python dependencies that are typically keg-only are searched for in the Homebrew installation and added individually. + +**NOTE:** Homebrew is not used in Linux by default because it's rolling-release which causes a problem. +Upgrading a Python dependency in Homebrew to a new major version (that `brew` does without warning) +would break all Pyenv-managed installations that depend on it. +You can use a [community plugin `fix-version`](https://github.com/pyenv/pyenv/wiki/Plugins#community-plugins) +to fix installations in such a case. + +##### Portage + +In FreeBSD, if `pkg` is on PATH, Ports are searched for some dependencies that Configure is known to not search for via `pkg-config`. +(Later versions of CPython search for more packages via `pkg-config` so this may eventually become redundant.) + + ### Special environment variables You can set certain environment variables to control the build process. From 05bb4f9a8dc19ba902c53566845291d3ceff47c2 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Mon, 19 Feb 2024 01:38:02 +0300 Subject: [PATCH 076/246] Use Homebrew in Linux if Pyenv is installed with Homebrew or PYTHON_BUILD_USE_HOMEBREW is set --- plugins/python-build/README.md | 9 ++- plugins/python-build/bin/python-build | 13 +++- plugins/python-build/test/build.bats | 104 +++++++++++++++++--------- 3 files changed, 86 insertions(+), 40 deletions(-) diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index f0826fc8..7fd92165 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -120,9 +120,11 @@ The exceptions -- non-default options that are set by default -- are listed belo ##### Homebrew -In MacOS, Homebrew is used to find dependency packages if `brew` is found on `PATH`. +Homebrew is used to find dependency packages if `brew` is found on `PATH`: +* In MacOS, or +* If the running Pyenv itself is installed with Homebrew -Set `PYTHON_BUILD_SKIP_HOMEBREW` to avoid using it. +Set `PYTHON_BUILD_USE_HOMEBREW` or `PYTHON_BUILD_SKIP_HOMEBREW` to override this default. When Homebrew is used, its `include` and `lib` paths are added to compiler search path (the latter is also set as `rpath`), and also Python dependencies that are typically keg-only are searched for in the Homebrew installation and added individually. @@ -155,7 +157,8 @@ You can set certain environment variables to control the build process. * `PYTHON_BUILD_SKIP_MIRROR`, if set, forces python-build to download packages from their original source URLs instead of using a mirror. * `PYTHON_BUILD_HTTP_CLIENT`, explicitly specify the HTTP client type to use. `aria2`, `curl` and `wget` are the supported values and by default, are searched in that order. -* `PYTHON_BUILD_SKIP_HOMEBREW`, if set, will not search for libraries installed by Homebrew in macOS. +* `PYTHON_BUILD_SKIP_HOMEBREW`, if set, will not search for libraries installed by Homebrew when it would normally will. +* `PYTHON_BUILD_USE_HOMEBREW`, if set, will search for libraries installed by Homebrew when it would normally not. * `PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA`, override the Homebrew OpenSSL formula to use. * `PYTHON_BUILD_ROOT` overrides the default location from where build definitions in `share/python-build/` are looked up. diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index ae4246f8..044defde 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -118,8 +118,17 @@ is_mac() { } can_use_homebrew() { - [ -z "$PYTHON_BUILD_SKIP_HOMEBREW" ] || return 1 - is_mac || return 1 + [[ -n "$PYTHON_BUILD_USE_HOMEBREW" && -n "$PYTHON_BUILD_SKIP_HOMEBREW" ]] && { + echo "error: mutually exclusive environment variables PYTHON_BUILD_USE_HOMEBREW and PYTHON_BUILD_SKIP_HOMEBREW are set" >&3 + exit 1 + } + [[ -n "$PYTHON_BUILD_USE_HOMEBREW" ]] && return 0 + [[ -n "$PYTHON_BUILD_SKIP_HOMEBREW" ]] && return 1 + is_mac && return 0 + # In Linux, if Pyenv itself is installed with Homebrew, + # we assume the user wants to take dependencies from there as well by default + command -v brew &>/dev/null && [[ $(abs_dirname "${BASH_SOURCE}") == "$(abs_dirname "$(brew --prefix 2>/dev/null ||true)")"/* ]] && return 0 + return 1 } # 9.1 -> 901 diff --git a/plugins/python-build/test/build.bats b/plugins/python-build/test/build.bats index f050e4b5..aacef79f 100644 --- a/plugins/python-build/test/build.bats +++ b/plugins/python-build/test/build.bats @@ -201,34 +201,6 @@ make install OUT } -@test "yaml is not linked from Homebrew in non-MacOS" { - cached_tarball "yaml-0.1.6" - cached_tarball "Python-3.6.2" - - for i in {1..10}; do stub uname '-s : echo Linux'; done - stub brew true; brew - stub_make_install - stub_make_install - - install_fixture definitions/needs-yaml - assert_success - - unstub uname - unstub brew - unstub make - - assert_build_log < Date: Tue, 27 Feb 2024 17:52:26 +0300 Subject: [PATCH 077/246] Set useful PS4 in python-build --- plugins/python-build/bin/python-build | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 044defde..a30f6697 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -19,7 +19,10 @@ PYTHON_BUILD_VERSION="20180424" OLDIFS="$IFS" set -E -[ -n "$PYENV_DEBUG" ] && set -x +[ -n "$PYENV_DEBUG" ] && { + export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' + set -x +} exec 3<&2 # preserve original stderr at fd 3 From 21c2a3dd6944bf2f0cb4e3bb8f217e9138aaaf55 Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Wed, 28 Feb 2024 23:58:25 +0800 Subject: [PATCH 078/246] =?UTF-8?q?Add=20miniconda3-24.1.2-0=20support=20f?= =?UTF-8?q?or=20py312=E3=80=81py311=E3=80=81py310=E3=80=81py39=20(#2915)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: binbjz --- .../python-build/miniconda3-3.10-24.1.2-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-24.1.2-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-24.1.2-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-24.1.2-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.1.2-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.1.2-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.1.2-0 new file mode 100644 index 00000000..1261a0bb --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-aarch64.sh#e560e737ac0e625dcc19ca2927457c2944434a61280daae2594632aca76d1422" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.1.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-s390x.sh#014fd09da9f7ecae040d586a6ff4218e508bf0e5e0232be6383ff37973a337c7" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-Linux-x86_64.sh#8eb5999c2f7ac6189690d95ae5ec911032fa6697ae4b34eb3235802086566d78" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-MacOSX-arm64.sh#01110da80119c11078d2b39a499b6dc086c5fd4b413f4b333d32feb3b03cbe7b" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.1.2-0-MacOSX-x86_64.sh#f078682fca26350717c1940650c227f9843fe9f3f0ecc87bf2665bccc5c64f9c" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.1.2-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.1.2-0 new file mode 100644 index 00000000..e8322878 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-aarch64.sh#1e046ef2d9d47289db2491f103c81b0b4baf943a9234ac59bd5bca076c881d98" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.1.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-s390x.sh#0489909051fd9e2c9addfa5fbd531ccb7f8f2463ac47376b8854e5a09b1c4011" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-Linux-x86_64.sh#3f2e5498e550a6437f15d9cc8020d52742d0ba70976ee8fce4f0daefa3992d2e" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-MacOSX-arm64.sh#b5c4f646144fa4760bd5f6114ff2e6b49a3ef7c57b993f569adceea784f21a52" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.1.2-0-MacOSX-x86_64.sh#3b26c0867561d0988040193c8efd9f53ca922026f735367436aa05b467b1f187" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.1.2-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.1.2-0 new file mode 100644 index 00000000..dab27cd0 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-aarch64.sh#942a057a52ec99f0fca4f413b87b332f6e61fad95c05fa7cabc003ae0b4471de" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.1.2-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-s390x.sh#7ee6a3c41a825eca3b1c9e3c7155c67f7c26e31a75d7dc4f78f75a4c438e3009" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-x86_64.sh#b978856ec3c826eb495b60e3fffe621f670c101150ebcbdeede4f961f22dc438" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-MacOSX-arm64.sh#1c277b1ec046fd1b628390994e3fa3dbac0e364f44cd98b915daaa67a326c66a" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-MacOSX-x86_64.sh#bc45a2ceea9341579532847cc9f29a9769d60f12e306bba7f0de6ad5acdd73e9" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.1.2-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.1.2-0 new file mode 100644 index 00000000..3e03e031 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.1.2-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-aarch64.sh#b3e7d8ad4a4c9106594b268ab1cd9494ce982eaf7734bb2cd13a47e14e92a43e" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.1.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-Linux-s390x.sh#c1e5b7cee62b465a919b88a9c5658c426c6633f1fbcb568d2cff36a13aef6b97" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.1.2-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.1.2-0-Linux-x86_64.sh#b978856ec3c826eb495b60e3fffe621f670c101150ebcbdeede4f961f22dc438" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.1.2-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-MacOSX-arm64.sh#2a7e44373bdf47caae991ff8d7d275a2ded51ed0e8e457c7edc9ecd45e48cda4" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.1.2-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.1.2-0-MacOSX-x86_64.sh#d4e81df5beaa73dbbb9e1e91065e8f8222e9a9d44a2e7271aedd6e4a5054c541" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From c5eae0f2636b4e4366343100f62ec4d4805d30b1 Mon Sep 17 00:00:00 2001 From: cuinix <65650185+cuinix@users.noreply.github.com> Date: Thu, 7 Mar 2024 05:15:41 +0800 Subject: [PATCH 079/246] minor grammar fix in libffi backport patch in 2.5.x (#2922) Signed-off-by: cuinix <915115094@qq.com> --- .../python-build/patches/2.5.0/Python-2.5/004_osx_libffi.patch | 2 +- .../patches/2.5.1/Python-2.5.1/004_osx_libffi.patch | 2 +- .../patches/2.5.2/Python-2.5.2/004_osx_libffi.patch | 2 +- .../patches/2.5.3/Python-2.5.3/004_osx_libffi.patch | 2 +- .../patches/2.5.4/Python-2.5.4/004_osx_libffi.patch | 2 +- .../patches/2.5.5/Python-2.5.5/004_osx_libffi.patch | 2 +- .../patches/2.5.6/Python-2.5.6/004_osx_libffi.patch | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/004_osx_libffi.patch index 9c3ababc..83184323 100644 --- a/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/004_osx_libffi.patch +++ b/plugins/python-build/share/python-build/patches/2.5.0/Python-2.5/004_osx_libffi.patch @@ -197,7 +197,7 @@ index 0000000..1fc2747 +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + -+To call the the function using the initialized ffi_cif, use the ++To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); diff --git a/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/004_osx_libffi.patch index 9c3ababc..83184323 100644 --- a/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/004_osx_libffi.patch +++ b/plugins/python-build/share/python-build/patches/2.5.1/Python-2.5.1/004_osx_libffi.patch @@ -197,7 +197,7 @@ index 0000000..1fc2747 +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + -+To call the the function using the initialized ffi_cif, use the ++To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); diff --git a/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/004_osx_libffi.patch index 9c3ababc..83184323 100644 --- a/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/004_osx_libffi.patch +++ b/plugins/python-build/share/python-build/patches/2.5.2/Python-2.5.2/004_osx_libffi.patch @@ -197,7 +197,7 @@ index 0000000..1fc2747 +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + -+To call the the function using the initialized ffi_cif, use the ++To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); diff --git a/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/004_osx_libffi.patch index 9c3ababc..83184323 100644 --- a/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/004_osx_libffi.patch +++ b/plugins/python-build/share/python-build/patches/2.5.3/Python-2.5.3/004_osx_libffi.patch @@ -197,7 +197,7 @@ index 0000000..1fc2747 +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + -+To call the the function using the initialized ffi_cif, use the ++To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); diff --git a/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/004_osx_libffi.patch index 9c3ababc..83184323 100644 --- a/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/004_osx_libffi.patch +++ b/plugins/python-build/share/python-build/patches/2.5.4/Python-2.5.4/004_osx_libffi.patch @@ -197,7 +197,7 @@ index 0000000..1fc2747 +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + -+To call the the function using the initialized ffi_cif, use the ++To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); diff --git a/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/004_osx_libffi.patch index 9c3ababc..83184323 100644 --- a/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/004_osx_libffi.patch +++ b/plugins/python-build/share/python-build/patches/2.5.5/Python-2.5.5/004_osx_libffi.patch @@ -197,7 +197,7 @@ index 0000000..1fc2747 +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + -+To call the the function using the initialized ffi_cif, use the ++To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); diff --git a/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/004_osx_libffi.patch b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/004_osx_libffi.patch index 9c3ababc..83184323 100644 --- a/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/004_osx_libffi.patch +++ b/plugins/python-build/share/python-build/patches/2.5.6/Python-2.5.6/004_osx_libffi.patch @@ -197,7 +197,7 @@ index 0000000..1fc2747 +Before making the call, the VALUES vector should be initialized +with pointers to the appropriate argument values. + -+To call the the function using the initialized ffi_cif, use the ++To call the function using the initialized ffi_cif, use the +ffi_call function: + +void ffi_call(ffi_cif *cif, void *fn, void *rvalue, void **avalues); From 0167890c8c8e66bb1aaa579725a27279d31afb96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Fri, 15 Mar 2024 16:53:11 -0600 Subject: [PATCH 080/246] Add CPython 3.13.0a5 (#2924) --- plugins/python-build/share/python-build/3.13.0a3 | 9 --------- plugins/python-build/share/python-build/3.13.0a5 | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.13.0a3 create mode 100644 plugins/python-build/share/python-build/3.13.0a5 diff --git a/plugins/python-build/share/python-build/3.13.0a3 b/plugins/python-build/share/python-build/3.13.0a3 deleted file mode 100644 index 4ca10241..00000000 --- a/plugins/python-build/share/python-build/3.13.0a3 +++ /dev/null @@ -1,9 +0,0 @@ -prefer_openssl3 -export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl -install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline -if has_tar_xz_support; then - install_package "Python-3.13.0a3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a3.tar.xz#20784c8304eb1c69c80f966ebdf0775be2e37e23df3b62461eec12a85dcf7ead" standard verify_py313 copy_python_gdb ensurepip -else - install_package "Python-3.13.0a3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a3.tgz#9c7c2b42a20127816f9403723bfc88d1566f47dac0c46f50492f7ff8db646d8f" standard verify_py313 copy_python_gdb ensurepip -fi diff --git a/plugins/python-build/share/python-build/3.13.0a5 b/plugins/python-build/share/python-build/3.13.0a5 new file mode 100644 index 00000000..c6736dd4 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0a5 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.0a5" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a5.tar.xz#1e89b5355183e7c898a5a01b2f601728fe49fdb89d9c9781f13360847aaefa62" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.0a5" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a5.tgz#672dc36e775e0775a15042ce7f9959986745fa44be7519b8847b26da0022e3fa" standard verify_py313 copy_python_gdb ensurepip +fi From e41f7c9ee419aafcd1e84545aa57179cbe9b73d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:41:58 -0600 Subject: [PATCH 081/246] Add CPython 3.8.19 and 3.9.19 (#2929) --- plugins/python-build/share/python-build/3.8.19 | 12 ++++++++++++ plugins/python-build/share/python-build/3.9.19 | 12 ++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.8.19 create mode 100644 plugins/python-build/share/python-build/3.9.19 diff --git a/plugins/python-build/share/python-build/3.8.19 b/plugins/python-build/share/python-build/3.8.19 new file mode 100644 index 00000000..5e29edbc --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.19 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.19" "https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tar.xz#d2807ac69f69b84fd46a0b93bbd02a4fa48d3e70f4b2835ff0f72a2885040076" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.19" "https://www.python.org/ftp/python/3.8.19/Python-3.8.19.tgz#c7fa55a36e5c7a19ec37d8f90f60a2197548908c9ac8b31e7c0dbffdd470eeac" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.19 b/plugins/python-build/share/python-build/3.9.19 new file mode 100644 index 00000000..b6c1e5ba --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.19 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.19" "https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tar.xz#d4892cd1618f6458cb851208c030df1482779609d0f3939991bd38184f8c679e" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.19" "https://www.python.org/ftp/python/3.9.19/Python-3.9.19.tgz#f5f9ec8088abca9e399c3b62fd8ef31dbd2e1472c0ccb35070d4d136821aaf71" standard verify_py39 copy_python_gdb ensurepip +fi From 7deace666634bfd46e80742202852acb2ebecaea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20=C5=A0im=C3=A1=C4=8Dek?= Date: Tue, 19 Mar 2024 21:43:01 +0100 Subject: [PATCH 082/246] Add GraalPy 24.0.0 (#2928) --- .../share/python-build/graalpy-24.0.0 | 64 +++++++++++++++++++ .../python-build/graalpy-community-24.0.0 | 54 ++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-24.0.0 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.0.0 diff --git a/plugins/python-build/share/python-build/graalpy-24.0.0 b/plugins/python-build/share/python-build/graalpy-24.0.0 new file mode 100644 index 00000000..d71e70fc --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.0.0 @@ -0,0 +1,64 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.0.0' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="f0d194dea76da26093b9b01b78c0fcabbd8714640b08fcd2a9b05b9ded3e2039" + ;; +"linux-aarch64" ) + checksum="5bf0fd9d115c3ecd6bfb89a2fac7b9ba9343841c3928d14eac471b9b1ad1266e" + ;; +"macos-amd64" ) + checksum="1e2e51ea618bd6f6fe9a0248486b5962f6258193249c0657dc0480fd2b92d772" + ;; +"macos-aarch64" ) + checksum="d5597711839a41506beb129f9d8015f8997a1db1e0c79972636834d955d4ef61" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.0.0 b/plugins/python-build/share/python-build/graalpy-community-24.0.0 new file mode 100644 index 00000000..c2323169 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.0.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.0.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="a77892d8d6b897b70b4226aa1b6abc8c41e824ae98d727429542b0157ae6f8d9" + ;; +"linux-aarch64" ) + checksum="201e2bad0ed59efc89654a77ae1634302111b3ffb9af53f9ee63ab43b735e5c3" + ;; +"macos-amd64" ) + checksum="7c816beb8c8b46ee0de60861f739c274efbc744304aa9034bffbd0319f13701d" + ;; +"macos-aarch64" ) + checksum="7f5540a28cf5c2c628cd003c3eb86bfa0a07175dae7d9b6528b40c44c4927402" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip From 7e550e31f749ce3cda067644de44b18be761470b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:26:57 -0600 Subject: [PATCH 083/246] Add CPython 3.10.14 (#2930) --- plugins/python-build/share/python-build/3.10.14 | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.10.14 diff --git a/plugins/python-build/share/python-build/3.10.14 b/plugins/python-build/share/python-build/3.10.14 new file mode 100644 index 00000000..0b062fec --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.14 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.14" "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tar.xz#9c50481faa8c2832329ba0fc8868d0a606a680fc4f60ec48d26ce8e076751fda" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.14" "https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz#cefea32d3be89c02436711c95a45c7f8e880105514b78680c14fe76f5709a0f6" standard verify_py310 copy_python_gdb ensurepip +fi From 51a626c1eadf91d800ecfe393832cf861443b3e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9sar=20Rom=C3=A1n?= Date: Sat, 30 Mar 2024 02:57:02 -0700 Subject: [PATCH 084/246] Add Jython 2.7.3 (#2936) --- .../python-build/share/python-build/jython-2.7.3 | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 plugins/python-build/share/python-build/jython-2.7.3 diff --git a/plugins/python-build/share/python-build/jython-2.7.3 b/plugins/python-build/share/python-build/jython-2.7.3 new file mode 100644 index 00000000..8e5c7cd8 --- /dev/null +++ b/plugins/python-build/share/python-build/jython-2.7.3 @@ -0,0 +1,14 @@ +require_java +unrequire_python27 +install_jar "jython-2.7.3" "https://repo1.maven.org/maven2/org/python/jython-installer/2.7.3/jython-installer-2.7.3.jar#3ffc25c5257d2028b176912a4091fe048c45c7d98218e52d7ce3160a62fdc9fc" jython + +case "$(pypy_architecture 2>/dev/null || true)" in +"osx64"|"win32" ) + # Jython does not seem to work properly on OSX/windows unless JAVA_HOME is set + if [ -z "${JAVA_HOME+defined}" ]; then + colorize 1 "WARNING: " + echo "Please ensure that your JAVA_HOME environment variable is set correctly!" + echo "See http://bugs.jython.org/issue2346 for details." + fi + ;; +esac From 465b8ee74a59766fde08867ba5686c4f41660589 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Tue, 2 Apr 2024 08:49:31 -0600 Subject: [PATCH 085/246] Add CPython 3.11.9 (#2938) --- plugins/python-build/share/python-build/3.11.9 | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.11.9 diff --git a/plugins/python-build/share/python-build/3.11.9 b/plugins/python-build/share/python-build/3.11.9 new file mode 100644 index 00000000..96f734c8 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.9 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.9" "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tar.xz#9b1e896523fc510691126c864406d9360a3d1e986acbda59cda57b5abda45b87" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.9" "https://www.python.org/ftp/python/3.11.9/Python-3.11.9.tgz#e7de3240a8bc2b1e1ba5c81bf943f06861ff494b69fda990ce2722a504c6153d" standard verify_py311 copy_python_gdb ensurepip +fi From 5b4d5a32d343dcae5e7b3f1a09850312f89ba868 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 3 Apr 2024 18:28:21 +0300 Subject: [PATCH 086/246] remove duplication --- plugins/python-build/test/stubs/stub | 4 ---- 1 file changed, 4 deletions(-) diff --git a/plugins/python-build/test/stubs/stub b/plugins/python-build/test/stubs/stub index b940bedb..a3b0f33e 100755 --- a/plugins/python-build/test/stubs/stub +++ b/plugins/python-build/test/stubs/stub @@ -100,10 +100,6 @@ if [ -n "${!_STUB_END}" ]; then rm -f "${!_STUB_RUN}" rm -f "${!_STUB_LOG}" - # Clean up the run file. - rm -f "${!_STUB_RUN}" - rm -f "${!_STUB_LOG}" - # Return the result. exit "${!_STUB_RESULT}" From b80d5fd28d7477c0b27725544d46b79b14f11357 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 7 Apr 2024 20:48:40 +0300 Subject: [PATCH 087/246] 2.3.37 --- CHANGELOG.md | 15 +++++++++++++++ libexec/pyenv---version | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1ca960f..9046c7ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Version History +## Release v2.3.37 +* Add CPython 3.13.0a4 by @saaketp in https://github.com/pyenv/pyenv/pull/2903 +* Handle the case where `pyenv-commands --sh` returns nothing by @aphedges in https://github.com/pyenv/pyenv/pull/2908 +* Document default build configuration customizations by @native-api in https://github.com/pyenv/pyenv/pull/2911 +* Use Homebrew in Linux if Pyenv is installled with Homebrew by @native-api in https://github.com/pyenv/pyenv/pull/2906 +* Add miniforge and mambaforge 22.11.1-3, 22.11.1-4, 23.1.0-0 to 23.11.0-0 by @aphedges in https://github.com/pyenv/pyenv/pull/2909 +* Add miniconda3-24.1.2 by @binbjz in https://github.com/pyenv/pyenv/pull/2915 +* Minor grammar fix in libffi backport patch in 2.5.x by @cuinix in https://github.com/pyenv/pyenv/pull/2922 +* Add CPython 3.13.0a5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2924 +* Add CPython 3.8.19 and 3.9.19 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2929 +* Add GraalPy 24.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/2928 +* Add CPython 3.10.14 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2930 +* Add Jython 2.7.3 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/2936 +* Add CPython 3.11.9 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2938 + ## Release v2.3.36 * Add a Dependabot config to auto-update GitHub action versions by @kurtmckee in https://github.com/pyenv/pyenv/pull/2863 * Bump the github-actions group with 1 update by @dependabot in https://github.com/pyenv/pyenv/pull/2864 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 39691f94..cd3a8f26 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.36" +version="2.3.37" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 961882403a0b2f1e0d673b88f893d021f1882ea6 Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 7 Apr 2024 21:22:53 +0300 Subject: [PATCH 088/246] Add anaconda 2024.02 (#2939) --- .../share/python-build/anaconda3-2024.02-1 | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 plugins/python-build/share/python-build/anaconda3-2024.02-1 diff --git a/plugins/python-build/share/python-build/anaconda3-2024.02-1 b/plugins/python-build/share/python-build/anaconda3-2024.02-1 new file mode 100644 index 00000000..498c79ed --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2024.02-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2024.02-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-aarch64.sh#28c5bed6fba84f418516e41640c7937514aabd55e929a8f66937c737303c7bba" "anaconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2024.02-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-s390x.sh#3e2e8b17ea9a5caafd448f52e01435998b2e1ce102040a924d5bd6e05a1d735b" "anaconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2024.02-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-Linux-x86_64.sh#c536ddb7b4ba738bddbd4e581b29308cb332fa12ae3fa2cd66814bd735dff231" "anaconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2024.02-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-MacOSX-arm64.sh#14a1c80af18c2c2e743e63cdb41228cd554a3fdb250563b6978348c80b6860f6" "anaconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2024.02-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.02-1-MacOSX-x86_64.sh#944aee9b90f7d8a2a997d0337cb37219757f22e76c10de38c7c68191c6b5b226" "anaconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 21eef94ea0963e408c5926fdbaf2867ffe21807e Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 7 Apr 2024 21:28:30 +0300 Subject: [PATCH 089/246] 2.4.0 --- CHANGELOG.md | 3 ++- libexec/pyenv---version | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9046c7ec..ecf49821 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Version History -## Release v2.3.37 +## Release v2.4.0 * Add CPython 3.13.0a4 by @saaketp in https://github.com/pyenv/pyenv/pull/2903 * Handle the case where `pyenv-commands --sh` returns nothing by @aphedges in https://github.com/pyenv/pyenv/pull/2908 * Document default build configuration customizations by @native-api in https://github.com/pyenv/pyenv/pull/2911 @@ -14,6 +14,7 @@ * Add CPython 3.10.14 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2930 * Add Jython 2.7.3 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/2936 * Add CPython 3.11.9 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2938 +* Add anaconda 2024.02 by @native-api in https://github.com/pyenv/pyenv/pull/2939 ## Release v2.3.36 * Add a Dependabot config to auto-update GitHub action versions by @kurtmckee in https://github.com/pyenv/pyenv/pull/2863 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index cd3a8f26..e077693f 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.3.37" +version="2.4.0" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From e5997ef66b730bbcb281dcfcf873b0162c405256 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Tue, 9 Apr 2024 13:28:42 -0600 Subject: [PATCH 090/246] Add CPython 3.12.3 (#2941) --- plugins/python-build/share/python-build/3.12.3 | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.12.3 diff --git a/plugins/python-build/share/python-build/3.12.3 b/plugins/python-build/share/python-build/3.12.3 new file mode 100644 index 00000000..2228238d --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.3 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.3" "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tar.xz#56bfef1fdfc1221ce6720e43a661e3eb41785dd914ce99698d8c7896af4bdaa1" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.3" "https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz#a6b9459f45a6ebbbc1af44f5762623fa355a0c87208ed417628b379d762dddb0" standard verify_py312 copy_python_gdb ensurepip +fi From e1f07da73ae09d6fc0b0322e4f577679dc7c7ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Tue, 9 Apr 2024 14:38:07 -0600 Subject: [PATCH 091/246] Add CPython 3.13.0a6 (#2942) --- .../python-build/share/python-build/{3.13.0a5 => 3.13.0a6} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename plugins/python-build/share/python-build/{3.13.0a5 => 3.13.0a6} (57%) diff --git a/plugins/python-build/share/python-build/3.13.0a5 b/plugins/python-build/share/python-build/3.13.0a6 similarity index 57% rename from plugins/python-build/share/python-build/3.13.0a5 rename to plugins/python-build/share/python-build/3.13.0a6 index c6736dd4..ffb90a06 100644 --- a/plugins/python-build/share/python-build/3.13.0a5 +++ b/plugins/python-build/share/python-build/3.13.0a6 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.13.0a5" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a5.tar.xz#1e89b5355183e7c898a5a01b2f601728fe49fdb89d9c9781f13360847aaefa62" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0a6" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a6.tar.xz#4bef393d72b281acf81d39d7455f00036e866193dfa21a4ed3970fd0f4cba048" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.13.0a5" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a5.tgz#672dc36e775e0775a15042ce7f9959986745fa44be7519b8847b26da0022e3fa" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0a6" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a6.tgz#e24608288f4ff84d042efba1f3aff38e3940b0091d677056e245822ef878c83c" standard verify_py313 copy_python_gdb ensurepip fi From 3ff54e89bc82687ff880d1e2d5a37f101cbfa63e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Thu, 25 Apr 2024 12:51:58 -0600 Subject: [PATCH 092/246] Add PyPy v7.3.16 (#2948) --- .../share/python-build/pypy2.7-7.3.16 | 81 +++++++++++++++++++ .../share/python-build/pypy2.7-7.3.16-src | 14 ++++ .../share/python-build/pypy3.10-7.3.16 | 81 +++++++++++++++++++ .../share/python-build/pypy3.10-7.3.16-src | 14 ++++ .../share/python-build/pypy3.9-7.3.16 | 81 +++++++++++++++++++ .../share/python-build/pypy3.9-7.3.16-src | 14 ++++ 6 files changed, 285 insertions(+) create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.16 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.16-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.16 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.16-src create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.16 create mode 100644 plugins/python-build/share/python-build/pypy3.9-7.3.16-src diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.16 b/plugins/python-build/share/python-build/pypy2.7-7.3.16 new file mode 100644 index 00000000..b77482f2 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.16 @@ -0,0 +1,81 @@ +VERSION='7.3.16' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=be44e65dd8c00d2388b2580dbe2af6a5179f951a8f4979efc74360f92f3c7e96 +linux32_hash=a19712d7a6bd4f6d113e352c5271803c583b5129b76a357d387b1fa85204f8e5 +linux64_hash=04b2fceb712d6f811274825b8a471ee392d3d1b53afc83eb3f42439ce00d8e07 +osarm64_hash=9cc13f4d6c4096820e1e0ddabb3959f853e45150ce0166a39aa23867e99f0145 +osx64_hash=e8744c1cef8b9e4eb2d2b6b368ed19a1c5cde482c7ef750f2d9f0807bb77fd1c +s390x_hash=09eb70b932e6aac484cf4b5f2de5845f71589f2cbb53e5ed37a497613b43cd53 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.16-src b/plugins/python-build/share/python-build/pypy2.7-7.3.16-src new file mode 100644 index 00000000..fdf2005a --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.16-src @@ -0,0 +1,14 @@ +VERSION='7.3.16' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=43721cc0c397f0f3560b325c20c70b11f7c76c27910d3df09f8418cec4f9c2ad + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.16 b/plugins/python-build/share/python-build/pypy3.10-7.3.16 new file mode 100644 index 00000000..4f7085e3 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.16 @@ -0,0 +1,81 @@ +VERSION='7.3.16' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=fc720999bc5050e1d3706b3b6445e695cf42bfc71ebc7c88ed6bb88828b1d385 +linux32_hash=0df48aa780159e879ac89a805d143e4a6cd1b842f98046f5a3f865814bfaa2a4 +linux64_hash=404e6180d6caf9258eaab0c02c72018e9aa8eb03ab9094a0ff17ee5e3b265ac1 +osarm64_hash=6c003376667a95c7a228544649677b9927b8210d6444b901817aad24b8719b93 +osx64_hash=490f2c6ba2489f405444f3b4ad42166da6e2eb73489a9535b206067eaaf21737 +s390x_hash=af97efe498a209ba18c7bc7d084164a9907fb3736588b6864955177e19d5216a + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.16-src b/plugins/python-build/share/python-build/pypy3.10-7.3.16-src new file mode 100644 index 00000000..fede5826 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.16-src @@ -0,0 +1,14 @@ +VERSION='7.3.16' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=4a3a3177d0a1f51d59982bb981d1d485403bda3419d5437b9e077f55f59424ff + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.16 b/plugins/python-build/share/python-build/pypy3.9-7.3.16 new file mode 100644 index 00000000..afa539fd --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.16 @@ -0,0 +1,81 @@ +VERSION='7.3.16' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +aarch64_hash=de3f2ed3581b30555ac0dd3e4df78a262ec736a36fb2e8f28259f8539b278ef4 +linux32_hash=583b6d6dd4e8c07cbc04da04a7ec2bdfa6674825289c2378c5e018d5abe779ea +linux64_hash=16f9c5b808c848516e742986e826b833cdbeda09ad8764e8704595adbe791b23 +osarm64_hash=88f824e7a2d676440d09bc90fc959ae0fd3557d7e2f14bfbbe53d41d159a47fe +osx64_hash=fda015431621e7e5aa16359d114f2c45a77ed936992c1efff86302e768a6b21c +s390x_hash=7a56ebb27dba3110dc1ff52d8e0449cdb37fe5c2275f7faf11432e4e164833ba + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + 's390x' ) + hash="${s390x_hash}" + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.9-7.3.16-src b/plugins/python-build/share/python-build/pypy3.9-7.3.16-src new file mode 100644 index 00000000..b8c0cc63 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.9-7.3.16-src @@ -0,0 +1,14 @@ +VERSION='7.3.16' +PYVER='3.9' + +# https://www.pypy.org/checksums.html +hash=5b75af3f8e76041e79c1ef5ce22ce63f8bd131733e9302081897d8f650e81843 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' From 8c7fc98c4f025e005713a285c4bc43ab8d6c9d09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Thu, 9 May 2024 03:58:17 -0600 Subject: [PATCH 093/246] Add CPython 3.14-dev, update 3.13-dev (#2960) * Add CPython 3.14-dev * Update 3.13-dev branch to 3.13 * Use OpenSSL 3.3.0 --- plugins/python-build/bin/python-build | 5 +++++ plugins/python-build/share/python-build/3.13-dev | 4 ++-- plugins/python-build/share/python-build/3.14-dev | 7 +++++++ 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 plugins/python-build/share/python-build/3.14-dev diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index a30f6697..c55648bb 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -2021,6 +2021,11 @@ build_package_verify_py313() { build_package_verify_py312 "$1" "${2:-3.13}" } +# Post-install check for Python 3.14.x +build_package_verify_py314() { + build_package_verify_py313 "$1" "${2:-3.13}" +} + # Post-install check for Python 3.x rolling release scripts # XXX: Will need splitting into project-specific ones if there emerge # multiple rolling-release scripts with different checks needed diff --git a/plugins/python-build/share/python-build/3.13-dev b/plugins/python-build/share/python-build/3.13-dev index 8c4740e4..088f8927 100644 --- a/plugins/python-build/share/python-build/3.13-dev +++ b/plugins/python-build/share/python-build/3.13-dev @@ -2,6 +2,6 @@ prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 -install_package "openssl-3.1.2" "https://www.openssl.org/source/openssl-3.1.2.tar.gz#a0ce69b8b97ea6a35b96875235aa453b966ba3cba8af2de23657d8b6767d6539" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.3.0" "https://www.openssl.org/source/openssl-3.3.0.tar.gz#53e66b043322a606abf0087e7699a0e033a37fa13feb9742df35c3a33b18fb02" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline -install_git "Python-3.13-dev" "https://github.com/python/cpython" main standard verify_py313 copy_python_gdb ensurepip +install_git "Python-3.13-dev" "https://github.com/python/cpython" 3.13 standard verify_py313 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.14-dev b/plugins/python-build/share/python-build/3.14-dev new file mode 100644 index 00000000..9ce786be --- /dev/null +++ b/plugins/python-build/share/python-build/3.14-dev @@ -0,0 +1,7 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 +install_package "openssl-3.3.0" "https://www.openssl.org/source/openssl-3.3.0.tar.gz#53e66b043322a606abf0087e7699a0e033a37fa13feb9742df35c3a33b18fb02" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline +install_git "Python-3.14-dev" "https://github.com/python/cpython" main standard verify_py314 copy_python_gdb ensurepip From ef8daeaea714880b15303629bf89db154e71c644 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Thu, 9 May 2024 05:13:45 -0600 Subject: [PATCH 094/246] Add CPython 3.13.0b1 (#2959) * Add CPython 3.13.0b1 * Use OpenSSL 3.3.0 --------- Co-authored-by: Ivan Pozdeev --- plugins/python-build/share/python-build/3.13.0a6 | 9 --------- plugins/python-build/share/python-build/3.13.0b1 | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.13.0a6 create mode 100644 plugins/python-build/share/python-build/3.13.0b1 diff --git a/plugins/python-build/share/python-build/3.13.0a6 b/plugins/python-build/share/python-build/3.13.0a6 deleted file mode 100644 index ffb90a06..00000000 --- a/plugins/python-build/share/python-build/3.13.0a6 +++ /dev/null @@ -1,9 +0,0 @@ -prefer_openssl3 -export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.2.1" "https://www.openssl.org/source/openssl-3.2.1.tar.gz#83c7329fe52c850677d75e5d0b0ca245309b97e8ecbcfdc1dfdc4ab9fac35b39" mac_openssl --if has_broken_mac_openssl -install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline -if has_tar_xz_support; then - install_package "Python-3.13.0a6" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a6.tar.xz#4bef393d72b281acf81d39d7455f00036e866193dfa21a4ed3970fd0f4cba048" standard verify_py313 copy_python_gdb ensurepip -else - install_package "Python-3.13.0a6" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0a6.tgz#e24608288f4ff84d042efba1f3aff38e3940b0091d677056e245822ef878c83c" standard verify_py313 copy_python_gdb ensurepip -fi diff --git a/plugins/python-build/share/python-build/3.13.0b1 b/plugins/python-build/share/python-build/3.13.0b1 new file mode 100644 index 00000000..15e59218 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0b1 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.0" "https://www.openssl.org/source/openssl-3.3.0.tar.gz#53e66b043322a606abf0087e7699a0e033a37fa13feb9742df35c3a33b18fb02" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.0b1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b1.tar.xz#ba716ac56b039b545ad4a90ce586a57aa97869364553746ef2445728ceec198e" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.0b1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b1.tgz#3ff81ce29574296976dc42edfed52d39faf7ae583721a428cfc537a70bbaae16" standard verify_py313 copy_python_gdb ensurepip +fi From aabaa892438d05d96775042a129b1580fcd60105 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Thu, 9 May 2024 14:31:11 +0300 Subject: [PATCH 095/246] 2.4.1 --- CHANGELOG.md | 7 +++++++ libexec/pyenv---version | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ecf49821..92d45ecc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Version History +## Release v2.4.1 +* Add CPython 3.12.3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2941 +* Add CPython 3.13.0a6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2942 +* Add PyPy v7.3.16 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2948 +* Add CPython 3.14-dev, update 3.13-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2960 +* Add CPython 3.13.0b1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2959 + ## Release v2.4.0 * Add CPython 3.13.0a4 by @saaketp in https://github.com/pyenv/pyenv/pull/2903 * Handle the case where `pyenv-commands --sh` returns nothing by @aphedges in https://github.com/pyenv/pyenv/pull/2908 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index e077693f..ec33fe11 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.0" +version="2.4.1" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 037ba4516bd68b9a3add01ce84e42b0614ecfb0e Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Thu, 23 May 2024 14:45:40 +0200 Subject: [PATCH 096/246] add script to install graalpy ea builds --- .../share/python-build/graalpy-dev | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-dev diff --git a/plugins/python-build/share/python-build/graalpy-dev b/plugins/python-build/share/python-build/graalpy-dev new file mode 100644 index 00000000..3c5aeebd --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-dev @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. + +JSON_URL=https://raw.githubusercontent.com/graalvm/graal-languages-ea-builds/main/graalpy/versions/latest-ea.json + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "Release builds of the GraalVM Community Edition variant of GraalPy are available, with names starting with graalpy-community-" && echo + +json=`http get "$JSON_URL"` +version=`expr "$json" : '{.*"version":[^"]*"\([^"]*\)'` +base_url=`expr "$json" : '{.*"download_base_url":[^"]*"\([^"]*\)'` + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + ;; +"linux-aarch64" ) + ;; +"macos-amd64" ) + ;; +"macos-aarch64" ) + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +url="${base_url}/graalpy-${version}-${graalpy_arch}.tar.gz" + +install_package "graalpy-${version}" "${url}" "copy" ensurepip From 948f53f6d838eb4ebe2770d19a43e2eb76e425ed Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 24 May 2024 20:34:25 +0300 Subject: [PATCH 097/246] CI: run builds in debug mode since we're only interested in the output when something goes wrong --- .github/workflows/macos_build.yml | 2 +- .github/workflows/ubuntu_build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index 3f299f80..6622b6a3 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -32,7 +32,7 @@ jobs: run: | echo $PYENV_ROOT echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH - bin/pyenv install -v ${{ matrix.python-version }} + bin/pyenv --debug install ${{ matrix.python-version }} bin/pyenv global ${{ matrix.python-version }} bin/pyenv rehash - run: python --version diff --git a/.github/workflows/ubuntu_build.yml b/.github/workflows/ubuntu_build.yml index e3951d3c..dd389219 100644 --- a/.github/workflows/ubuntu_build.yml +++ b/.github/workflows/ubuntu_build.yml @@ -34,7 +34,7 @@ jobs: run: | echo $PYENV_ROOT echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH - bin/pyenv install -v ${{ matrix.python-version }} + bin/pyenv --debug install ${{ matrix.python-version }} bin/pyenv global ${{ matrix.python-version }} bin/pyenv rehash - run: python --version From 0e0ca0966bf61dc89de376537a2fcc8492d70347 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 24 May 2024 20:36:43 +0300 Subject: [PATCH 098/246] CI: Run changed scripts in debug mode also --- .github/workflows/modified_scripts_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml index 0beef58e..79dbdb89 100644 --- a/.github/workflows/modified_scripts_build.yml +++ b/.github/workflows/modified_scripts_build.yml @@ -49,7 +49,7 @@ jobs: fi - run: | #build - pyenv install -v ${{ matrix.python-version }} + pyenv --debug install ${{ matrix.python-version }} pyenv global ${{ matrix.python-version }} # Micropython doesn't support --version - run: | From 98c5b711dc0ada63ab7d47f98144a3cddda0b997 Mon Sep 17 00:00:00 2001 From: Tim Felgentreff Date: Mon, 27 May 2024 10:50:03 +0200 Subject: [PATCH 099/246] fix http_get_aria to cat the correct file --- plugins/python-build/bin/python-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index c55648bb..923fcc62 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -397,7 +397,7 @@ http_get_aria2c() { fi if aria2c --allow-overwrite=true --no-conf=true -d "${dir_out}" -o "${out}" ${ARIA2_OPTS} "$1" >&4; then - [ -n "$2" ] || cat "${out}" + [ -n "$2" ] || cat "${dir_out:-.}/${out}" else false fi From 8a464cfed10ffe1f67e71c32929c82fb2b2a0f1a Mon Sep 17 00:00:00 2001 From: Younes Askour Date: Sat, 1 Jun 2024 20:13:57 +0100 Subject: [PATCH 100/246] Correct the Explanation of PATH Variable Lookup (#2975) This PR corrects a small but important detail in the documentation regarding how the system searches for executable files. The original text incorrectly stated that the operating system performs this search. The corrected text clarifies that it is actually the shell that performs the search. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 89adb548..279cf8a5 100644 --- a/README.md +++ b/README.md @@ -86,7 +86,7 @@ to the correct Python installation. ### Understanding PATH -When you run a command like `python` or `pip`, your operating system +When you run a command like `python` or `pip`, your shell (bash / zshrc / ...) searches through a list of directories to find an executable file with that name. This list of directories lives in an environment variable called `PATH`, with each directory in the list separated by a colon: From 4ab9b3710bea9d114e3e3742ee8cd3259de9dcf8 Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 2 Jun 2024 15:24:00 +0300 Subject: [PATCH 101/246] Document PYTHON_BUILD_CURL_OPTS, PYTHON_BUILD_WGET_OPTS, PYTHON_BUILD_ARIA2_OPTS (#2976) [no ci] --- README.md | 1 - plugins/python-build/README.md | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 279cf8a5..78b13516 100644 --- a/README.md +++ b/README.md @@ -675,7 +675,6 @@ name | default | description `PYENV_DEBUG` | | Outputs debug information.
Also as: `pyenv --debug ` `PYENV_HOOK_PATH` | [_see wiki_][hooks] | Colon-separated list of paths searched for pyenv hooks. `PYENV_DIR` | `$PWD` | Directory to start searching for `.python-version` files. -`PYTHON_BUILD_ARIA2_OPTS` | | Used to pass additional parameters to [`aria2`](https://aria2.github.io/).
If the `aria2c` binary is available on `PATH`, pyenv uses `aria2c` instead of `curl` or `wget` to download the Python Source code. If you have an unstable internet connection, you can use this variable to instruct `aria2` to accelerate the download.
In most cases, you will only need to use `-x 10 -k 1M` as value to `PYTHON_BUILD_ARIA2_OPTS` environment variable See also [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables) for environment variables that can be used to customize the build. diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index 7fd92165..83f48882 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -157,6 +157,7 @@ You can set certain environment variables to control the build process. * `PYTHON_BUILD_SKIP_MIRROR`, if set, forces python-build to download packages from their original source URLs instead of using a mirror. * `PYTHON_BUILD_HTTP_CLIENT`, explicitly specify the HTTP client type to use. `aria2`, `curl` and `wget` are the supported values and by default, are searched in that order. +* `PYTHON_BUILD_CURL_OPTS`, `PYTHON_BUILD_WGET_OPTS`, `PYTHON_BUILD_ARIA2_OPTS` pass additional parameters to the corresponding HTTP client. * `PYTHON_BUILD_SKIP_HOMEBREW`, if set, will not search for libraries installed by Homebrew when it would normally will. * `PYTHON_BUILD_USE_HOMEBREW`, if set, will search for libraries installed by Homebrew when it would normally not. * `PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA`, override the Homebrew OpenSSL formula to use. From b0cd5bf8837242dc06dd5e4242e379b4e235df96 Mon Sep 17 00:00:00 2001 From: native-api Date: Tue, 4 Jun 2024 01:06:33 +0300 Subject: [PATCH 102/246] Add sed and greadlink to exceptions (#2977) Anaconda has packages that override at least sed Greadlink is also a critical executable if present --- pyenv.d/rehash/conda.d/default.list | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pyenv.d/rehash/conda.d/default.list b/pyenv.d/rehash/conda.d/default.list index 867de1cc..f70b953b 100644 --- a/pyenv.d/rehash/conda.d/default.list +++ b/pyenv.d/rehash/conda.d/default.list @@ -64,6 +64,8 @@ redis-check-aof redis-check-dump redis-cli redis-server +# sed +sed # sqlite3 sqlite3 # xslt-config @@ -189,4 +191,5 @@ wc who whoami yes -# --- end exclusions from coreutils \ No newline at end of file +# --- end exclusions from coreutils +greadlink \ No newline at end of file From 2e0bb023e1486ccb71cdfc049c436655ec3088f6 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Thu, 6 Jun 2024 11:09:33 -0700 Subject: [PATCH 103/246] Add CPython 3.13.0b2 (#2978) --- plugins/python-build/share/python-build/3.13.0b1 | 9 --------- plugins/python-build/share/python-build/3.13.0b2 | 9 +++++++++ 2 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.13.0b1 create mode 100644 plugins/python-build/share/python-build/3.13.0b2 diff --git a/plugins/python-build/share/python-build/3.13.0b1 b/plugins/python-build/share/python-build/3.13.0b1 deleted file mode 100644 index 15e59218..00000000 --- a/plugins/python-build/share/python-build/3.13.0b1 +++ /dev/null @@ -1,9 +0,0 @@ -prefer_openssl3 -export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.3.0" "https://www.openssl.org/source/openssl-3.3.0.tar.gz#53e66b043322a606abf0087e7699a0e033a37fa13feb9742df35c3a33b18fb02" mac_openssl --if has_broken_mac_openssl -install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline -if has_tar_xz_support; then - install_package "Python-3.13.0b1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b1.tar.xz#ba716ac56b039b545ad4a90ce586a57aa97869364553746ef2445728ceec198e" standard verify_py313 copy_python_gdb ensurepip -else - install_package "Python-3.13.0b1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b1.tgz#3ff81ce29574296976dc42edfed52d39faf7ae583721a428cfc537a70bbaae16" standard verify_py313 copy_python_gdb ensurepip -fi diff --git a/plugins/python-build/share/python-build/3.13.0b2 b/plugins/python-build/share/python-build/3.13.0b2 new file mode 100644 index 00000000..88c2fc55 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0b2 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.1" "https://www.openssl.org/source/openssl-3.3.1.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.0b2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b2.tar.xz#bf11be01b42a07a3659e4e233591e03da631b7112aa61ee1e030eeb8c5dfd869" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.0b2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b2.tgz#c87c42aa8137230a15a02ed90a6600610ba680cb5b54c0fbc57581a0d032e0c4" standard verify_py313 copy_python_gdb ensurepip +fi From 79951112ccf660783783591845d41d8d1fe4a87e Mon Sep 17 00:00:00 2001 From: Taras I Date: Sat, 8 Jun 2024 22:32:07 +0200 Subject: [PATCH 104/246] Add CPython 3.12.4 (#2981) Also bump up openssl version --- plugins/python-build/share/python-build/3.12.4 | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.12.4 diff --git a/plugins/python-build/share/python-build/3.12.4 b/plugins/python-build/share/python-build/3.12.4 new file mode 100644 index 00000000..b4016372 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.4 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.2.2" "https://www.openssl.org/source/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.4" "https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tar.xz#f6d419a6d8743ab26700801b4908d26d97e8b986e14f95de31b32de2b0e79554" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.4" "https://www.python.org/ftp/python/3.12.4/Python-3.12.4.tgz#01b3c1c082196f3b33168d344a9c85fb07bfe0e7ecfe77fee4443420d1ce2ad9" standard verify_py312 copy_python_gdb ensurepip +fi From 0963c8ac02bca616b8f91ab8b1902f48502cd813 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sat, 8 Jun 2024 23:49:46 +0300 Subject: [PATCH 105/246] 2.4.2 --- CHANGELOG.md | 8 ++++++++ libexec/pyenv---version | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92d45ecc..474fd0a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Version History +## Release v2.4.2 +* Add script to install graalpy development builds by @timfel in https://github.com/pyenv/pyenv/pull/2969 +* Correct the Explanation of PATH Variable Lookup by @Y-askour in https://github.com/pyenv/pyenv/pull/2975 +* Document PYTHON_BUILD_CURL_OPTS, PYTHON_BUILD_WGET_OPTS, PYTHON_BUILD_ARIA2_OPTS by @native-api in https://github.com/pyenv/pyenv/pull/2976 +* Add sed and greadlink to shim exceptions by @native-api in https://github.com/pyenv/pyenv/pull/2977 +* Add CPython 3.13.0b2 by @jsirois in https://github.com/pyenv/pyenv/pull/2978 +* Add CPython 3.12.4 by @xxzgc in https://github.com/pyenv/pyenv/pull/2981 + ## Release v2.4.1 * Add CPython 3.12.3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2941 * Add CPython 3.13.0a6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2942 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index ec33fe11..a3ec9e2e 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.1" +version="2.4.2" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From cb99cbcc8ebb221d02e0860fa48127b887701472 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 9 Jun 2024 00:01:04 +0300 Subject: [PATCH 106/246] README: Emphasize the main design idea of the plugins --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 78b13516..ff9682a9 100644 --- a/README.md +++ b/README.md @@ -580,10 +580,13 @@ uninstall from the system. ## Pyenv plugins -Pyenv provides a simple, flexible and maintainable way to extend and customize its functionality with plugins -- +Pyenv provides a simple way to extend and customize its functionality with plugins -- as simple as creating a plugin directory and dropping a shell script on a certain subpath of it with whatever extra logic you need to be run at certain moments. +The main idea is that most things that you can put under `$PYENV_ROOT/` you can also put +under `$PYENV_ROOT/plugins/your_plugin_name/`. + See [_Plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Plugins) on how to install and use plugins as well as a catalog of some useful existing plugins for common needs. From a86ca7ac2ec996766baa1f7e635a4d6a387fd9a2 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 9 Jun 2024 00:19:03 +0300 Subject: [PATCH 107/246] Document adding defnitions with a plugin --- plugins/python-build/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index 83f48882..147e6ccf 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -96,7 +96,10 @@ versions of Python that are not yet supported by python-build. See the [python-build built-in definitions](https://github.com/pyenv/pyenv/tree/master/plugins/python-build/share/python-build) as a starting point for custom definition files. -[definitions]: https://github.com/pyenv/pyenv/tree/master/plugins/python-build/share/python-build +#### Adding definitions with a Pyenv plugin + +You can add your own definitions with a [Pyenv plugin](https://github.com/pyenv/pyenv?tab=readme-ov-file#pyenv-plugins) by placing them under +`$PYENV_ROOT/plugins/your_plugin_name/share/python-build`. ### Default build configuration From 7a91070c023e1ecb9b2f29c66d3980ad043c344b Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 9 Jun 2024 00:19:44 +0300 Subject: [PATCH 108/246] Removed obsoltete section about --enable-shared --- plugins/python-build/README.md | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index 147e6ccf..214e78ad 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -200,20 +200,6 @@ $ cat fix1.patch fix2.patch | pyenv install --patch 2.7.10 ``` -### Building with `--enable-shared` - -You can build CPython with `--enable-shared` to install a version with -shared object. - -If `--enable-shared` was found in `PYTHON_CONFIGURE_OPTS` or `CONFIGURE_OPTS`, -`python-build` will automatically set `RPATH` to the pyenv's prefix directory. -This means you don't have to set `LD_LIBRARY_PATH` or `DYLD_LIBRARY_PATH` for -the version(s) installed with `--enable-shared`. - -```sh -$ env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 2.7.9 -``` - ### Building for maximum performance Building CPython with `--enable-optimizations` will result in a faster From 4b60ddd06d8aa1ee1319214347e2d9a43b66ccc7 Mon Sep 17 00:00:00 2001 From: zhaobin Date: Mon, 10 Jun 2024 15:36:21 +0800 Subject: [PATCH 109/246] Add support for miniconda3 24.4.0-0 with py3.12, py3.11, py3.10, py3.9 --- .../python-build/miniconda3-3.10-24.4.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-24.4.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-24.4.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-24.4.0-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 new file mode 100644 index 00000000..ecf88343 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-aarch64.sh#68f3a537bf2ba8031961c8be6b52236c75478c797e0333e055539f02147676b8" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-s390x.sh#d5d06f9aa66d9cc9a23d6278826cb09f44f8e005b8b8fcf2664bef02e61ca751" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-x86_64.sh#fdaa5afdea8c07b6f2203b8f95abe0e4e8c4d3fd3c10d19fe590311446591ffa" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-MacOSX-arm64.sh#21f0b7c653518a6eb6135593c509cefc78fdff839bb2e887d36bc03eda607faf" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-MacOSX-x86_64.sh#c2eed72ff97b4eb81bc1171616b0ff48a440a2e1ad5638e1899b80286767c568" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 new file mode 100644 index 00000000..22c577e4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-aarch64.sh#d3ed9ff565c7341a4e4c957443ccb4f12f3dd5a087549099e7f199c36469e55c" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-s390x.sh#f2bea598cb72ed838a6e62b7dd8fbf1c3941a92783ba686822f70108c8c2e543" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-x86_64.sh#7cb030a12d1da35e1c548344a895b108e0d2fbdc4f6b67d5180b2ac8539cc473" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-MacOSX-arm64.sh#a396cf4ca0088cf2d78517b28732b61697cdcb698528300946ef6409353eca86" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-MacOSX-x86_64.sh#b7f3adebd2b25dbefdc85e16f5ee130ac0d1167f416078f961e90f277476b115" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 new file mode 100644 index 00000000..20c8dfb4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-aarch64.sh#832d48e11e444c1a25f320fccdd0f0fabefec63c1cd801e606836e1c9c76ad51" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-s390x.sh#e973f1b6352d58b1ab35f30424f1565d7ffa469dcde2d52c86ec1c117db11aad" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-x86_64.sh#b6597785e6b071f1ca69cf7be6d0161015b96340b9a9e132215d5713408c3a7c" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-MacOSX-arm64.sh#f4925c0150d232d95de798a64c696f4b2df2745bb997b793506bdfd27bf91e11" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-MacOSX-x86_64.sh#1413369470adb7cf52f8b961e81b3ceeb92f5931a451bef9cb0c42be0ce17ef3" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 new file mode 100644 index 00000000..7b60311a --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-aarch64.sh#6f09fd08165a9fdccb2a2c64e9bbcf68ce58a9bfb571600306eb44d29718b13f" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-s390x.sh#8766e30b038087e7da2bb9a8bca4ca3f2ed621659f0ea8954ffab789f4a8f192" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-x86_64.sh#edd7610f2e2b25d15f6ffa81ca94de0748dd107096871459a7966dcf9a564ea9" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-MacOSX-arm64.sh#74f3de552d93712cc7c531f690b78d6acad8e3812da43fc3a1acbc5c39243480" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-MacOSX-x86_64.sh#d3ad5e0bf74aa1cb838df2f73e4be4e5d9a0f259a05b5223199ea1f6f6edf9f3" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 613e5142b3520a8c3e51d1083eabb87de0a0d0e3 Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Tue, 11 Jun 2024 00:38:04 +0800 Subject: [PATCH 110/246] Add support for miniconda3 24.4.0-0 with py3.12, py3.11, py3.10, py3.9 (#2982) Co-authored-by: zhaobin --- .../python-build/miniconda3-3.10-24.4.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-24.4.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-24.4.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-24.4.0-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 new file mode 100644 index 00000000..ecf88343 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-aarch64.sh#68f3a537bf2ba8031961c8be6b52236c75478c797e0333e055539f02147676b8" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-s390x.sh#d5d06f9aa66d9cc9a23d6278826cb09f44f8e005b8b8fcf2664bef02e61ca751" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-Linux-x86_64.sh#fdaa5afdea8c07b6f2203b8f95abe0e4e8c4d3fd3c10d19fe590311446591ffa" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-MacOSX-arm64.sh#21f0b7c653518a6eb6135593c509cefc78fdff839bb2e887d36bc03eda607faf" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.4.0-0-MacOSX-x86_64.sh#c2eed72ff97b4eb81bc1171616b0ff48a440a2e1ad5638e1899b80286767c568" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 new file mode 100644 index 00000000..22c577e4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-aarch64.sh#d3ed9ff565c7341a4e4c957443ccb4f12f3dd5a087549099e7f199c36469e55c" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-s390x.sh#f2bea598cb72ed838a6e62b7dd8fbf1c3941a92783ba686822f70108c8c2e543" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-Linux-x86_64.sh#7cb030a12d1da35e1c548344a895b108e0d2fbdc4f6b67d5180b2ac8539cc473" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-MacOSX-arm64.sh#a396cf4ca0088cf2d78517b28732b61697cdcb698528300946ef6409353eca86" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.4.0-0-MacOSX-x86_64.sh#b7f3adebd2b25dbefdc85e16f5ee130ac0d1167f416078f961e90f277476b115" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 new file mode 100644 index 00000000..20c8dfb4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-aarch64.sh#832d48e11e444c1a25f320fccdd0f0fabefec63c1cd801e606836e1c9c76ad51" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-s390x.sh#e973f1b6352d58b1ab35f30424f1565d7ffa469dcde2d52c86ec1c117db11aad" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-Linux-x86_64.sh#b6597785e6b071f1ca69cf7be6d0161015b96340b9a9e132215d5713408c3a7c" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-MacOSX-arm64.sh#f4925c0150d232d95de798a64c696f4b2df2745bb997b793506bdfd27bf91e11" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.4.0-0-MacOSX-x86_64.sh#1413369470adb7cf52f8b961e81b3ceeb92f5931a451bef9cb0c42be0ce17ef3" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 new file mode 100644 index 00000000..7b60311a --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.4.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.4.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-aarch64.sh#6f09fd08165a9fdccb2a2c64e9bbcf68ce58a9bfb571600306eb44d29718b13f" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.4.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-s390x.sh#8766e30b038087e7da2bb9a8bca4ca3f2ed621659f0ea8954ffab789f4a8f192" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.4.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-Linux-x86_64.sh#edd7610f2e2b25d15f6ffa81ca94de0748dd107096871459a7966dcf9a564ea9" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.4.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-MacOSX-arm64.sh#74f3de552d93712cc7c531f690b78d6acad8e3812da43fc3a1acbc5c39243480" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.4.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.4.0-0-MacOSX-x86_64.sh#d3ad5e0bf74aa1cb838df2f73e4be4e5d9a0f259a05b5223199ea1f6f6edf9f3" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 42c66c92d8dd5f55fed530a21e5d838bcfc870b0 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Mon, 10 Jun 2024 23:20:20 +0300 Subject: [PATCH 111/246] Document mirror structure and download cache in more details --- plugins/python-build/README.md | 40 ++++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index 214e78ad..2c02e76c 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -227,14 +227,30 @@ definition. (All bundled definitions include checksums.) ### Package download mirrors python-build will first attempt to download package files from a mirror hosted on -GitHub Pages. If a package is not available on the mirror, if the mirror -is down, or if the download is corrupt, python-build will fall back to the +GitHub Pages. If this fails, it will fall back to the official URL specified in the definition file. You can point python-build to another mirror by specifying the -`PYTHON_BUILD_MIRROR_URL` environment variable--useful if you'd like to run your -own local mirror, for example. Package mirror URLs are constructed by joining -this variable with the SHA2 checksum of the package file. +`PYTHON_BUILD_MIRROR_URL` environment variable. + +Package mirror URLs are constructed by joining +`$PYTHON_BUILD_MIRROR_URL` with the SHA2 checksum of the package file as specified in the URL +in the installation script (the part after the hash sign). E.g.: + +``` +https://mycache.example.com/0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3 +``` + +If you have replicated the directory structure of an official site, the easiest way to adapt +would be to make symlinks at the mirror's root: + +``` +0419e9085bf51b7a672009b3f50dbf1859acdf18ba725d0ec19aa5c8503f0ea3 -> 3.10.10/Python-3.10.10.tar.xz +``` + +The rationale is to abstract away difference between directory structures of sites +of various Python flavors and their occasional changes as well as to accomodate +people who only wish to cache some select downloads. This also allows to mirror multiple sites at once. If the mirror being used does not have the same checksum (*e.g.* with a pull-through cache like Artifactory), you can set the @@ -247,15 +263,15 @@ mirror by setting the `PYTHON_BUILD_SKIP_MIRROR` environment variable. The official python-build download mirror is provided by [GitHub Pages](http://yyuu.github.io/pythons/). -### Package download caching +### Package download cache -You can instruct python-build to keep a local cache of downloaded package files -by setting the `PYTHON_BUILD_CACHE_PATH` environment variable. When set, package -files will be kept in this directory after the first successful download and -reused by subsequent invocations of `python-build` and `pyenv install`. +Python-build will keep a cache of downloaded package files +at the location specified by the `PYTHON_BUILD_CACHE_PATH` environment variable +if it exists. The default is `~/.pyenv/cache`, so you can +enable caching by just creating that directory. -The `pyenv install` command defaults this path to `~/.pyenv/cache`, so in most -cases you can enable download caching simply by creating that directory. +The name of the would-be cached file is reported by Pyenv in the "Downloading <filename>..." message. +It's possible to warm up the cache by manually putting the file there under an appropriate name. ### Keeping the build directory after installation From 756aad26135ca23e11e86fc40aac1dd415e980d8 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 12 Jun 2024 22:48:15 +0300 Subject: [PATCH 112/246] 2.4.3 --- CHANGELOG.md | 3 +++ libexec/pyenv---version | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 474fd0a6..e2b18f76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Version History +## Release v2.4.3 +* Add miniconda3 24.4.0-0 by @binbjz in https://github.com/pyenv/pyenv/pull/2982 + ## Release v2.4.2 * Add script to install graalpy development builds by @timfel in https://github.com/pyenv/pyenv/pull/2969 * Correct the Explanation of PATH Variable Lookup by @Y-askour in https://github.com/pyenv/pyenv/pull/2975 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index a3ec9e2e..73758005 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.2" +version="2.4.3" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 7947efc130cadf6b9e3743dc4edc5b9a341b8995 Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Fri, 28 Jun 2024 01:18:34 +0800 Subject: [PATCH 113/246] Add support for miniconda3 24.5.0-0 with py3.12, py3.11, py3.10, py3.9 (#2994) --- .../python-build/miniconda3-3.10-24.5.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-24.5.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-24.5.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-24.5.0-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.5.0-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.5.0-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.5.0-0 new file mode 100644 index 00000000..c759e635 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-Linux-aarch64.sh#edcf076c80846beded0b72e98811cf7b93d0abc2ae93c060efc76f8da1e6fc45" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-Linux-s390x.sh#e00f3d03d13fc4fa394a5d20a5476087237ee6cb029eba3b02322acc104b530b" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-Linux-x86_64.sh#b3d73db6a05069fbdf20dc33fc9b6a29fa7198578f0d090c639f5ca0e84102bd" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-MacOSX-arm64.sh#e422602aa19140c600b5889e5b41a0d7187640107ea82fcb5da857dd25330148" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.5.0-0-MacOSX-x86_64.sh#6d7c1cc138adfc4bb2ccbb8a22eb8e9eb13a366b6af0d63245b643e6c3a3c708" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.5.0-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.5.0-0 new file mode 100644 index 00000000..ca06844b --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-Linux-aarch64.sh#94a742af7bf5c7bae3dba6bd07d84d94b858b839e15af2ea0cd10fdf2bde8a73" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-Linux-s390x.sh#002963f32aebe1091d5da9a82416831f3c11217e6b4ea164c655f0d11f0cff80" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-Linux-x86_64.sh#38b203bb1f2be78b735ebc00162f29e8e73fcd9a619ed5980490a72193ee1f58" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-MacOSX-arm64.sh#a3d62f20f09e8079db76379090f21b7ae34832dadeb5a250e4fab324c8328727" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.5.0-0-MacOSX-x86_64.sh#9e7dc7e0fbf0e9b2ff6bafdae9bf6ef122ae92d53533c2bbeb73433c0c6a4bd9" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.5.0-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.5.0-0 new file mode 100644 index 00000000..d9c91fdd --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-Linux-aarch64.sh#70afe954cc8ee91f605f9aa48985bfe01ecfc10751339e8245eac7262b01298d" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-Linux-s390x.sh#bd2a0a8ea34c84c860868d5b8efde07afc51cdede76b64dd94e9c3fd2d65257e" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-Linux-x86_64.sh#4b3b3b1b99215e85fd73fb2c2d7ebf318ac942a457072de62d885056556eb83e" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-MacOSX-arm64.sh#12e678b8156aea69a132568b6176a019c7a1ba753ddf5caedf086d3c5460fe92" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.5.0-0-MacOSX-x86_64.sh#b1c87c8334ea878d30a9976c1860b1004e6d55bdec5228089fec40be81156363" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.5.0-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.5.0-0 new file mode 100644 index 00000000..827ad869 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.5.0-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Linux-aarch64.sh#b716e3bc556e9ab7a4f206b04b53bd57c24e94956598d89fc78863b115cce9e8" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.5.0-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Linux-s390x.sh#c2d6bec964a96130eb5f1c4ea46993cf10f7957d45ac31d9aa94c34b5ebfed32" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.5.0-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-Linux-x86_64.sh#07a2435123fd8f41e6528baa5f272ce754fd8acaef08ce7081afb00227b8754a" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.5.0-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-MacOSX-arm64.sh#f5f63a0de44b7b0872f3c00dca71b896933ccc844a93bf120aad6df66b6475b3" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.5.0-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.5.0-0-MacOSX-x86_64.sh#b65d7f01820bdfe1abb6b4dd84d48e6c62a6d72ee0cc400a4e8bb4ea89ff1c84" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From d660c5a84f6b03a94961eb0e49adb2b25cd091b1 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Thu, 27 Jun 2024 16:18:14 -0400 Subject: [PATCH 114/246] Add support for free-threaded Python (#2995) --- plugins/python-build/bin/python-build | 7 +++++++ plugins/python-build/share/python-build/3.13t-dev | 2 ++ plugins/python-build/share/python-build/3.14t-dev | 2 ++ 3 files changed, 11 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.13t-dev create mode 100644 plugins/python-build/share/python-build/3.14t-dev diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 923fcc62..a0be4fbf 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -822,6 +822,7 @@ build_package_standard_build() { use_homebrew_zlib || true fi use_dsymutil || true + use_free_threading || true fi ( if [ "${CFLAGS+defined}" ] || [ "${!PACKAGE_CFLAGS+defined}" ]; then @@ -1761,6 +1762,12 @@ use_dsymutil() { fi } +use_free_threading() { + if [[ -n "$PYTHON_BUILD_FREE_THREADING" ]]; then + package_option python configure --disable-gil + fi +} + build_package_enable_shared() { package_option python configure --enable-shared } diff --git a/plugins/python-build/share/python-build/3.13t-dev b/plugins/python-build/share/python-build/3.13t-dev new file mode 100644 index 00000000..cd9d2f09 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13t-dev @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13-dev diff --git a/plugins/python-build/share/python-build/3.14t-dev b/plugins/python-build/share/python-build/3.14t-dev new file mode 100644 index 00000000..7c6180f0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14t-dev @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14-dev From 9546f729f775342f7ed5dc83c36531043d4f7fa3 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Thu, 27 Jun 2024 23:21:27 +0300 Subject: [PATCH 115/246] 2.4.4 --- CHANGELOG.md | 4 ++++ libexec/pyenv---version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e2b18f76..4295c45c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Version History +## Release v2.4.4 +* Add support for miniconda3 24.5.0-0 with py3.12, py3.11, py3.10, py3.9 by @binbjz in https://github.com/pyenv/pyenv/pull/2994 +* Add support for free-threaded Python by @colesbury in https://github.com/pyenv/pyenv/pull/2995 + ## Release v2.4.3 * Add miniconda3 24.4.0-0 by @binbjz in https://github.com/pyenv/pyenv/pull/2982 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 73758005..c6046b55 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.3" +version="2.4.4" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From e8e8cfddcd72df55e01db7c2eec6c21bc1f35ee1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Sun, 30 Jun 2024 11:55:53 -0600 Subject: [PATCH 116/246] Add CPython 3.13.0b3 (#2996) --- .../python-build/share/python-build/{3.13.0b2 => 3.13.0b3} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename plugins/python-build/share/python-build/{3.13.0b2 => 3.13.0b3} (57%) diff --git a/plugins/python-build/share/python-build/3.13.0b2 b/plugins/python-build/share/python-build/3.13.0b3 similarity index 57% rename from plugins/python-build/share/python-build/3.13.0b2 rename to plugins/python-build/share/python-build/3.13.0b3 index 88c2fc55..f286f05b 100644 --- a/plugins/python-build/share/python-build/3.13.0b2 +++ b/plugins/python-build/share/python-build/3.13.0b3 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.3.1" "https://www.openssl.org/source/openssl-3.3.1.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.13.0b2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b2.tar.xz#bf11be01b42a07a3659e4e233591e03da631b7112aa61ee1e030eeb8c5dfd869" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0b3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b3.tar.xz#3be094ad08b11dc2a065463524239c78dc9f2b342b01dcd4e1e606dbbc5c78a5" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.13.0b2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b2.tgz#c87c42aa8137230a15a02ed90a6600610ba680cb5b54c0fbc57581a0d032e0c4" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0b3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b3.tgz#5e9c01cdb3e2fb1f5732a55e9522cb6a011693e795ec347b3f69ff5e217175e4" standard verify_py313 copy_python_gdb ensurepip fi From 2c2c7616e2c3a8ab7623bea3c353ff520750b812 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 30 Jun 2024 20:58:02 +0300 Subject: [PATCH 117/246] 2.4.5 --- CHANGELOG.md | 3 +++ libexec/pyenv---version | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4295c45c..3ed452e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Version History +## Release v2.4.5 +* Add CPython 3.13.0b3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2996 + ## Release v2.4.4 * Add support for miniconda3 24.5.0-0 with py3.12, py3.11, py3.10, py3.9 by @binbjz in https://github.com/pyenv/pyenv/pull/2994 * Add support for free-threaded Python by @colesbury in https://github.com/pyenv/pyenv/pull/2995 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index c6046b55..79b0d347 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.4" +version="2.4.5" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 1bcaab05b71601269b91185a4cbeb3aa037a00a8 Mon Sep 17 00:00:00 2001 From: native-api Date: Mon, 1 Jul 2024 22:38:06 +0300 Subject: [PATCH 118/246] CI: push MacOS jobs to MacOS 13 and 14 (#3002) Github has finally released those as free and retired macos-11 --- .github/workflows/macos_build.yml | 2 +- .github/workflows/modified_scripts_build.yml | 2 +- .github/workflows/pyenv_tests.yml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index 6622b6a3..6459fabc 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -15,7 +15,7 @@ jobs: - "3.10" - "3.11" - "3.12" - runs-on: macos-11 + runs-on: macos-14 steps: - uses: actions/checkout@v4 # Normally, we would use the superbly maintained... diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml index 79dbdb89..1f5cf7f4 100644 --- a/.github/workflows/modified_scripts_build.yml +++ b/.github/workflows/modified_scripts_build.yml @@ -30,7 +30,7 @@ jobs: fail-fast: false matrix: python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} - os: ["macos-11", "macos-12"] + os: ["macos-13", "macos-14"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/pyenv_tests.yml b/.github/workflows/pyenv_tests.yml index f05430cd..aa8f4959 100644 --- a/.github/workflows/pyenv_tests.yml +++ b/.github/workflows/pyenv_tests.yml @@ -12,8 +12,8 @@ jobs: os: - ubuntu-22.04 - ubuntu-20.04 - - macos-12 - - macos-11 + - macos-14 + - macos-13 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 From 384361167a372068e3bb2f0f5627519ec8f90774 Mon Sep 17 00:00:00 2001 From: Sam Gross Date: Mon, 1 Jul 2024 15:50:03 -0400 Subject: [PATCH 119/246] Add 3.13.0b3t and exclude it from `pyenv latest` (#3001) This adds the free-threaded (without GIL) version of 3.13.0b3. Co-authored-by: Ivan Pozdeev --- libexec/pyenv-latest | 2 +- plugins/python-build/share/python-build/3.13.0b3t | 2 ++ pyenv.d/install/latest.bash | 2 +- test/latest.bats | 3 +++ 4 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 plugins/python-build/share/python-build/3.13.0b3t diff --git a/libexec/pyenv-latest b/libexec/pyenv-latest index d5e95e95..6f2d9e97 100755 --- a/libexec/pyenv-latest +++ b/libexec/pyenv-latest @@ -50,7 +50,7 @@ IFS=$'\n' DEFINITION_CANDIDATES=(\ $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ - sed -E -e '/-dev$/d' -e '/-src$/d' -e '/-latest$/d' -e '/(a|b|rc)[0-9]+$/d')); + sed -E -e '/-dev$/d' -e '/-src$/d' -e '/-latest$/d' -e '/(a|b|rc)[0-9]+$/d' -e '/[0-9]+t$/d')); # Compose a sorting key, followed by | and original value DEFINITION_CANDIDATES=(\ diff --git a/plugins/python-build/share/python-build/3.13.0b3t b/plugins/python-build/share/python-build/3.13.0b3t new file mode 100644 index 00000000..31f54da0 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0b3t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0b3 diff --git a/pyenv.d/install/latest.bash b/pyenv.d/install/latest.bash index 790b2dd1..c99162b3 100644 --- a/pyenv.d/install/latest.bash +++ b/pyenv.d/install/latest.bash @@ -10,7 +10,7 @@ pyenv_install_resolve_latest() { $(python-build --definitions | \ grep -F "${DEFINITION_PREFIX}" | \ grep "^${DEFINITION_TYPE}" | \ - sed -E -e '/-dev$/d' -e '/-src$/d' -e '/(b|rc)[0-9]+$/d' | \ + sed -E -e '/-dev$/d' -e '/-src$/d' -e '/(b|rc)[0-9]+$/d' -e '/[0-9]+t$/d' | \ sort -t. -k1,1r -k 2,2nr -k 3,3nr \ || true)) DEFINITION="${DEFINITION_CANDIDATES}" diff --git a/test/latest.bats b/test/latest.bats index c145eff7..d382a926 100644 --- a/test/latest.bats +++ b/test/latest.bats @@ -103,6 +103,9 @@ echo 3.8.5-latest echo 3.8.5a2 echo 3.8.5b3 echo 3.8.5rc2 +echo 3.8.5t +echo 3.8.5b3t +echo 3.8.5rc2t echo 3.8.1 echo 3.8.1/envs/foo ! From 672eef15618072112ae157f1b023cee0b5b01da4 Mon Sep 17 00:00:00 2001 From: Jon Crall Date: Wed, 3 Jul 2024 20:49:12 -0400 Subject: [PATCH 120/246] Speed up pyenv prefix by not constructing advice text when it would be discarded (#3005) by adding an internal flag --- libexec/pyenv-prefix | 6 ++--- libexec/pyenv-versions | 6 ++--- libexec/pyenv-which | 54 +++++++++++++++++++++++++++--------------- test/which.bats | 12 ++++++++++ 4 files changed, 53 insertions(+), 25 deletions(-) diff --git a/libexec/pyenv-prefix b/libexec/pyenv-prefix index 38b8f823..261b865f 100755 --- a/libexec/pyenv-prefix +++ b/libexec/pyenv-prefix @@ -30,9 +30,9 @@ OLDIFS="$IFS" { IFS=: for version in ${PYENV_VERSION}; do if [ "$version" = "system" ]; then - if PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python 2>/dev/null)" || \ - PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python3 2>/dev/null)" || \ - PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python2 2>/dev/null)"; then + if PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python --skip-advice 2>/dev/null)" || \ + PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python3 --skip-advice 2>/dev/null)" || \ + PYTHON_PATH="$(PYENV_VERSION="${version}" pyenv-which python2 --skip-advice 2>/dev/null)"; then shopt -s extglob # In some distros (Arch), Python can be found in sbin as well as bin PYENV_PREFIX_PATH="${PYTHON_PATH%/?(s)bin/*}" diff --git a/libexec/pyenv-versions b/libexec/pyenv-versions index 0dd57dec..dbccaa32 100755 --- a/libexec/pyenv-versions +++ b/libexec/pyenv-versions @@ -128,9 +128,9 @@ print_version() { # Include "system" in the non-bare output, if it exists if [ -n "$include_system" ] && \ - (PYENV_VERSION=system pyenv-which python >/dev/null 2>&1 || \ - PYENV_VERSION=system pyenv-which python3 >/dev/null 2>&1 || \ - PYENV_VERSION=system pyenv-which python2 >/dev/null 2>&1) ; then + (PYENV_VERSION=system pyenv-which python --skip-advice >/dev/null 2>&1 || \ + PYENV_VERSION=system pyenv-which python3 --skip-advice >/dev/null 2>&1 || \ + PYENV_VERSION=system pyenv-which python2 --skip-advice >/dev/null 2>&1) ; then print_version system "/" fi diff --git a/libexec/pyenv-which b/libexec/pyenv-which index 29b44318..6f12761e 100755 --- a/libexec/pyenv-which +++ b/libexec/pyenv-which @@ -2,13 +2,14 @@ # # Summary: Display the full path to an executable # -# Usage: pyenv which [--nosystem] +# Usage: pyenv which [--nosystem] [--skip-advice] # # Displays the full path to the executable that pyenv will invoke when # you run the given command. # Use --nosystem argument in case when you don't need to search command in the # system environment. -# +# Internal switch --skip-advice used to skip printing an error message on a +# failed search. set -e [ -n "$PYENV_DEBUG" ] && set -x @@ -18,11 +19,27 @@ if [ "$1" = "--complete" ]; then exec pyenv-shims --short fi -if [ "$2" = "--nosystem" ]; then - system="" -else - system="system" -fi +system="system" +SKIP_ADVICE="" +PYENV_COMMAND="$1" + +while [[ $# -gt 0 ]] +do + case "$1" in + --skip-advice) + SKIP_ADVICE=1 + shift + ;; + --nosystem) + system="" + shift + ;; + *) + shift + ;; + esac +done + remove_from_path() { local path_to_remove="$1" @@ -36,8 +53,6 @@ remove_from_path() { echo "${result#:}" } -PYENV_COMMAND="$1" - if [ -z "$PYENV_COMMAND" ]; then pyenv-help --usage which >&2 exit 1 @@ -85,16 +100,17 @@ else fi echo "pyenv: $PYENV_COMMAND: command not found" >&2 - - versions="$(pyenv-whence "$PYENV_COMMAND" || true)" - if [ -n "$versions" ]; then - { echo - echo "The \`$1' command exists in these Python versions:" - echo "$versions" | sed 's/^/ /g' - echo - echo "Note: See 'pyenv help global' for tips on allowing both" - echo " python2 and python3 to be found." - } >&2 + if [ -z "$SKIP_ADVICE" ]; then + versions="$(pyenv-whence "$PYENV_COMMAND" || true)" + if [ -n "$versions" ]; then + { echo + echo "The \`$PYENV_COMMAND' command exists in these Python versions:" + echo "$versions" | sed 's/^/ /g' + echo + echo "Note: See 'pyenv help global' for tips on allowing both" + echo " python2 and python3 to be found." + } >&2 + fi fi exit 127 diff --git a/test/which.bats b/test/which.bats index 193b95a4..e6c4ee69 100644 --- a/test/which.bats +++ b/test/which.bats @@ -155,3 +155,15 @@ exit PYENV_VERSION=3.4 run pyenv-which python assert_success "version=3.4.2" } + +@test "skip advice supresses error messages" { + create_executable "2.7" "python" + create_executable "3.3" "py.test" + create_executable "3.4" "py.test" + + PYENV_VERSION=2.7 run pyenv-which py.test --skip-advice + assert_failure + assert_output < Date: Fri, 5 Jul 2024 06:56:36 +0300 Subject: [PATCH 121/246] 2.4.6 --- CHANGELOG.md | 5 +++++ libexec/pyenv---version | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ed452e1..dfba5607 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Version History +## Release v2.4.6 +* CI: push MacOS jobs to MacOS 13 and 14 by @native-api in https://github.com/pyenv/pyenv/pull/3002 +* Add 3.13.0b3t and exclude it from `pyenv latest` by @colesbury in https://github.com/pyenv/pyenv/pull/3001 +* Speed up `pyenv prefix` by not constructing advice text when it would be discarded by @Erotemic in https://github.com/pyenv/pyenv/pull/3005 + ## Release v2.4.5 * Add CPython 3.13.0b3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2996 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 79b0d347..ec87819d 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.5" +version="2.4.6" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From d81eebf8d1f75cc8dbb4f36c404dc34d5ff8cd8c Mon Sep 17 00:00:00 2001 From: binbjz Date: Fri, 5 Jul 2024 19:37:22 +0800 Subject: [PATCH 122/246] Add support for anaconda3-2024.06-1 --- .../share/python-build/anaconda3-2024.06-1 | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 plugins/python-build/share/python-build/anaconda3-2024.06-1 diff --git a/plugins/python-build/share/python-build/anaconda3-2024.06-1 b/plugins/python-build/share/python-build/anaconda3-2024.06-1 new file mode 100644 index 00000000..2b85196d --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2024.06-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2024.06-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-aarch64.sh#b4be0ad2052236882402902a31d32cd37635d3db194a42f977be0d68a8ff1a31" "anaconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2024.06-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-s390x.sh#1b3f4ef4147137fb1861f8251679ea96e651a7c405993c61e39441e43ee2dd11" "anaconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2024.06-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh#539bb43d9a52d758d0fdfa1b1b049920ec6f8c6d15ee9fe4a423355fe551a8f7" "anaconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2024.06-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-MacOSX-arm64.sh#f9e0795431910ee4ac341c0cc2a0b62e6c497440789b4117c20736db45b34204" "anaconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2024.06-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.06-1-MacOSX-x86_64.sh#9b2aa48bfc58e337176d8b5f3776692815807e1346ec12ebcc46a01801bb4ee0" "anaconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 50e726ac413c3915db0eadcbf39aeaf2c90eefc4 Mon Sep 17 00:00:00 2001 From: native-api Date: Sat, 6 Jul 2024 04:04:46 +0300 Subject: [PATCH 123/246] Fix debug build for X.Yy-dev (#3011) also just use extglob everywhere --- plugins/python-build/bin/python-build | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index a0be4fbf..9aed0957 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -19,6 +19,7 @@ PYTHON_BUILD_VERSION="20180424" OLDIFS="$IFS" set -E +shopt -s extglob [ -n "$PYENV_DEBUG" ] && { export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }' set -x @@ -1784,20 +1785,14 @@ build_package_auto_tcltk() { fi } -# extglob must be set at both parse time and runtime -# https://stackoverflow.com/questions/49283740/bash-script-throws-syntax-errors-when-the-extglob-option-is-set-inside-a-subsh -shopt -s extglob package_is_python() { - shopt -s extglob case "$1" in Python-* | jython-* | pypy-* | pypy[0-9].+([0-9])-* | stackless-* ) return 0 ;; esac return 1 - shopt -u extglob } -shopt -u extglob apply_patch() { local package_name="$1" @@ -2308,7 +2303,6 @@ if [[ "$PYPY_OPTS" == *"--shared"* ]]; then fi # Add support for framework installation (`--enable-framework`) of CPython (#55, #99) -shopt -s extglob if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; then if ! is_mac; then echo "python-build: framework installation is not supported outside of MacOS." >&2 @@ -2334,10 +2328,8 @@ if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-framework"* ]]; the PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS//--enable-framework?(=*([^ ]))?( )/}"; PYTHON_CONFIGURE_OPTS="${PYTHON_CONFIGURE_OPTS% }" fi -shopt -u extglob # Build against universal SDK -shopt -s extglob if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-universalsdk"* ]]; then if ! is_mac; then echo "python-build: universal installation is not supported outside of MacOS." >&2 @@ -2359,7 +2351,6 @@ if [[ "$CONFIGURE_OPTS $PYTHON_CONFIGURE_OPTS" == *"--enable-universalsdk"* ]]; fi fi fi -shopt -u extglob # Compile with `--enable-unicode=ucs4` by default (#257) if [[ "$PYTHON_CONFIGURE_OPTS" != *"--enable-unicode="* ]]; then @@ -2454,6 +2445,7 @@ python_bin_suffix() { version_name="${version_name%-dev}" version_name="${version_name%-rc*}" version_name="${version_name%rc*}" + version_name="${version_name%%*([^0-9])}" version_info=(${version_name//./ }) echo "${version_info[0]}.${version_info[1]}" ;; From adf3c2bccf09cdb81febcfd15b186711a33ac7a8 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sat, 6 Jul 2024 04:44:35 +0300 Subject: [PATCH 124/246] 2.4.7 --- CHANGELOG.md | 4 ++++ libexec/pyenv---version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dfba5607..3a708898 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Version History +## Release v2.4.7 +* Add support for anaconda3-2024.06-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3009 +* Fix debug build for X.Yt-dev by @native-api in https://github.com/pyenv/pyenv/pull/ + ## Release v2.4.6 * CI: push MacOS jobs to MacOS 13 and 14 by @native-api in https://github.com/pyenv/pyenv/pull/3002 * Add 3.13.0b3t and exclude it from `pyenv latest` by @colesbury in https://github.com/pyenv/pyenv/pull/3001 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index ec87819d..5fc62f46 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.6" +version="2.4.7" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From cdd97d8c300b4fddb31577d58ac2523b4f6c5046 Mon Sep 17 00:00:00 2001 From: native-api Date: Sat, 20 Jul 2024 21:22:50 +0300 Subject: [PATCH 125/246] Fix pyenv-uninstall not having the debug tracing invocation (#3020) --- plugins/python-build/bin/pyenv-uninstall | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/python-build/bin/pyenv-uninstall b/plugins/python-build/bin/pyenv-uninstall index 3bf6d98e..f6b6fcdf 100755 --- a/plugins/python-build/bin/pyenv-uninstall +++ b/plugins/python-build/bin/pyenv-uninstall @@ -11,6 +11,7 @@ # See `pyenv versions` for a complete list of installed versions. # set -e +[ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then From e396561661c65c1213bb69c73c01a459e3e4b6dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Sat, 20 Jul 2024 12:29:18 -0600 Subject: [PATCH 126/246] Add CPython 3.13.0b4 and 3.13.0b4t (#3019) --- plugins/python-build/share/python-build/3.13.0b3t | 2 -- .../python-build/share/python-build/{3.13.0b3 => 3.13.0b4} | 4 ++-- plugins/python-build/share/python-build/3.13.0b4t | 2 ++ 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.13.0b3t rename plugins/python-build/share/python-build/{3.13.0b3 => 3.13.0b4} (57%) create mode 100644 plugins/python-build/share/python-build/3.13.0b4t diff --git a/plugins/python-build/share/python-build/3.13.0b3t b/plugins/python-build/share/python-build/3.13.0b3t deleted file mode 100644 index 31f54da0..00000000 --- a/plugins/python-build/share/python-build/3.13.0b3t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0b3 diff --git a/plugins/python-build/share/python-build/3.13.0b3 b/plugins/python-build/share/python-build/3.13.0b4 similarity index 57% rename from plugins/python-build/share/python-build/3.13.0b3 rename to plugins/python-build/share/python-build/3.13.0b4 index f286f05b..4f3e28e7 100644 --- a/plugins/python-build/share/python-build/3.13.0b3 +++ b/plugins/python-build/share/python-build/3.13.0b4 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.3.1" "https://www.openssl.org/source/openssl-3.3.1.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.13.0b3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b3.tar.xz#3be094ad08b11dc2a065463524239c78dc9f2b342b01dcd4e1e606dbbc5c78a5" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0b4" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b4.tar.xz#b2aa557c3c875233abdaf1b124284e5d50f6bb238d62a8b55f12dc92cea1953f" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.13.0b3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b3.tgz#5e9c01cdb3e2fb1f5732a55e9522cb6a011693e795ec347b3f69ff5e217175e4" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0b4" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b4.tgz#6f387984d028686c008a822cf6887e47d8dbc460ebc022358082ecacac5113e6" standard verify_py313 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.13.0b4t b/plugins/python-build/share/python-build/3.13.0b4t new file mode 100644 index 00000000..4bc52401 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0b4t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0b4 From 88f76ee787dcd2eec3a7d0443faf9eb5482f6c6c Mon Sep 17 00:00:00 2001 From: ThomasHaz Date: Sat, 20 Jul 2024 19:32:57 +0100 Subject: [PATCH 127/246] README: Remove reference to Fig [https://fig.io] (#3018) [Fig](https://fig.io) has been sunlit for new users, with access being removed in September --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index ff9682a9..32a0cdb2 100644 --- a/README.md +++ b/README.md @@ -367,12 +367,6 @@ See [Advanced configuration](#advanced-configuration) for details and more confi **Proxy note**: If you use a proxy, export `http_proxy` and `https_proxy`, too. - In MacOS, you might also want to install [Fig](https://fig.io/) which -provides alternative shell completions for many command line tools with an -IDE-like popup interface in the terminal window. -(Note that their completions are independent from Pyenv's codebase -so they might be slightly out of sync for bleeding-edge interface changes.) - ### Restart your shell for the `PATH` changes to take effect. From 9373970678f48dd7e86348e428269930d0645cb0 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sat, 20 Jul 2024 22:06:13 +0300 Subject: [PATCH 128/246] pyenv-latest: replace -q with -b and -f, document as internal More tailored for the emergent internal use cases --- libexec/pyenv-latest | 23 +++++++++++++++++------ libexec/pyenv-prefix | 2 +- libexec/pyenv-version-name | 2 +- plugins/python-build/bin/pyenv-install | 2 +- plugins/python-build/test/hooks.bats | 3 ++- plugins/python-build/test/pyenv.bats | 8 ++++---- test/latest.bats | 22 ++++++++++++++++++++++ 7 files changed, 48 insertions(+), 14 deletions(-) diff --git a/libexec/pyenv-latest b/libexec/pyenv-latest index 6f2d9e97..330e1e29 100755 --- a/libexec/pyenv-latest +++ b/libexec/pyenv-latest @@ -1,9 +1,11 @@ #!/usr/bin/env bash # Summary: Print the latest installed or known version with the given prefix -# Usage: pyenv latest [-k|--known] [-q|--quiet] +# Usage: pyenv latest [-k|--known] # # -k/--known Select from all known versions instead of installed -# -q/--quiet Do not print an error message on resolution failure +# -b/--bypass (internal) On a resolution failure, do not print an error message +# but rather print the argument unchanged +# -f/--force (internal) Same as -b but also do not return a failure exit code set -e [ -n "$PYENV_DEBUG" ] && set -x @@ -15,8 +17,13 @@ do FROM_KNOWN=1 shift ;; - -q|--quiet) - QUIET=1 + -b|--bypass) + BYPASS=1 + shift + ;; + -f|--force) + FORCE=1 + BYPASS=1 shift ;; *) @@ -71,10 +78,14 @@ IFS=$'\n' if [[ -n "$DEFINITION" ]]; then echo "$DEFINITION" else - if [[ -z $QUIET ]]; then + if [[ -z $BYPASS ]]; then echo "pyenv: no $([[ -z $FROM_KNOWN ]] && echo installed || echo known) versions match the prefix \`$prefix'" >&2 + else + echo "$prefix" + fi + if [[ -z $FORCE ]]; then + exitcode=1 fi - exitcode=1 fi exit $exitcode diff --git a/libexec/pyenv-prefix b/libexec/pyenv-prefix index 261b865f..65bc5425 100755 --- a/libexec/pyenv-prefix +++ b/libexec/pyenv-prefix @@ -42,7 +42,7 @@ OLDIFS="$IFS" exit 1 fi else - version="$(pyenv-latest -q "$version" || echo "$version")" + version="$(pyenv-latest -f "$version")" PYENV_PREFIX_PATH="${PYENV_ROOT}/versions/${version}" fi if [ -d "$PYENV_PREFIX_PATH" ]; then diff --git a/libexec/pyenv-version-name b/libexec/pyenv-version-name index d06357cb..52d7f8d7 100755 --- a/libexec/pyenv-version-name +++ b/libexec/pyenv-version-name @@ -34,7 +34,7 @@ OLDIFS="$IFS" versions=("${versions[@]}" "${version}") elif version_exists "${version#python-}"; then versions=("${versions[@]}" "${version#python-}") - elif resolved_version="$(pyenv-latest -q "$version")"; then + elif resolved_version="$(pyenv-latest -b "$version")"; then versions=("${versions[@]}" "${resolved_version}") else echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2 diff --git a/plugins/python-build/bin/pyenv-install b/plugins/python-build/bin/pyenv-install index 2d5c356b..778489b7 100755 --- a/plugins/python-build/bin/pyenv-install +++ b/plugins/python-build/bin/pyenv-install @@ -158,7 +158,7 @@ for DEFINITION in "${DEFINITIONS[@]}"; do # Try to resolve a prefix if user indeed gave a prefix. # We install the version under the resolved name # and hooks also see the resolved name - DEFINITION="$(pyenv-latest -q -k "$DEFINITION" || echo "$DEFINITION")" + DEFINITION="$(pyenv-latest -f -k "$DEFINITION")" # Set VERSION_NAME from $DEFINITION. Then compute the installation prefix. VERSION_NAME="${DEFINITION##*/}" diff --git a/plugins/python-build/test/hooks.bats b/plugins/python-build/test/hooks.bats index 03289524..1c3ec343 100644 --- a/plugins/python-build/test/hooks.bats +++ b/plugins/python-build/test/hooks.bats @@ -15,9 +15,10 @@ after_install 'echo after: \$STATUS' OUT stub pyenv-hooks "install : echo '$HOOK_PATH'/install.bash" stub pyenv-rehash "echo rehashed" - stub pyenv-latest false definition="${TMP}/3.6.2" + stub pyenv-latest "echo $definition" + cat > "$definition" <<<"echo python-build" run pyenv-install "$definition" diff --git a/plugins/python-build/test/pyenv.bats b/plugins/python-build/test/pyenv.bats index 1ca82706..e521201c 100644 --- a/plugins/python-build/test/pyenv.bats +++ b/plugins/python-build/test/pyenv.bats @@ -18,7 +18,7 @@ stub_python_build_no_latest() { stub_python_build() { stub_python_build_no_latest "$@" - stub pyenv-latest false + stub pyenv-latest '-f -k * : shift 2; echo "$@"' } @test "install a single version" { @@ -65,9 +65,9 @@ OUT stub_python_build_lib for i in {1..3}; do stub_python_build_no_latest; done stub pyenv-latest \ - '-q -k 3.4 : echo 3.4.2' \ - '-q -k 3.5.1 : false' \ - '-q -k 3.5 : echo 3.5.2' + '-r -k 3.4 : echo 3.4.2' \ + '-r -k 3.5.1 : false' \ + '-r -k 3.5 : echo 3.5.2' run pyenv-install 3.4 3.5.1 3.5 assert_success < Date: Sun, 21 Jul 2024 06:30:27 +0300 Subject: [PATCH 129/246] Remove nop tests Easy syncing with Rbenv is not as important now --- plugins/python-build/test/build.bats | 48 ---------------------------- 1 file changed, 48 deletions(-) diff --git a/plugins/python-build/test/build.bats b/plugins/python-build/test/build.bats index aacef79f..3a1e4e6f 100644 --- a/plugins/python-build/test/build.bats +++ b/plugins/python-build/test/build.bats @@ -888,54 +888,6 @@ OUT assert_success "hello world" } -@test "mruby strategy overwrites non-writable files" { - # nop -} - -@test "mruby strategy fetches rake if missing" { - # nop -} - -@test "rbx uses bundle then rake" { - # nop -} - -@test "fixes rbx binstubs" { - # nop -} - -@test "JRuby build" { - # nop -} - -@test "JRuby+Graal does not install launchers" { - # nop -} - -@test "JRuby Java 7 missing" { - # nop -} - -@test "JRuby Java is outdated" { - # nop -} - -@test "JRuby Java 7 up-to-date" { - # nop -} - -@test "Java version string not on first line" { - # nop -} - -@test "Java version string on OpenJDK" { - # nop -} - -@test "JRuby Java 9 version string" { - # nop -} - @test "non-writable TMPDIR aborts build" { export TMPDIR="${TMP}/build" mkdir -p "$TMPDIR" From e9611beffe499f6e97afeb6b4851dc00a5e644e2 Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 21 Jul 2024 06:57:39 +0300 Subject: [PATCH 130/246] Fix tests failing if plugins are installed (#3022) Drop the failing test in favor of a better-written test that also tests the same --- test/pyenv.bats | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/test/pyenv.bats b/test/pyenv.bats index e7e8b419..ce22a447 100644 --- a/test/pyenv.bats +++ b/test/pyenv.bats @@ -46,12 +46,7 @@ load test_helper assert_output "pyenv: cannot change working directory to \`$dir'" } -@test "adds its own libexec to PATH" { - run pyenv echo "PATH" - assert_success "${BATS_TEST_DIRNAME%/*}/libexec:${BATS_TEST_DIRNAME%/*}/plugins/python-build/bin:$PATH" -} - -@test "adds plugin bin dirs to PATH" { +@test "adds its own libexec and plugin bin dirs to PATH" { mkdir -p "$PYENV_ROOT"/plugins/python-build/bin mkdir -p "$PYENV_ROOT"/plugins/pyenv-each/bin run pyenv echo -F: "PATH" From f17809c4b9db8d5c8108eae6b1890870fac481cf Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 21 Jul 2024 07:02:45 +0300 Subject: [PATCH 131/246] 2.4.8 --- CHANGELOG.md | 7 +++++++ libexec/pyenv---version | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a708898..82725ee4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Version History +## Release v2.4.8 +* Fix pyenv-uninstall not having the debug tracing invocation by @native-api in https://github.com/pyenv/pyenv/pull/3020 +* Add CPython 3.13.0b4 and 3.13.0b4t by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3019 +* README: Remove reference to Fig by @ThomasHaz in https://github.com/pyenv/pyenv/pull/3018 +* Fix tests failing if plugins are installed by @native-api in https://github.com/pyenv/pyenv/pull/3022 +* pyenv-latest: replace -q with -b and -f, document as internal by @native-api in https://github.com/pyenv/pyenv/pull/3021 + ## Release v2.4.7 * Add support for anaconda3-2024.06-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3009 * Fix debug build for X.Yt-dev by @native-api in https://github.com/pyenv/pyenv/pull/ diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 5fc62f46..13e651c6 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.7" +version="2.4.8" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 9b09a7efc9f763c721f4264e62e12e75568c647d Mon Sep 17 00:00:00 2001 From: Michael Goerz Date: Wed, 31 Jul 2024 05:41:59 -0400 Subject: [PATCH 132/246] Add miniforge3-24.3.0-0 (#3028) --- .../share/python-build/miniforge3-24.3.0-0 | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniforge3-24.3.0-0 diff --git a/plugins/python-build/share/python-build/miniforge3-24.3.0-0 b/plugins/python-build/share/python-build/miniforge3-24.3.0-0 new file mode 100644 index 00000000..981e85df --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-Linux-aarch64.sh#6c879fe354d3e26b8d960cff6b1f3cb9d2e58c79c5c07f23fff62469dc5c1480" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-Linux-ppc64le.sh#b7710f5dbab9a49995e027cc72cc729ad54506fbba7b936b56737d1437aa6504" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-Linux-x86_64.sh#23367676b610de826f50f7ddc91139a816d4b59bd4c69cc9b6082d9b2e7fe8a3" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-MacOSX-arm64.sh#9b3c3d9fa30437592e680390f2b27d45c5d5cfcbfad9a1af233f70a6d8be71a1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Miniforge3-24.3.0-0-MacOSX-x86_64.sh#26a80621b146d60e5ae0d896b83ec138416653b951286361b1f93a804cb6a8d9" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 6511ce26cd52c1a604f79516f2d02a96e7b986a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Sat, 3 Aug 2024 05:11:56 -0600 Subject: [PATCH 133/246] Add CPython 3.13.0rc1 (#3029) --- plugins/python-build/share/python-build/3.13.0b4t | 2 -- .../python-build/share/python-build/{3.13.0b4 => 3.13.0rc1} | 4 ++-- plugins/python-build/share/python-build/3.13.0rc1t | 2 ++ 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.13.0b4t rename plugins/python-build/share/python-build/{3.13.0b4 => 3.13.0rc1} (52%) create mode 100644 plugins/python-build/share/python-build/3.13.0rc1t diff --git a/plugins/python-build/share/python-build/3.13.0b4t b/plugins/python-build/share/python-build/3.13.0b4t deleted file mode 100644 index 4bc52401..00000000 --- a/plugins/python-build/share/python-build/3.13.0b4t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0b4 diff --git a/plugins/python-build/share/python-build/3.13.0b4 b/plugins/python-build/share/python-build/3.13.0rc1 similarity index 52% rename from plugins/python-build/share/python-build/3.13.0b4 rename to plugins/python-build/share/python-build/3.13.0rc1 index 4f3e28e7..42986417 100644 --- a/plugins/python-build/share/python-build/3.13.0b4 +++ b/plugins/python-build/share/python-build/3.13.0rc1 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.3.1" "https://www.openssl.org/source/openssl-3.3.1.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.13.0b4" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b4.tar.xz#b2aa557c3c875233abdaf1b124284e5d50f6bb238d62a8b55f12dc92cea1953f" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0rc1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc1.tar.xz#678b884775eec0224d5159fa900879020baca2a36ce942fd95febfa1adb4a6bd" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.13.0b4" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0b4.tgz#6f387984d028686c008a822cf6887e47d8dbc460ebc022358082ecacac5113e6" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0rc1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc1.tgz#53f1ed4920b82fa65cd32a56fa80fd18b475bf1b757597a5a104d2a4dfa5ffff" standard verify_py313 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.13.0rc1t b/plugins/python-build/share/python-build/3.13.0rc1t new file mode 100644 index 00000000..f2c937cf --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0rc1t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0rc1 From 9e7010b72f43cf4ea6c4a8798bb94efca0a9f8b7 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Mon, 5 Aug 2024 01:54:31 +0300 Subject: [PATCH 134/246] 2.4.9 --- CHANGELOG.md | 4 ++++ libexec/pyenv---version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 82725ee4..9aa2b886 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Version History +## Release v2.4.9 +* Add miniforge3-24.3.0-0 by @goerz in https://github.com/pyenv/pyenv/pull/3028 +* Add CPython 3.13.0rc1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3029 + ## Release v2.4.8 * Fix pyenv-uninstall not having the debug tracing invocation by @native-api in https://github.com/pyenv/pyenv/pull/3020 * Add CPython 3.13.0b4 and 3.13.0b4t by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3019 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 13e651c6..dee0b272 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.8" +version="2.4.9" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 11efbdce46e05a01d6a8d038b514e81cedf2b3d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Wed, 7 Aug 2024 10:40:19 -0600 Subject: [PATCH 135/246] Add CPython 3.12.5 (#3030) --- plugins/python-build/share/python-build/3.12.5 | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.12.5 diff --git a/plugins/python-build/share/python-build/3.12.5 b/plugins/python-build/share/python-build/3.12.5 new file mode 100644 index 00000000..d067a27e --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.5 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.1" "https://www.openssl.org/source/openssl-3.3.1.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.5" "https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tar.xz#fa8a2e12c5e620b09f53e65bcd87550d2e5a1e2e04bf8ba991dcc55113876397" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.5" "https://www.python.org/ftp/python/3.12.5/Python-3.12.5.tgz#38dc4e2c261d49c661196066edbfb70fdb16be4a79cc8220c224dfeb5636d405" standard verify_py312 copy_python_gdb ensurepip +fi From 9ecd803bffaffb949fbdd8c70cb086227f6a3202 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 7 Aug 2024 20:16:29 +0300 Subject: [PATCH 136/246] 2.4.10 --- CHANGELOG.md | 3 +++ libexec/pyenv---version | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9aa2b886..515f965d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Version History +## Release v2.4.10 +* Add CPython 3.12.5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3030 + ## Release v2.4.9 * Add miniforge3-24.3.0-0 by @goerz in https://github.com/pyenv/pyenv/pull/3028 * Add CPython 3.13.0rc1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3029 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index dee0b272..a29a138e 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.9" +version="2.4.10" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 57a67724518c659f4bc46e2c5aa5fb56621acd43 Mon Sep 17 00:00:00 2001 From: Tom Schraitle Date: Sat, 24 Aug 2024 11:38:54 +0200 Subject: [PATCH 137/246] Add /usr/etc/pyenv.d to hooks path (#3039) The directory /usr/etc is an optional directory and used by Fedora, RHEL 9, and openSUSE. The purpose of /usr/etc is to store distribution-provided configuration files that can be overridden by user-modified files in /etc. /usr/etc is not in FHS. However, as Torsten stated in his comment (https://github.com/thkukuk/atomic-updates_and_etc/issues/2#issuecomment-524848666) "[FHS] is currently nearly as dead as LSB, we can only ignore it if we don't want to stop and kill all innovation." --- libexec/pyenv | 2 +- test/pyenv.bats | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libexec/pyenv b/libexec/pyenv index fdea4911..a4b0c3ae 100755 --- a/libexec/pyenv +++ b/libexec/pyenv @@ -94,7 +94,7 @@ if [ "${bin_path%/*}" != "$PYENV_ROOT" ]; then # Add pyenv's own `pyenv.d` unless pyenv was cloned to PYENV_ROOT PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${bin_path%/*}/pyenv.d" fi -PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks" +PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:/usr/etc/pyenv.d:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks" for plugin_hook in "${PYENV_ROOT}/plugins/"*/etc/pyenv.d; do PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${plugin_hook}" done diff --git a/test/pyenv.bats b/test/pyenv.bats index ce22a447..8b6dae91 100644 --- a/test/pyenv.bats +++ b/test/pyenv.bats @@ -68,5 +68,5 @@ load test_helper @test "PYENV_HOOK_PATH includes pyenv built-in plugins" { unset PYENV_HOOK_PATH run pyenv echo "PYENV_HOOK_PATH" - assert_success "${PYENV_ROOT}/pyenv.d:${BATS_TEST_DIRNAME%/*}/pyenv.d:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks" + assert_success "${PYENV_ROOT}/pyenv.d:${BATS_TEST_DIRNAME%/*}/pyenv.d:/usr/etc/pyenv.d:/usr/local/etc/pyenv.d:/etc/pyenv.d:/usr/lib/pyenv/hooks" } From 669d1f1038fe0e794b5868310ce9eaac2566d111 Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Sat, 24 Aug 2024 17:42:23 +0800 Subject: [PATCH 138/246] Add miniconda3-24.7.1-0 support (#3040) Co-authored-by: binbjz --- .../python-build/miniconda3-3.10-24.7.1-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-24.7.1-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-24.7.1-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-24.7.1-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.7.1-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.7.1-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.7.1-0 new file mode 100644 index 00000000..8db8d335 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-Linux-aarch64.sh#8a5f3510b91f9641c72046f82974a2b95f0b7fee7ed3a9f8223fd5e447c13a2e" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-Linux-s390x.sh#f0fa28fb5ee38ac1950fdb22cbef435f08dbe1846690a7757298e5021152ad38" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-Linux-x86_64.sh#684cda724bc37e3bbbb342e440fc4cac515c92e91a489eb4359feca35382894b" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-MacOSX-arm64.sh#0205a5fca4648832f1a0a3862149722dded533cabbb1d274609f883690e7ee72" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.7.1-0-MacOSX-x86_64.sh#fb3406a97b59c665640ab427694844676c9c4d3ab7ca551866381b4e547b4dcf" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.7.1-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.7.1-0 new file mode 100644 index 00000000..305c4a39 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-Linux-aarch64.sh#f0ade904394ac5058dc293dd242a8af5c2005d28e020185691df32a5cc7ce0a0" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-Linux-s390x.sh#124b8f0df8c23e673409a68320f594a32e4e9e9608a3a6be1fddc0d597410e01" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-Linux-x86_64.sh#a098a5b1581d8fd078c430b82e27106602223e335efef708a124e723814d120c" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-MacOSX-arm64.sh#9e7a3e0b835c0b18d561041a49311280ed58a7424a3324da370e69d4350eabcd" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.7.1-0-MacOSX-x86_64.sh#e459d9478ece4415e1a2e9b127da7240823e7d1bf6207a4d92779081b351f773" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.7.1-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.7.1-0 new file mode 100644 index 00000000..78f0af47 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-aarch64.sh#bdace1e233cda30ce37105de627e646ae8e04b036373eacfcd7fa8e35949f1b7" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-s390x.sh#5a454c59314f63a0b860e2ed27d68f4a2516c77a7beda919fc11d3cd03c6b2d2" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-Linux-x86_64.sh#33442cd3813df33dcbb4a932b938ee95398be98344dff4c30f7e757cd2110e4f" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-MacOSX-arm64.sh#e7ef5a899f9383d14d5b15aef61d54a8cd9bf3c4de18a372af0455d8f5f78cd2" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.7.1-0-MacOSX-x86_64.sh#5cfb85d81d94dfe3ef3265f2247aef32a35aeb450ea71c3a204cefed384fb87d" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.7.1-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.7.1-0 new file mode 100644 index 00000000..ddffbad3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.7.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-aarch64.sh#dc6d508f463b19def014d34b61297df30cc15eeac9cf47eb372634812b6721e6" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.7.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-s390x.sh#31553ed04ff777deefbb76bb194a2212ccf1168f2757f36794a567f58bb94ae1" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.7.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-Linux-x86_64.sh#2006a61abc8b4fd04de5eb92620e1f72bada713cc84b5b4899463095e1210556" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.7.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-MacOSX-arm64.sh#f50fceaf2d42c898559adae1ee17c22c452824a909370fdec8d4fcf844696f06" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.7.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.7.1-0-MacOSX-x86_64.sh#f5035c0595f791a822fbf3bf5b555e8e68fe33437affa3811b125ebd39efbe81" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 5fcd9d7a4f09563da7f1e929d6af0e12c39d6c0c Mon Sep 17 00:00:00 2001 From: John Sirois Date: Wed, 4 Sep 2024 12:15:59 -0700 Subject: [PATCH 139/246] Add PyPy v7.3.17. (#3045) N.B.: 7.3.17 frops Python 3.9 support as well as s390x platform releases. See: https://pypy.org/posts/2024/08/pypy-v7317-release.html --- .../share/python-build/pypy2.7-7.3.17 | 77 +++++++++++++++++++ .../share/python-build/pypy2.7-7.3.17-src | 14 ++++ .../share/python-build/pypy3.10-7.3.17 | 77 +++++++++++++++++++ .../share/python-build/pypy3.10-7.3.17-src | 14 ++++ 4 files changed, 182 insertions(+) create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.17 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.17-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.17 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.17-src diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.17 b/plugins/python-build/share/python-build/pypy2.7-7.3.17 new file mode 100644 index 00000000..54138c49 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.17 @@ -0,0 +1,77 @@ +VERSION='7.3.17' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=a8df5ce1650f4756933f8780870c91a0a40e7c9870d74629bf241392bcb5c2e3 +linux32_hash=a3aa0867cc837a34941047ece0fbb6ca190410fae6ad35fae4999d03bf178750 +linux64_hash=9f3497f87b3372d17e447369e0016a4bec99a6b4d2a59aba774a25bfe4353474 +osarm64_hash=8573172db377ee0831bf20492cdee9bac4e0b194e3dfe8bf7c44ee257a824766 +osx64_hash=e3e1af1d6ad15e51d8d19ea36e1ac65c4c792314cc8b8dc5cf771ec4353b50f8 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.17-src b/plugins/python-build/share/python-build/pypy2.7-7.3.17-src new file mode 100644 index 00000000..28c84dc1 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.17-src @@ -0,0 +1,14 @@ +VERSION='7.3.17' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=50e06840f4bbde91448080a4118068a89b8fbcae25ff8da1e2bb1402dc9a0346 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.17 b/plugins/python-build/share/python-build/pypy3.10-7.3.17 new file mode 100644 index 00000000..44cdf64d --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.17 @@ -0,0 +1,77 @@ +VERSION='7.3.17' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=53b6e5907df869c49e4eae7aca09fba16d150741097efb245892c1477d2395f2 +linux32_hash=e534110e1047da37c1d586c392f74de3424f871d906a2083de6d41f2a8cc9164 +linux64_hash=fdcdb9b24f1a7726003586503fdeb264fd68fc37fbfcea022dcfe825a7fee18b +osarm64_hash=a050e25e8d686853dd5afc363e55625165825dacfb55f8753d8225ebe417cfd2 +osx64_hash=6c2c5f2300d7564e711421b4968abd63243cb96f76e363975dd648ebf4a362ee + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.17-src b/plugins/python-build/share/python-build/pypy3.10-7.3.17-src new file mode 100644 index 00000000..e94a3a85 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.17-src @@ -0,0 +1,14 @@ +VERSION='7.3.17' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=6ad74bc578e9c6d3a8a1c51503313058e3c58c35df86f7485453c4be6ab24bf7 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' From b123520826ad9daa141980d459ef0977b581f918 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 4 Sep 2024 22:52:25 +0300 Subject: [PATCH 140/246] 2.4.11 --- CHANGELOG.md | 5 +++++ libexec/pyenv---version | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 515f965d..df8607cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Version History +## Release v2.4.11 +* Add /usr/etc/pyenv.d to hooks path by @tomschr in https://github.com/pyenv/pyenv/pull/3039 +* Add miniconda3-24.7.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3040 +* Add PyPy v7.3.17 by @jsirois in https://github.com/pyenv/pyenv/pull/3045 + ## Release v2.4.10 * Add CPython 3.12.5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3030 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index a29a138e..f61ada2e 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.10" +version="2.4.11" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From ac5c87e044c72062da16b28602a853ee505673b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Sat, 7 Sep 2024 09:46:46 -0600 Subject: [PATCH 141/246] Add CPython 3.13.0rc2 (#3049) --- plugins/python-build/share/python-build/3.13.0rc1 | 9 --------- plugins/python-build/share/python-build/3.13.0rc1t | 2 -- plugins/python-build/share/python-build/3.13.0rc2 | 9 +++++++++ plugins/python-build/share/python-build/3.13.0rc2t | 2 ++ 4 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.13.0rc1 delete mode 100644 plugins/python-build/share/python-build/3.13.0rc1t create mode 100644 plugins/python-build/share/python-build/3.13.0rc2 create mode 100644 plugins/python-build/share/python-build/3.13.0rc2t diff --git a/plugins/python-build/share/python-build/3.13.0rc1 b/plugins/python-build/share/python-build/3.13.0rc1 deleted file mode 100644 index 42986417..00000000 --- a/plugins/python-build/share/python-build/3.13.0rc1 +++ /dev/null @@ -1,9 +0,0 @@ -prefer_openssl3 -export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.3.1" "https://www.openssl.org/source/openssl-3.3.1.tar.gz#777cd596284c883375a2a7a11bf5d2786fc5413255efab20c50d6ffe6d020b7e" mac_openssl --if has_broken_mac_openssl -install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline -if has_tar_xz_support; then - install_package "Python-3.13.0rc1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc1.tar.xz#678b884775eec0224d5159fa900879020baca2a36ce942fd95febfa1adb4a6bd" standard verify_py313 copy_python_gdb ensurepip -else - install_package "Python-3.13.0rc1" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc1.tgz#53f1ed4920b82fa65cd32a56fa80fd18b475bf1b757597a5a104d2a4dfa5ffff" standard verify_py313 copy_python_gdb ensurepip -fi diff --git a/plugins/python-build/share/python-build/3.13.0rc1t b/plugins/python-build/share/python-build/3.13.0rc1t deleted file mode 100644 index f2c937cf..00000000 --- a/plugins/python-build/share/python-build/3.13.0rc1t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0rc1 diff --git a/plugins/python-build/share/python-build/3.13.0rc2 b/plugins/python-build/share/python-build/3.13.0rc2 new file mode 100644 index 00000000..ff72cd54 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0rc2 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.2" "https://www.openssl.org/source/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.0rc2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc2.tar.xz#d60e8b7c10de4f71d2dffaf7c7be8efa54dc1e532fe931dbb84e5f625709e237" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.0rc2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc2.tgz#d08965c543f21d9949b2715b50d7e4619a5c13984a2ba6d2efcabf413d41479a" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.0rc2t b/plugins/python-build/share/python-build/3.13.0rc2t new file mode 100644 index 00000000..bc4ce0e5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0rc2t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0rc2 From d8c8338cd881b7621fc4dfd931ee3b005604fe1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Sat, 7 Sep 2024 09:47:51 -0600 Subject: [PATCH 142/246] Add CPython 3.8.20, 3.9.20, 3.10.15, 3.11.10 and 3.12.6 (#3050) --- plugins/python-build/share/python-build/3.10.15 | 9 +++++++++ plugins/python-build/share/python-build/3.11.10 | 10 ++++++++++ plugins/python-build/share/python-build/3.12.6 | 9 +++++++++ plugins/python-build/share/python-build/3.8.20 | 12 ++++++++++++ plugins/python-build/share/python-build/3.9.20 | 12 ++++++++++++ 5 files changed, 52 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.10.15 create mode 100644 plugins/python-build/share/python-build/3.11.10 create mode 100644 plugins/python-build/share/python-build/3.12.6 create mode 100644 plugins/python-build/share/python-build/3.8.20 create mode 100644 plugins/python-build/share/python-build/3.9.20 diff --git a/plugins/python-build/share/python-build/3.10.15 b/plugins/python-build/share/python-build/3.10.15 new file mode 100644 index 00000000..a42cd118 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.15 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.15" "https://www.python.org/ftp/python/3.10.15/Python-3.10.15.tar.xz#aab0950817735172601879872d937c1e4928a57c409ae02369ec3d91dccebe79" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.15" "https://www.python.org/ftp/python/3.10.15/Python-3.10.15.tgz#a27864e5ba2a4474f8f6c58ab92ff52767ac8b66f1646923355a53fe3ef15074" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.10 b/plugins/python-build/share/python-build/3.11.10 new file mode 100644 index 00000000..79b49098 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.10 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.2" "https://www.openssl.org/source/openssl-3.2.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.10" "https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tar.xz#07a4356e912900e61a15cb0949a06c4a05012e213ecd6b4e84d0f67aabbee372" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.10" "https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tgz#92f2faf242681bfa406d53a51e17d42c5373affe23a130cd9697e132ef574706" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.6 b/plugins/python-build/share/python-build/3.12.6 new file mode 100644 index 00000000..712ccf0e --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.6 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.2" "https://www.openssl.org/source/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tar.xz#1999658298cf2fb837dffed8ff3c033ef0c98ef20cf73c5d5f66bed5ab89697c" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tgz#85a4c1be906d20e5c5a69f2466b00da769c221d6a684acfd3a514dbf5bf10a66" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.8.20 b/plugins/python-build/share/python-build/3.8.20 new file mode 100644 index 00000000..a01e7b5a --- /dev/null +++ b/plugins/python-build/share/python-build/3.8.20 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.8.20" "https://www.python.org/ftp/python/3.8.20/Python-3.8.20.tar.xz#6fb89a7124201c61125c0ab4cf7f6894df339a40c02833bfd28ab4d7691fafb4" standard verify_py38 copy_python_gdb ensurepip +else + install_package "Python-3.8.20" "https://www.python.org/ftp/python/3.8.20/Python-3.8.20.tgz#9f2d5962c2583e67ef75924cd56d0c1af78bf45ec57035cf8a2cc09f74f4bf78" standard verify_py38 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.20 b/plugins/python-build/share/python-build/3.9.20 new file mode 100644 index 00000000..9a888d12 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.20 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.20" "https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tar.xz#6b281279efd85294d2d6993e173983a57464c0133956fbbb5536ec9646beaf0c" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.20" "https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tgz#9f2d5962c2583e67ef75924cd56d0c1af78bf45ec57035cf8a2cc09f74f4bf78" standard verify_py39 copy_python_gdb ensurepip +fi From 2e658d3e3574074ba24ffd10ad67b1c8e2ff717d Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sat, 7 Sep 2024 18:50:46 +0300 Subject: [PATCH 143/246] 2.4.12 --- CHANGELOG.md | 4 ++++ libexec/pyenv---version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index df8607cf..9d73f904 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Version History +## Release v2.4.12 +* Add CPython 3.13.0rc2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3049 +* Add CPython 3.8.20, 3.9.20, 3.10.15, 3.11.10 and 3.12.6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3050 + ## Release v2.4.11 * Add /usr/etc/pyenv.d to hooks path by @tomschr in https://github.com/pyenv/pyenv/pull/3039 * Add miniconda3-24.7.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3040 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index f61ada2e..39561bbb 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.11" +version="2.4.12" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 1cabb6e02b1408b783038627a4ad1d30eabb7f10 Mon Sep 17 00:00:00 2001 From: Andrew Linzie Date: Sun, 8 Sep 2024 15:13:47 -0400 Subject: [PATCH 144/246] docs: Use `--verbose` with performance CPython build instructions (#3053) --- plugins/python-build/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index 2c02e76c..b717512f 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -208,7 +208,7 @@ enables PGO (profile guided optimization). While your mileage may vary, it is common for performance improvement from this to be in the ballpark of 30%. ```sh -env PYTHON_CONFIGURE_OPTS='--enable-optimizations --with-lto' PYTHON_CFLAGS='-march=native -mtune=native' pyenv install 3.6.0 +env PYTHON_CONFIGURE_OPTS='--enable-optimizations --with-lto' PYTHON_CFLAGS='-march=native -mtune=native' pyenv install --verbose 3.6.0 ``` You can also customize the task used for profile guided optimization by setting From d60d1c5cdc04cfd6f2ddf5ff222216b6cd8d3ac7 Mon Sep 17 00:00:00 2001 From: Ed Morley <501702+edmorley@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:51:55 +0000 Subject: [PATCH 145/246] Fix latest version resolution when using `python-` prefix (#3056) Fixes use of version specifiers like `python-3.12`, which: - have an explicit `python-` prefix - are using a major version alias that has to be resolved to an exact version. Also simplified the conditional for the already working case, since it had two branches that were virtually identical. --- libexec/pyenv-version-name | 10 +++++----- test/version-name.bats | 7 +++++++ 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libexec/pyenv-version-name b/libexec/pyenv-version-name index 52d7f8d7..73093b31 100755 --- a/libexec/pyenv-version-name +++ b/libexec/pyenv-version-name @@ -30,11 +30,11 @@ OLDIFS="$IFS" { IFS=: any_not_installed=0 for version in ${PYENV_VERSION}; do - if version_exists "$version" || [ "$version" = "system" ]; then - versions=("${versions[@]}" "${version}") - elif version_exists "${version#python-}"; then - versions=("${versions[@]}" "${version#python-}") - elif resolved_version="$(pyenv-latest -b "$version")"; then + # Remove the explicit 'python-' prefix from versions like 'python-3.12'. + normalised_version="${version#python-}" + if version_exists "${normalised_version}" || [ "$version" = "system" ]; then + versions=("${versions[@]}" "${normalised_version}") + elif resolved_version="$(pyenv-latest -b "${normalised_version}")"; then versions=("${versions[@]}" "${resolved_version}") else echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2 diff --git a/test/version-name.bats b/test/version-name.bats index 20e2de3b..e3c9a6a4 100644 --- a/test/version-name.bats +++ b/test/version-name.bats @@ -120,3 +120,10 @@ OUT assert_success assert_output "2.7.11" } + +@test "pyenv-latest fallback with prefix in name" { + create_version "3.12.6" + PYENV_VERSION="python-3.12" run pyenv-version-name + assert_success + assert_output "3.12.6" +} From 9c40f0b67e668d85944cf7c1af2a58a1a54f550c Mon Sep 17 00:00:00 2001 From: native-api Date: Thu, 12 Sep 2024 01:44:05 +0300 Subject: [PATCH 146/246] Fix tgz checksum for 3.9.20; fallback OpenSSL URLs checksums for 3.11.10, 3.12.6, 3.13.0rc2 (#3060) changed OpenSSL URLs to permalinks so that they keep working --- plugins/python-build/share/python-build/3.11.10 | 2 +- plugins/python-build/share/python-build/3.12.6 | 2 +- plugins/python-build/share/python-build/3.13.0rc2 | 2 +- plugins/python-build/share/python-build/3.9.20 | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/python-build/share/python-build/3.11.10 b/plugins/python-build/share/python-build/3.11.10 index 79b49098..ae40b14f 100644 --- a/plugins/python-build/share/python-build/3.11.10 +++ b/plugins/python-build/share/python-build/3.11.10 @@ -1,7 +1,7 @@ prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 -install_package "openssl-3.2.2" "https://www.openssl.org/source/openssl-3.2.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.2.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.11.10" "https://www.python.org/ftp/python/3.11.10/Python-3.11.10.tar.xz#07a4356e912900e61a15cb0949a06c4a05012e213ecd6b4e84d0f67aabbee372" standard verify_py311 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.12.6 b/plugins/python-build/share/python-build/3.12.6 index 712ccf0e..8323869a 100644 --- a/plugins/python-build/share/python-build/3.12.6 +++ b/plugins/python-build/share/python-build/3.12.6 @@ -1,6 +1,6 @@ prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.3.2" "https://www.openssl.org/source/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.3.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tar.xz#1999658298cf2fb837dffed8ff3c033ef0c98ef20cf73c5d5f66bed5ab89697c" standard verify_py312 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.13.0rc2 b/plugins/python-build/share/python-build/3.13.0rc2 index ff72cd54..aebf7c49 100644 --- a/plugins/python-build/share/python-build/3.13.0rc2 +++ b/plugins/python-build/share/python-build/3.13.0rc2 @@ -1,6 +1,6 @@ prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.3.2" "https://www.openssl.org/source/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.3.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.0rc2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc2.tar.xz#d60e8b7c10de4f71d2dffaf7c7be8efa54dc1e532fe931dbb84e5f625709e237" standard verify_py313 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.9.20 b/plugins/python-build/share/python-build/3.9.20 index 9a888d12..a3af19d8 100644 --- a/plugins/python-build/share/python-build/3.9.20 +++ b/plugins/python-build/share/python-build/3.9.20 @@ -8,5 +8,5 @@ install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1. if has_tar_xz_support; then install_package "Python-3.9.20" "https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tar.xz#6b281279efd85294d2d6993e173983a57464c0133956fbbb5536ec9646beaf0c" standard verify_py39 copy_python_gdb ensurepip else - install_package "Python-3.9.20" "https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tgz#9f2d5962c2583e67ef75924cd56d0c1af78bf45ec57035cf8a2cc09f74f4bf78" standard verify_py39 copy_python_gdb ensurepip + install_package "Python-3.9.20" "https://www.python.org/ftp/python/3.9.20/Python-3.9.20.tgz#1e71f006222666e0a39f5a47be8221415c22c4dd8f25334cc41aee260b3d379e" standard verify_py39 copy_python_gdb ensurepip fi From 6517caf5836978d3cef831c9c24038be0c4d741f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Wed, 11 Sep 2024 22:43:03 -0600 Subject: [PATCH 147/246] Fix OpenSSL 3.3.2 download URLs (#3059) --- plugins/python-build/share/python-build/3.12.6 | 2 +- plugins/python-build/share/python-build/3.13.0rc2 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/python-build/share/python-build/3.12.6 b/plugins/python-build/share/python-build/3.12.6 index 8323869a..73e2f6eb 100644 --- a/plugins/python-build/share/python-build/3.12.6 +++ b/plugins/python-build/share/python-build/3.12.6 @@ -1,6 +1,6 @@ prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.3.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.12.6" "https://www.python.org/ftp/python/3.12.6/Python-3.12.6.tar.xz#1999658298cf2fb837dffed8ff3c033ef0c98ef20cf73c5d5f66bed5ab89697c" standard verify_py312 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.13.0rc2 b/plugins/python-build/share/python-build/3.13.0rc2 index aebf7c49..3d168da2 100644 --- a/plugins/python-build/share/python-build/3.13.0rc2 +++ b/plugins/python-build/share/python-build/3.13.0rc2 @@ -1,6 +1,6 @@ prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.3.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.0rc2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc2.tar.xz#d60e8b7c10de4f71d2dffaf7c7be8efa54dc1e532fe931dbb84e5f625709e237" standard verify_py313 copy_python_gdb ensurepip From d8f5b583bd3971ce0f85821fc1721d21283d14a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20=C5=A0im=C3=A1=C4=8Dek?= Date: Wed, 18 Sep 2024 06:33:27 +0200 Subject: [PATCH 148/246] Add GraalPy 24.1.0 (#3066) --- .../share/python-build/graalpy-24.1.0 | 64 +++++++++++++++++++ .../python-build/graalpy-community-24.1.0 | 54 ++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-24.1.0 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.1.0 diff --git a/plugins/python-build/share/python-build/graalpy-24.1.0 b/plugins/python-build/share/python-build/graalpy-24.1.0 new file mode 100644 index 00000000..2af5024d --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.1.0 @@ -0,0 +1,64 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.0' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="95819091eee7c21566601c22536768204b7c75e9b59e522a10961612a1dd6298" + ;; +"linux-aarch64" ) + checksum="838662e07ce745708d58a50e5e030f9af608306c4595adb3a8e7ac1f6e7d8b6a" + ;; +"macos-amd64" ) + checksum="4bee92fdf97ef9e2f9a8dfc56030b9f40860019bf57c9cd097a4b86baaf31d94" + ;; +"macos-aarch64" ) + checksum="520888b407e47c8bbc91b0830d540a1eb1a6919ad0ce5be3e657e54f77ee0fba" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.1.0 b/plugins/python-build/share/python-build/graalpy-community-24.1.0 new file mode 100644 index 00000000..b2b48ec8 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.1.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="89c7f8bd8f91639adc815949458d56ea9bffaa286249360d244fc6a6885c220a" + ;; +"linux-aarch64" ) + checksum="8f52958486606328a9692a0c0553f2cd3afd1c86c9df97ae47a703afc2e804a8" + ;; +"macos-amd64" ) + checksum="1b01102ca9cbfe8164e935ca834226db76e8ca9359a5585ba686430593cbc02d" + ;; +"macos-aarch64" ) + checksum="cd0d6064bbb4f92d50d2b85ed46f6a9c22a5ae775f15cc264508da8f026eecaa" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip From 62fc392515d98067fcdd355eb6a3bc0bd08c2bc0 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 18 Sep 2024 07:38:48 +0300 Subject: [PATCH 149/246] 2.4.13 --- CHANGELOG.md | 7 +++++++ libexec/pyenv---version | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d73f904..36dbda1e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Version History +## Release v2.4.13 +* docs: Use `--verbose` with performance CPython build instructions by @caerulescens in https://github.com/pyenv/pyenv/pull/3053 +* Fix latest version resolution when using `python-` prefix by @edmorley in https://github.com/pyenv/pyenv/pull/3056 +* Fix tgz checksum for 3.9.20; fallback OpenSSL URLs and checksums by @native-api in https://github.com/pyenv/pyenv/pull/3060 +* Fix OpenSSL 3.3.2 download URLs by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3059 +* Add GraalPy 24.1.0 by @msimacek in https://github.com/pyenv/pyenv/pull/3066 + ## Release v2.4.12 * Add CPython 3.13.0rc2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3049 * Add CPython 3.8.20, 3.9.20, 3.10.15, 3.11.10 and 3.12.6 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3050 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 39561bbb..974787c6 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.12" +version="2.4.13" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 3f2ef9e00afcdca2aadd07a4294269291dd8cc62 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sat, 28 Sep 2024 21:04:59 +0300 Subject: [PATCH 150/246] README: Clarify Zsh configuration Closes #3069 --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 32a0cdb2..a801abfc 100644 --- a/README.md +++ b/README.md @@ -329,6 +329,8 @@ See [Advanced configuration](#advanced-configuration) for details and more confi ~~~ - For **Zsh**: + + Run the following to add the commands to `~/.zshrc`: ~~~ zsh echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc From 55134ea1a1c00abd214e5d71ac76df7cac545b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Wed, 2 Oct 2024 05:50:30 -0600 Subject: [PATCH 151/246] Add CPython 3.12.7 (#3078) --- plugins/python-build/share/python-build/3.12.7 | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.12.7 diff --git a/plugins/python-build/share/python-build/3.12.7 b/plugins/python-build/share/python-build/3.12.7 new file mode 100644 index 00000000..00a35778 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.7 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.7" "https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tar.xz#24887b92e2afd4a2ac602419ad4b596372f67ac9b077190f459aba390faf5550" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.7" "https://www.python.org/ftp/python/3.12.7/Python-3.12.7.tgz#73ac8fe780227bf371add8373c3079f42a0dc62deff8d612cd15a618082ab623" standard verify_py312 copy_python_gdb ensurepip +fi From 95917cb753638cd1b9acc1d2b2c4686d8a934d10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Wed, 2 Oct 2024 05:50:59 -0600 Subject: [PATCH 152/246] Add CPython 3.13.0rc3 (#3077) --- plugins/python-build/share/python-build/3.13.0rc2t | 2 -- .../python-build/share/python-build/{3.13.0rc2 => 3.13.0rc3} | 4 ++-- plugins/python-build/share/python-build/3.13.0rc3t | 2 ++ 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.13.0rc2t rename plugins/python-build/share/python-build/{3.13.0rc2 => 3.13.0rc3} (59%) create mode 100644 plugins/python-build/share/python-build/3.13.0rc3t diff --git a/plugins/python-build/share/python-build/3.13.0rc2t b/plugins/python-build/share/python-build/3.13.0rc2t deleted file mode 100644 index bc4ce0e5..00000000 --- a/plugins/python-build/share/python-build/3.13.0rc2t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0rc2 diff --git a/plugins/python-build/share/python-build/3.13.0rc2 b/plugins/python-build/share/python-build/3.13.0rc3 similarity index 59% rename from plugins/python-build/share/python-build/3.13.0rc2 rename to plugins/python-build/share/python-build/3.13.0rc3 index 3d168da2..e51efc86 100644 --- a/plugins/python-build/share/python-build/3.13.0rc2 +++ b/plugins/python-build/share/python-build/3.13.0rc3 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.13.0rc2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc2.tar.xz#d60e8b7c10de4f71d2dffaf7c7be8efa54dc1e532fe931dbb84e5f625709e237" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0rc3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc3.tar.xz#c8bc790185af1cb77b75c01cbc1aa642dfdcf97a370d2d10090bc7baa70da57e" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.13.0rc2" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc2.tgz#d08965c543f21d9949b2715b50d7e4619a5c13984a2ba6d2efcabf413d41479a" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0rc3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc3.tgz#e5e8611d1bfbfda4accf8fab868712252a9c5f6aa5f13f6a5093878a9ef38412" standard verify_py313 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.13.0rc3t b/plugins/python-build/share/python-build/3.13.0rc3t new file mode 100644 index 00000000..c814c506 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0rc3t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0rc3 From 5180c3cfb506006e16982602d0d82fa64e285a5b Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 2 Oct 2024 15:13:21 +0300 Subject: [PATCH 153/246] 2.4.14 --- CHANGELOG.md | 4 ++++ libexec/pyenv---version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36dbda1e..9e7c4550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Version History +## Release v2.4.14 +* Add CPython 3.12.7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3078 +* Add CPython 3.13.0rc3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3077 + ## Release v2.4.13 * docs: Use `--verbose` with performance CPython build instructions by @caerulescens in https://github.com/pyenv/pyenv/pull/3053 * Fix latest version resolution when using `python-` prefix by @edmorley in https://github.com/pyenv/pyenv/pull/3056 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 974787c6..aa3c259a 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.13" +version="2.4.14" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 468dc81107f33b0285718cb48aca53316de205a2 Mon Sep 17 00:00:00 2001 From: tuzi3040 <28290621+tuzi3040@users.noreply.github.com> Date: Wed, 2 Oct 2024 21:37:31 +0800 Subject: [PATCH 154/246] CI: replace set-output with GITHUB_OUTPUT (#3079) `::set-output` is deprecated as per https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/ --- .github/workflows/modified_scripts_build.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml index 1f5cf7f4..17717274 100644 --- a/.github/workflows/modified_scripts_build.yml +++ b/.github/workflows/modified_scripts_build.yml @@ -21,8 +21,7 @@ jobs: echo "$EOF" >> $GITHUB_ENV; - id: modified-versions run: | - echo -n "::set-output name=versions::" - echo "${{ env.versions }}" | jq -R . | jq -sc . + echo "versions=`echo "${{ env.versions }}" | jq -R . | jq -sc .`" >> $GITHUB_OUTPUT macos_build: needs: discover_modified_scripts if: needs.discover_modified_scripts.outputs.versions != '[""]' From d201daeb3366cae98cca88654b4c52018175ded5 Mon Sep 17 00:00:00 2001 From: David Poznik Date: Fri, 4 Oct 2024 16:17:45 -0700 Subject: [PATCH 155/246] Make "y/N" prompt consistent with others (#3080) --- plugins/python-build/bin/pyenv-uninstall | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/bin/pyenv-uninstall b/plugins/python-build/bin/pyenv-uninstall index f6b6fcdf..f95cd365 100755 --- a/plugins/python-build/bin/pyenv-uninstall +++ b/plugins/python-build/bin/pyenv-uninstall @@ -75,7 +75,7 @@ uninstall-python() { exit 1 fi - read -p "pyenv: remove $PREFIX? [y|N] " + read -p "pyenv: remove $PREFIX? (y/N) " case "$REPLY" in y | Y | yes | YES ) ;; * ) exit 1 ;; From 6a7ecfe4092f523217e9b4a5c0026e51f8dba810 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Mon, 7 Oct 2024 16:16:53 -0600 Subject: [PATCH 156/246] Add CPython 3.13.0 (#3081) --- plugins/python-build/share/python-build/{3.13.0rc3 => 3.13.0} | 4 ++-- plugins/python-build/share/python-build/3.13.0rc3t | 2 -- plugins/python-build/share/python-build/3.13.0t | 2 ++ 3 files changed, 4 insertions(+), 4 deletions(-) rename plugins/python-build/share/python-build/{3.13.0rc3 => 3.13.0} (54%) delete mode 100644 plugins/python-build/share/python-build/3.13.0rc3t create mode 100644 plugins/python-build/share/python-build/3.13.0t diff --git a/plugins/python-build/share/python-build/3.13.0rc3 b/plugins/python-build/share/python-build/3.13.0 similarity index 54% rename from plugins/python-build/share/python-build/3.13.0rc3 rename to plugins/python-build/share/python-build/3.13.0 index e51efc86..4f73ad83 100644 --- a/plugins/python-build/share/python-build/3.13.0rc3 +++ b/plugins/python-build/share/python-build/3.13.0 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.13.0rc3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc3.tar.xz#c8bc790185af1cb77b75c01cbc1aa642dfdcf97a370d2d10090bc7baa70da57e" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tar.xz#086de5882e3cb310d4dca48457522e2e48018ecd43da9cdf827f6a0759efb07d" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.13.0rc3" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0rc3.tgz#e5e8611d1bfbfda4accf8fab868712252a9c5f6aa5f13f6a5093878a9ef38412" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.13.0" "https://www.python.org/ftp/python/3.13.0/Python-3.13.0.tgz#12445c7b3db3126c41190bfdc1c8239c39c719404e844babbd015a1bc3fafcd4" standard verify_py313 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.13.0rc3t b/plugins/python-build/share/python-build/3.13.0rc3t deleted file mode 100644 index c814c506..00000000 --- a/plugins/python-build/share/python-build/3.13.0rc3t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0rc3 diff --git a/plugins/python-build/share/python-build/3.13.0t b/plugins/python-build/share/python-build/3.13.0t new file mode 100644 index 00000000..ecb94852 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.0t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.0 From 03b60aafecc7ce872b492a4878fe9a072cc5aa6e Mon Sep 17 00:00:00 2001 From: Antoine Arbouin Date: Thu, 10 Oct 2024 19:43:13 +0200 Subject: [PATCH 157/246] Support virtualenvs with names starting with "python-" (#3086) --- libexec/pyenv-version-name | 6 +++++- test/version-name.bats | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/libexec/pyenv-version-name b/libexec/pyenv-version-name index 73093b31..b3866dbd 100755 --- a/libexec/pyenv-version-name +++ b/libexec/pyenv-version-name @@ -32,8 +32,12 @@ OLDIFS="$IFS" for version in ${PYENV_VERSION}; do # Remove the explicit 'python-' prefix from versions like 'python-3.12'. normalised_version="${version#python-}" - if version_exists "${normalised_version}" || [ "$version" = "system" ]; then + if version_exists "${version}" || [ "$version" = "system" ]; then + versions=("${versions[@]}" "${version}") + elif version_exists "${normalised_version}"; then versions=("${versions[@]}" "${normalised_version}") + elif resolved_version="$(pyenv-latest -b "${version}")"; then + versions=("${versions[@]}" "${resolved_version}") elif resolved_version="$(pyenv-latest -b "${normalised_version}")"; then versions=("${versions[@]}" "${resolved_version}") else diff --git a/test/version-name.bats b/test/version-name.bats index e3c9a6a4..720f6c86 100644 --- a/test/version-name.bats +++ b/test/version-name.bats @@ -127,3 +127,10 @@ OUT assert_success assert_output "3.12.6" } + +@test "pyenv version started by python-" { + create_version "python-3.12.6" + PYENV_VERSION="python-3.12.6" run pyenv-version-name + assert_success + assert_output "python-3.12.6" +} From 3ced1c475150e00dfcda4e8cca71a5670d5087b8 Mon Sep 17 00:00:00 2001 From: native-api Date: Fri, 11 Oct 2024 16:28:10 +0300 Subject: [PATCH 158/246] Support free-threaded CPython flavor in prefix resolution (#3090) Since 3.13, CPython is provided in 2 flavors: regular and free-threaded, with the 't' suffix. An incomplete prefix ending with '[0-9]t' resolves only among versions that also end with '[0-9]t' --- libexec/pyenv-latest | 13 +++++++++++-- test/latest.bats | 17 ++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/libexec/pyenv-latest b/libexec/pyenv-latest index 330e1e29..7d85e302 100755 --- a/libexec/pyenv-latest +++ b/libexec/pyenv-latest @@ -48,16 +48,25 @@ IFS=$'\n' exit $exitcode; fi + suffix="" + if [[ $prefix =~ ^(.*[0-9])t$ ]]; then + suffix="t" + prefix="${BASH_REMATCH[1]}" + fi + # https://stackoverflow.com/questions/11856054/is-there-an-easy-way-to-pass-a-raw-string-to-grep/63483807#63483807 prefix_re="$(sed 's/[^\^]/[&]/g;s/[\^]/\\&/g' <<< "$prefix")" + suffix_re="$(sed 's/[^\^]/[&]/g;s/[\^]/\\&/g' <<< "$suffix")" # FIXME: more reliable and readable would probably be to loop over them and transform in pure Bash DEFINITION_CANDIDATES=(\ $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ - grep -Ee "^$prefix_re[-.]" || true)) + grep -Ee "^$prefix_re[-.].*$suffix_re\$" || true)) DEFINITION_CANDIDATES=(\ $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ - sed -E -e '/-dev$/d' -e '/-src$/d' -e '/-latest$/d' -e '/(a|b|rc)[0-9]+$/d' -e '/[0-9]+t$/d')); + sed -E -e '/-dev$/d' -e '/-src$/d' -e '/-latest$/d' -e '/(a|b|rc)[0-9]+$/d' \ + $(if [[ -z $suffix ]]; then echo "-e /[0-9]t\$/d"; fi) + )); # Compose a sorting key, followed by | and original value DEFINITION_CANDIDATES=(\ diff --git a/test/latest.bats b/test/latest.bats index 8881c9f5..4acfa89f 100644 --- a/test/latest.bats +++ b/test/latest.bats @@ -94,7 +94,7 @@ echo 3.10.6 ! } -@test "ignores rolling releases, branch tips, alternative srcs, prereleases and virtualenvs" { +@test "ignores rolling releases, branch tips, alternative srcs, prereleases, virtualenvs; 't' versions if prefix without 't'" { create_executable pyenv-versions < Date: Fri, 11 Oct 2024 16:31:00 +0300 Subject: [PATCH 159/246] 2.4.15 --- CHANGELOG.md | 7 +++++++ libexec/pyenv---version | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e7c4550..b6c8e1af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Version History +## Release v2.4.15 +* CI: replace set-output with GITHUB_OUTPUT by @tuzi3040 in https://github.com/pyenv/pyenv/pull/3079 +* Make uninstall yes/no prompt consistent with others by @dpoznik in https://github.com/pyenv/pyenv/pull/3080 +* Add CPython 3.13.0 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3081 +* Avoid shadowing of virtualenvs with the name starting with "python-" by @aarbouin in https://github.com/pyenv/pyenv/pull/3086 +* Support free-threaded CPython flavor in prefix resolution by @native-api in https://github.com/pyenv/pyenv/pull/3090 + ## Release v2.4.14 * Add CPython 3.12.7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3078 * Add CPython 3.13.0rc3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3077 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index aa3c259a..3a2431c1 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.14" +version="2.4.15" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From fb9880e460ddd4317c9db573ac6d32ada8122b13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20=C5=A0im=C3=A1=C4=8Dek?= Date: Wed, 16 Oct 2024 19:14:36 +0200 Subject: [PATCH 160/246] Add GraalPy 24.1.1 (#3092) --- .../share/python-build/graalpy-24.1.1 | 64 +++++++++++++++++++ .../python-build/graalpy-community-24.1.1 | 54 ++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-24.1.1 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.1.1 diff --git a/plugins/python-build/share/python-build/graalpy-24.1.1 b/plugins/python-build/share/python-build/graalpy-24.1.1 new file mode 100644 index 00000000..332b7f3e --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.1.1 @@ -0,0 +1,64 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.1' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="b7ec8b6ead8f0ad19d212617f75c305b38d419bfd3ac6c9e82e9339282699ab9" + ;; +"linux-aarch64" ) + checksum="cb97bbef83372f00c7ea5f351bcb3c1ad36255ebd7d3cff9267d604ad183c28a" + ;; +"macos-amd64" ) + checksum="3f4583cf8438237a2061460d4df9025d04eaaae0beadb3626ccdcebf9cfe725a" + ;; +"macos-aarch64" ) + checksum="23d2397d90ebbd51747541f029ed80b7740fe36b23a45d4616ddad9b60f2c6cb" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.1.1 b/plugins/python-build/share/python-build/graalpy-community-24.1.1 new file mode 100644 index 00000000..1fbbd4f3 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.1.1 @@ -0,0 +1,54 @@ +# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.1' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="42a6b563271174161a1abca4b045b0602d8e27c12204f3cadd31265fd3ff6d19" + ;; +"linux-aarch64" ) + checksum="a513ea3036a48a6cee8cfa666bff7b5e6b1a1b6cf623400109fbf856476e9bd3" + ;; +"macos-amd64" ) + checksum="7f5591074dbd701faa6dec6ea10391bc2d8af736fe8370c5675a11842959edd7" + ;; +"macos-aarch64" ) + checksum="53f6161d0f9871efaf1f62f2c1894152da0bb2b504a95ebad6f35b19de994f77" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip From 630b3700ad25836d46fe711ccd14b2376615f3ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= <16805946+edgarrmondragon@users.noreply.github.com> Date: Thu, 17 Oct 2024 09:45:38 -0600 Subject: [PATCH 161/246] Add CPython 3.14.0a1 (#3093) --- plugins/python-build/share/python-build/3.14.0a1 | 9 +++++++++ plugins/python-build/share/python-build/3.14.0a1t | 2 ++ 2 files changed, 11 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.14.0a1 create mode 100644 plugins/python-build/share/python-build/3.14.0a1t diff --git a/plugins/python-build/share/python-build/3.14.0a1 b/plugins/python-build/share/python-build/3.14.0a1 new file mode 100644 index 00000000..0bbdf5ae --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0a1 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.14.0a1" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a1.tar.xz#3e464b0cbb7535e2db34262fd19a0a393d0e62be0f43b1513ed98379b054ead4" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.14.0a1" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a1.tgz#6edf6c54c118daff03de81d60b227545de89732c2d131ed243ce5593fa9682b7" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.14.0a1t b/plugins/python-build/share/python-build/3.14.0a1t new file mode 100644 index 00000000..d7c6c4d6 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0a1t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a1 From 770eb66ec886bb79669dae89dacf740d17fd6ed5 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Thu, 17 Oct 2024 18:47:39 +0300 Subject: [PATCH 162/246] 2.4.16 --- CHANGELOG.md | 4 ++++ libexec/pyenv---version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b6c8e1af..261a7104 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Version History +## Release v2.4.16 +* Add GraalPy 24.1.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3092 +* Add CPython 3.14.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3093 + ## Release v2.4.15 * CI: replace set-output with GITHUB_OUTPUT by @tuzi3040 in https://github.com/pyenv/pyenv/pull/3079 * Make uninstall yes/no prompt consistent with others by @dpoznik in https://github.com/pyenv/pyenv/pull/3080 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 3a2431c1..55ad7d4f 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.15" +version="2.4.16" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From f3e288c6adc5260cadfb1a73bd839adf1cb98729 Mon Sep 17 00:00:00 2001 From: binbjz Date: Sun, 27 Oct 2024 15:24:35 +0800 Subject: [PATCH 163/246] Add miniconda3-24.9.2-0 --- .../python-build/miniconda3-3.10-24.9.2-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-24.9.2-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-24.9.2-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-24.9.2-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 new file mode 100644 index 00000000..3c4047e3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-aarch64.sh#5d022f16ecb01d33ac8c85a87a0a8dccfb025dc90b20dbd56c4b9ae8f9727578" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-s390x.sh#93d75b306151f96a460a80d8849d85636929a90490f44004f4296a0b8399ccc5" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-x86_64.sh#364869f004c6259268b09a667ed476080bf4f44e9c4ab06a293146df8990d43f" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-MacOSX-arm64.sh#d666284d5dd9290b446de5dc20e8498545867c7730799cba8f52e97a45db42d2" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-MacOSX-x86_64.sh#7359ff3963ab3ccdc5eec244c610270b456a9584477cb645aa7539924bdd0482" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 new file mode 100644 index 00000000..e309b59c --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-aarch64.sh#c4c12d969be6a02cb7370a0c717400e8eec79dea722ef0fba98d745048948980" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-s390x.sh#8de1e23f3e0a097bc3b9173a1b4b56544bd34d2831b70a71a9d528eeab0dbe90" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-x86_64.sh#62ef806265659c47e37e22e8f9adce29e75c4ea0497e619c280f54c823887c4f" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-MacOSX-arm64.sh#7358a1d53e7f857a9b87af148d20cdd00f3a91eca9f663371dfa3d830c375033" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-MacOSX-x86_64.sh#5d4229c322629cf2932c3a4e181501c98dae35b866c96d208b6688b0e2381604" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 new file mode 100644 index 00000000..96b11863 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-aarch64.sh#86b8df7481646cf87e77873e9789adb7569b58248d3aa629eb2da35e6f2e2eed" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-s390x.sh#876db345b31db6d2b96ab1e2aedfbcea8af6b951a3218e6fd36f657452d1305c" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-x86_64.sh#8d936ba600300e08eca3d874dee88c61c6f39303597b2b66baee54af4f7b4122" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-MacOSX-arm64.sh#08d8a82ed21d2dae707554d540b172fe03327347db747644fbb33abfaf07fddd" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-MacOSX-x86_64.sh#ce3b440c32c9c636bbe529477fd496798c35b96d9db1838e3df6b0a80714da4e" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 new file mode 100644 index 00000000..907a1c14 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-aarch64.sh#4607ec9145ad9c0413e6300dab3febe442e265efce486176ef1f8518ba8bfaeb" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-s390x.sh#5ccde79ed4c333f0e236f36338ed5db111a2fff50859235c4f8fffd2045a6655" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-x86_64.sh#4b540d78e5bdd770b39216c0563424ef6656504cbe24c67b2d0454c2eb7afe93" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-MacOSX-arm64.sh#4d5abecbb3264def02ad95ed6c888016f95631649b848da552a1066c52bcd1da" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-MacOSX-x86_64.sh#7535da558c8821d967e026288eaec75d9a159ec760d75c869fd10fa58d3986c3" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 6711e9a21dae25e816fc0ec1c10f8300da3db8cc Mon Sep 17 00:00:00 2001 From: binbjz Date: Sun, 27 Oct 2024 15:33:17 +0800 Subject: [PATCH 164/246] Add anaconda3-2024.10-1 --- .../share/python-build/anaconda3-2024.10-1 | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 plugins/python-build/share/python-build/anaconda3-2024.10-1 diff --git a/plugins/python-build/share/python-build/anaconda3-2024.10-1 b/plugins/python-build/share/python-build/anaconda3-2024.10-1 new file mode 100644 index 00000000..cdc5d05c --- /dev/null +++ b/plugins/python-build/share/python-build/anaconda3-2024.10-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Anaconda3-2024.10-1-Linux-aarch64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-aarch64.sh#489c608e8bddd2cf29dfbdd811cf99087cd6b6a0615d41c6f9058ce340594b65" "anaconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Anaconda3-2024.10-1-Linux-s390x" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-s390x.sh#e00bd5e6c275695e8050a45aa85790315f504c95243dfe3632f505284310f3c4" "anaconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Anaconda3-2024.10-1-Linux-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh#3ba0a298155c32fbfd80cbc238298560bf69a2df511783054adfc151b76d80d8" "anaconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Anaconda3-2024.10-1-MacOSX-arm64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-MacOSX-arm64.sh#f64ed797ce23ae1d07ead949bfb6ff630b9fa8269ca8aef8ea2efa82172ece47" "anaconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Anaconda3-2024.10-1-MacOSX-x86_64" "https://repo.anaconda.com/archive/Anaconda3-2024.10-1-MacOSX-x86_64.sh#ad3eea1cc969e9dfd4d571fc266aae06ec119f651d7cb19c0dc187b73e2bfab1" "anaconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Anaconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 37ad06f7cea84efe0972b48b35a533ceae6afcac Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Sun, 27 Oct 2024 15:35:24 +0800 Subject: [PATCH 165/246] Add miniconda3-24.9.2-0 (#3096) Co-authored-by: binbjz --- .../python-build/miniconda3-3.10-24.9.2-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-24.9.2-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-24.9.2-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-24.9.2-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 new file mode 100644 index 00000000..3c4047e3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-aarch64.sh#5d022f16ecb01d33ac8c85a87a0a8dccfb025dc90b20dbd56c4b9ae8f9727578" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-s390x.sh#93d75b306151f96a460a80d8849d85636929a90490f44004f4296a0b8399ccc5" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-Linux-x86_64.sh#364869f004c6259268b09a667ed476080bf4f44e9c4ab06a293146df8990d43f" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-MacOSX-arm64.sh#d666284d5dd9290b446de5dc20e8498545867c7730799cba8f52e97a45db42d2" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.9.2-0-MacOSX-x86_64.sh#7359ff3963ab3ccdc5eec244c610270b456a9584477cb645aa7539924bdd0482" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 new file mode 100644 index 00000000..e309b59c --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-aarch64.sh#c4c12d969be6a02cb7370a0c717400e8eec79dea722ef0fba98d745048948980" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-s390x.sh#8de1e23f3e0a097bc3b9173a1b4b56544bd34d2831b70a71a9d528eeab0dbe90" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-Linux-x86_64.sh#62ef806265659c47e37e22e8f9adce29e75c4ea0497e619c280f54c823887c4f" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-MacOSX-arm64.sh#7358a1d53e7f857a9b87af148d20cdd00f3a91eca9f663371dfa3d830c375033" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.9.2-0-MacOSX-x86_64.sh#5d4229c322629cf2932c3a4e181501c98dae35b866c96d208b6688b0e2381604" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 new file mode 100644 index 00000000..96b11863 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-aarch64.sh#86b8df7481646cf87e77873e9789adb7569b58248d3aa629eb2da35e6f2e2eed" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-s390x.sh#876db345b31db6d2b96ab1e2aedfbcea8af6b951a3218e6fd36f657452d1305c" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-Linux-x86_64.sh#8d936ba600300e08eca3d874dee88c61c6f39303597b2b66baee54af4f7b4122" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-MacOSX-arm64.sh#08d8a82ed21d2dae707554d540b172fe03327347db747644fbb33abfaf07fddd" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.9.2-0-MacOSX-x86_64.sh#ce3b440c32c9c636bbe529477fd496798c35b96d9db1838e3df6b0a80714da4e" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 new file mode 100644 index 00000000..907a1c14 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.9.2-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-aarch64.sh#4607ec9145ad9c0413e6300dab3febe442e265efce486176ef1f8518ba8bfaeb" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.9.2-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-s390x.sh#5ccde79ed4c333f0e236f36338ed5db111a2fff50859235c4f8fffd2045a6655" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.9.2-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-Linux-x86_64.sh#4b540d78e5bdd770b39216c0563424ef6656504cbe24c67b2d0454c2eb7afe93" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.9.2-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-MacOSX-arm64.sh#4d5abecbb3264def02ad95ed6c888016f95631649b848da552a1066c52bcd1da" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.9.2-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.9.2-0-MacOSX-x86_64.sh#7535da558c8821d967e026288eaec75d9a159ec760d75c869fd10fa58d3986c3" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 96b3fb2fc3bee85650cb22e2cb06c83c24509a6d Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Mon, 28 Oct 2024 02:43:30 +0300 Subject: [PATCH 166/246] 2.4.17 --- CHANGELOG.md | 4 ++++ libexec/pyenv---version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 261a7104..ef3270ee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Version History +## Release v2.4.17 +* Add miniconda3-24.9.2-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3096 +* Add Anaconda3-2024.10-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3097 + ## Release v2.4.16 * Add GraalPy 24.1.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3092 * Add CPython 3.14.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3093 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 55ad7d4f..ffba2c63 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.16" +version="2.4.17" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From d64d1aa1e0fa410e58cc218e721eb4c3672ce5bd Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Mon, 28 Oct 2024 02:53:18 +0300 Subject: [PATCH 167/246] MAINTENANCE.md: easier way to make a release --- MAINTENANCE.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/MAINTENANCE.md b/MAINTENANCE.md index cba674a8..42debf22 100644 --- a/MAINTENANCE.md +++ b/MAINTENANCE.md @@ -4,12 +4,14 @@ Creating a release The release of the new version of Pyenv is done via GitHub Releases. Release checklist: -* Start [drafting a new release on GitHub](https://github.com/pyenv/pyenv/releases) to generate a summary of changes. Save the summary locally. +* Start [drafting a new release on GitHub](https://github.com/pyenv/pyenv/releases) to generate a summary of changes. +Type the would-be tag name in the "Choose a tag" field and press "Generate release notes" * The summary may need editing. E.g. rephrase entries, delete/merge entries that are too minor or irrelevant to the users (e.g. typo fixes, CI) +* Update `CHANGELOG.md` with the new version number and the edited summary (only the changes section) * Push the version number in `libexec/pyenv---version` * Minor version is pushed if there are significant functional changes (not e.g. bugfixes/formula adaptations/supporting niche use cases). * Major version is pushed if there are breaking changes -* Update `CHANGELOG.md` with the new version number and the edited summary (only the changes section), reformatting it like the rest of the changelog sections * Commit the changes locally into `master` -* Create a new tag with the new version number and push the changes including the tag -* Create a new release on GitHub based on the tag, using the saved summary \ No newline at end of file +* Create a new tag locally with the same name as specified in the new release window +* Push the changes including the tag +* In the still open new release window, press "Publish release". The now-existing tag will be used. \ No newline at end of file From b0d6a67881f73a275fc08da90c1a60d2db914978 Mon Sep 17 00:00:00 2001 From: Michael Goerz Date: Wed, 13 Nov 2024 15:57:14 -0500 Subject: [PATCH 168/246] Add miniforge3-24.9.2-0 (#3106) --- .../share/python-build/miniforge3-24.9.2-0 | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniforge3-24.9.2-0 diff --git a/plugins/python-build/share/python-build/miniforge3-24.9.2-0 b/plugins/python-build/share/python-build/miniforge3-24.9.2-0 new file mode 100644 index 00000000..0fd2b7e4 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.9.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-Linux-aarch64.sh#f33ec46c6c9dbcdc9d1101b04dcddff17f4ca54524a9575992e743bbc051d61c" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.9.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-Linux-ppc64le.sh#0b24b38611b486e3d1615aa778a6252430d54ae6e1210cd2874a3d8e8efd7abe" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.9.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-Linux-x86_64.sh#ca8c544254c40ae5192eb7db4e133ff4eb9f942a1fec737dba8205ac3f626322" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.9.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-MacOSX-arm64.sh#b2ee4415bce51895b74b99de6e83ac0f737fd968052b5b49f79e05b292220084" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.9.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Miniforge3-24.9.2-0-MacOSX-x86_64.sh#22b9eab7508d464c7d270883e733496beef25520d96c8383b4683f0122ae0222" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 6393a4dfce90615792751c6567c07a118a961ff9 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 17 Nov 2024 23:49:36 +0300 Subject: [PATCH 169/246] 2.4.18 --- CHANGELOG.md | 3 +++ libexec/pyenv---version | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef3270ee..1377320a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Version History +## Release v2.4.18 +* Add miniforge3-24.9.2-0 by @goerz in https://github.com/pyenv/pyenv/pull/3106 + ## Release v2.4.17 * Add miniconda3-24.9.2-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3096 * Add Anaconda3-2024.10-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3097 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index ffba2c63..f0cba5f4 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.17" +version="2.4.18" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 04b32e2d46e8f6fa2a7e480a9452fde6cdbd9303 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Wed, 20 Nov 2024 13:26:18 -0500 Subject: [PATCH 170/246] Add CPython 3.14.0a2 (#3110) --- plugins/python-build/share/python-build/3.14.0a1t | 2 -- .../python-build/share/python-build/{3.14.0a1 => 3.14.0a2} | 4 ++-- plugins/python-build/share/python-build/3.14.0a2t | 2 ++ 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.14.0a1t rename plugins/python-build/share/python-build/{3.14.0a1 => 3.14.0a2} (59%) create mode 100644 plugins/python-build/share/python-build/3.14.0a2t diff --git a/plugins/python-build/share/python-build/3.14.0a1t b/plugins/python-build/share/python-build/3.14.0a1t deleted file mode 100644 index d7c6c4d6..00000000 --- a/plugins/python-build/share/python-build/3.14.0a1t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a1 diff --git a/plugins/python-build/share/python-build/3.14.0a1 b/plugins/python-build/share/python-build/3.14.0a2 similarity index 59% rename from plugins/python-build/share/python-build/3.14.0a1 rename to plugins/python-build/share/python-build/3.14.0a2 index 0bbdf5ae..4f47a14a 100644 --- a/plugins/python-build/share/python-build/3.14.0a1 +++ b/plugins/python-build/share/python-build/3.14.0a2 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.14.0a1" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a1.tar.xz#3e464b0cbb7535e2db34262fd19a0a393d0e62be0f43b1513ed98379b054ead4" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a2" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a2.tar.xz#2ff9e10147342b3efd69f5cd9cc06ec46250f2a046587599d18e2cac69c05920" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.14.0a1" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a1.tgz#6edf6c54c118daff03de81d60b227545de89732c2d131ed243ce5593fa9682b7" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a2" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a2.tgz#b038eab7823e8a1c0500e3a26c95265656c2b8dd0bfa098aa341e9812be8f89c" standard verify_py313 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.14.0a2t b/plugins/python-build/share/python-build/3.14.0a2t new file mode 100644 index 00000000..c8665017 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0a2t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a2 From 707e8d1ef803cb4a0b5d98d92e26000d32940085 Mon Sep 17 00:00:00 2001 From: Madhu Gururajan Date: Thu, 21 Nov 2024 00:38:35 +0530 Subject: [PATCH 171/246] Add quick start section and gif demo to accompany it. (#3044) * Reorganize readme, add gif 1. Details in 'Getting Pyenv' and 'Setup for your shell' are collapsed. User can expand relevant sections depending on their platform and shell. 2. 'How It Works' and 'Advanced Configuration' are moved to the bottom of the README.md just before 'Contributing' section at the end. 3. Added a GIF in the 'Usage' section to showcase - Listing python versions available for install. - Installing a specific python version. - Listing installed python versions. - Switching to another python version for a directory. - Testing by moving terminal into the directory and moving back. * Update GIF to show prefix resolution * Collapse upgrade notes * Cross-mention Linux and MacOS instlalation scenarios --------- Co-authored-by: Ivan Pozdeev --- README.md | 853 ++++++++++++++++++++------------------- install_local_python.gif | Bin 0 -> 543836 bytes 2 files changed, 446 insertions(+), 407 deletions(-) create mode 100644 install_local_python.gif diff --git a/README.md b/README.md index a801abfc..115fe2fb 100644 --- a/README.md +++ b/README.md @@ -9,9 +9,6 @@ tools that do one thing well. This project was forked from [rbenv](https://github.com/rbenv/rbenv) and [ruby-build](https://github.com/rbenv/ruby-build), and modified for Python. -![Terminal output example](/terminal_output.png) - - ### What pyenv _does..._ * Lets you **change the global Python version** on a per-user basis. @@ -32,30 +29,27 @@ This project was forked from [rbenv](https://github.com/rbenv/rbenv) and yourself, or [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv) to automate the process. + ---- ## Table of Contents -* **[How It Works](#how-it-works)** - * [Understanding PATH](#understanding-path) - * [Understanding Shims](#understanding-shims) - * [Understanding Python version selection](#understanding-python-version-selection) - * [Locating Pyenv-provided Python Installations](#locating-pyenv-provided-python-installations) * **[Installation](#installation)** - * [Getting Pyenv](#getting-pyenv) - * [UNIX/MacOS](#unixmacos) + * [Getting Pyenv](#a-getting-pyenv) + * [Linux/UNIX](#linuxunix) + * [Automatic Installer](#1-automatic-installer-recommended) + * [Basic GitHub Checkout](#2-basic-github-checkout) + * [MacOS](#macos) * [Homebrew in macOS](#homebrew-in-macos) - * [Automatic installer](#automatic-installer) - * [Basic GitHub Checkout](#basic-github-checkout) * [Windows](#windows) - * [Set up your shell environment for Pyenv](#set-up-your-shell-environment-for-pyenv) - * [Restart your shell](#restart-your-shell) - * [Install Python build dependencies](#install-python-build-dependencies) + * [Set up your shell environment for Pyenv](#b-set-up-your-shell-environment-for-pyenv) + * [Restart your shell](#c-restart-your-shell) + * [Install Python build dependencies](#d-install-python-build-dependencies) + * [Upgrade Notes](#e-upgrade-notes) * **[Usage](#usage)** * [Install additional Python versions](#install-additional-python-versions) * [Prefix auto-resolution to the latest version](#prefix-auto-resolution-to-the-latest-version) - * [Python versions with extended support](#python-versions-with-extended-support) * [Switch between Python versions](#switch-between-python-versions) * [Uninstall Python versions](#uninstall-python-versions) * [Other operations](#other-operations) @@ -64,6 +58,11 @@ This project was forked from [rbenv](https://github.com/rbenv/rbenv) and * [Upgrading with Installer or Git checkout](#upgrading-with-installer-or-git-checkout) * [Uninstalling pyenv](#uninstalling-pyenv) * [Pyenv plugins](#pyenv-plugins) +* **[How It Works](#how-it-works)** + * [Understanding PATH](#understanding-path) + * [Understanding Shims](#understanding-shims) + * [Understanding Python version selection](#understanding-python-version-selection) + * [Locating Pyenv-provided Python Installations](#locating-pyenv-provided-python-installations) * [Advanced Configuration](#advanced-configuration) * [Using Pyenv without shims](#using-pyenv-without-shims) * [Environment variables](#environment-variables) @@ -75,6 +74,437 @@ This project was forked from [rbenv](https://github.com/rbenv/rbenv) and ---- +## Installation + +### A. Getting Pyenv +---- +#### Linux/Unix +
+ +The Homebrew option from the [MacOS section below](#macos) would also work if you have Homebrew installed. + +##### 1. Automatic installer (Recommended) + +```bash +curl https://pyenv.run | bash +``` + +For more details visit our other project: +https://github.com/pyenv/pyenv-installer + + +##### 2. Basic GitHub Checkout + +This will get you going with the latest version of Pyenv and make it +easy to fork and contribute any changes back upstream. + +* **Check out Pyenv where you want it installed.** + A good place to choose is `$HOME/.pyenv` (but you can install it somewhere else): + ``` + git clone https://github.com/pyenv/pyenv.git ~/.pyenv + ``` +* Optionally, try to compile a dynamic Bash extension to speed up Pyenv. Don't + worry if it fails; Pyenv will still work normally: + ``` + cd ~/.pyenv && src/configure && make -C src + ``` +
+ +#### MacOS + +
+ +The options from the [Linux section above](#linuxunix) also work but Homebrew is recommended for basic usage. + +##### [Homebrew](https://brew.sh) in macOS + + 1. Update homebrew and install pyenv: + ```sh + brew update + brew install pyenv + ``` + If you want to install (and update to) the latest development head of Pyenv + rather than the latest release, instead run: + ```sh + brew install pyenv --head + ``` + 3. Then follow the rest of the post-installation steps, starting with + [Set up your shell environment for Pyenv](#set-up-your-shell-environment-for-pyenv). + + 4. OPTIONAL. To fix `brew doctor`'s warning _""config" scripts exist outside your system or Homebrew directories"_ + + If you're going to build Homebrew formulae from source that link against Python + like Tkinter or NumPy + _(This is only generally the case if you are a developer of such a formula, + or if you have an EOL version of MacOS for which prebuilt bottles are no longer provided + and you are using such a formula)._ + + To avoid them accidentally linking against a Pyenv-provided Python, + add the following line into your interactive shell's configuration: + + * Bash/Zsh: + + ~~~bash + alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew' + ~~~ + + * Fish: + + ~~~fish + alias brew="env PATH=(string replace (pyenv root)/shims '' \"\$PATH\") brew" + ~~~ +
+ +#### Windows + +
+ +Pyenv does not officially support Windows and does not work in Windows outside +the Windows Subsystem for Linux. +Moreover, even there, the Pythons it installs are not native Windows versions +but rather Linux versions running in a virtual machine -- +so you won't get Windows-specific functionality. + +If you're in Windows, we recommend using @kirankotari's [`pyenv-win`](https://github.com/pyenv-win/pyenv-win) fork -- +which does install native Windows Python versions. + +
+ +### B. Set up your shell environment for Pyenv +---- + +The below setup should work for the vast majority of users for common use cases. +See [Advanced configuration](#advanced-configuration) for details and more configuration options. + +#### Bash +
+ + Stock Bash startup files vary widely between distributions in which of them source + which, under what circumstances, in what order and what additional configuration they perform. + As such, the most reliable way to get Pyenv in all environments is to append Pyenv + configuration commands to both `.bashrc` (for interactive shells) + and the profile file that Bash would use (for login shells). + + 1. First, add the commands to `~/.bashrc` by running the following in your terminal: + + ```bash + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc + echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc + echo 'eval "$(pyenv init -)"' >> ~/.bashrc + ``` + 3. Then, if you have `~/.profile`, `~/.bash_profile` or `~/.bash_login`, add the commands there as well. + If you have none of these, create a `~/.profile` and add the commands there. + + * to add to `~/.profile`: + ``` bash + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile + echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile + echo 'eval "$(pyenv init -)"' >> ~/.profile + ``` + * to add to `~/.bash_profile`: + ```bash + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile + echo 'eval "$(pyenv init -)"' >> ~/.bash_profile + ``` + + **Bash warning**: There are some systems where the `BASH_ENV` variable is configured + to point to `.bashrc`. On such systems, you should almost certainly put the + `eval "$(pyenv init -)"` line into `.bash_profile`, and **not** into `.bashrc`. Otherwise, you + may observe strange behaviour, such as `pyenv` getting into an infinite loop. + See [#264](https://github.com/pyenv/pyenv/issues/264) for details. + +
+ +#### Zsh + +
+ + ```zsh + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc + echo 'eval "$(pyenv init -)"' >> ~/.zshrc + ``` + + If you wish to get Pyenv in noninteractive login shells as well, also add the commands to `~/.zprofile` or `~/.zlogin`. +
+ +#### Fish + +
+ + 1. If you have Fish 3.2.0 or newer, execute this interactively: + ~~~ fish + set -Ux PYENV_ROOT $HOME/.pyenv + fish_add_path $PYENV_ROOT/bin + ~~~ + + 2. Otherwise, execute the snippet below: + ~~~ fish + set -Ux PYENV_ROOT $HOME/.pyenv + set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths + ~~~ + + 3. Now, add this to `~/.config/fish/config.fish`: + ~~~ fish + pyenv init - | source + ~~~ +
+ +### C. Restart your shell +---- + + for the `PATH` changes to take effect. + + ```sh + exec "$SHELL" + ``` + +### D. Install Python build dependencies +---- + + [**Install Python build dependencies**](https://github.com/pyenv/pyenv/wiki#suggested-build-environment) + before attempting to install a new Python version. + + You can now begin using Pyenv. + +### E. Upgrade Notes +---- + +**if you have upgraded from pyenv version 2.0.x-2.2.x** + +
+ +The startup logic and instructions have been updated for simplicity in 2.3.0. +The previous, more complicated configuration scheme for 2.0.0-2.2.5 still works. + +* Define environment variable `PYENV_ROOT` to point to the path where + Pyenv will store its data. `$HOME/.pyenv` is the default. + If you installed Pyenv via Git checkout, we recommend + to set it to the same location as where you cloned it. +* Add the `pyenv` executable to your `PATH` if it's not already there +* run `eval "$(pyenv init -)"` to install `pyenv` into your shell as a shell function, enable shims and autocompletion + * You may run `eval "$(pyenv init --path)"` instead to just enable shims, without shell integration + +
+ +---- + + +## Usage + +![Terminal output example](/install_local_python.gif) + +### Install additional Python versions + +To install additional Python versions, use [`pyenv install`](COMMANDS.md#pyenv-install). + +For example, to download and install Python 3.10.4, run: + +```sh +pyenv install 3.10.4 +``` + +Running `pyenv install -l` gives the list of all available versions. + +---- + +
Notes about python releases +**NOTE:** Most Pyenv-provided Python releases are source releases and are built +from source as part of installation (that's why you need Python build dependencies preinstalled). +You can pass options to Python's `configure` and compiler flags to customize the build, +see [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables) +for details. + +**NOTE:** If you are having trouble installing a Python version, +please visit the wiki page about +[Common Build Problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems). + +**NOTE:** If you want to use proxy for download, please set the `http_proxy` and `https_proxy` +environment variables. + +**NOTE:** If you'd like a faster interpreter at the cost of longer build times, +see [_Building for maximum performance_ in Python-Build's README](plugins/python-build/README.md#building-for-maximum-performance). + +
+ +---- + +#### Prefix auto-resolution to the latest version + +All Pyenv subcommands except `uninstall` automatically resolve full prefixes to the latest version in the corresponding version line. + +`pyenv install` picks the latest known version, while other subcommands pick the latest installed version. + +E.g. to install and then switch to the latest 3.10 release: + +```sh +pyenv install 3.10 +pyenv global 3.10 +``` + +You can run [`pyenv latest -k `](COMMANDS.md#pyenv-latest) to see how `pyenv install` would resolve a specific prefix, or [`pyenv latest `](COMMANDS.md#pyenv-latest) to see how other subcommands would resolve it. + +See the [`pyenv latest` documentation](COMMANDS.md#pyenv-latest) for details. + + +
Python versions with extended support + +For the following Python releases, Pyenv applies user-provided patches that add support for some newer environments. +Though we don't actively maintain those patches, since existing releases never change, +it's safe to assume that they will continue working until there are further incompatible changes +in a later version of those environments. + +* *3.7.8-3.7.15, 3.8.4-3.8.12, 3.9.0-3.9.7* : XCode 13.3 +* *3.5.10, 3.6.15* : MacOS 11+ and XCode 13.3 +* *2.7.18* : MacOS 10.15+ and Apple Silicon +
+ +---- + +### Switch between Python versions + +To select a Pyenv-installed Python as the version to use, run one +of the following commands: + +* [`pyenv shell `](COMMANDS.md#pyenv-shell) -- select just for current shell session +* [`pyenv local `](COMMANDS.md#pyenv-local) -- automatically select whenever you are in the current directory (or its subdirectories) +* [`pyenv global `](COMMANDS.md#pyenv-shell) -- select globally for your user account + +E.g. to select the above-mentioned newly-installed Python 3.10.4 as your preferred version to use: + +~~~bash +pyenv global 3.10.4 +~~~ + +Now whenever you invoke `python`, `pip` etc., an executable from the Pyenv-provided +3.10.4 installation will be run instead of the system Python. + +Using "`system`" as a version name would reset the selection to your system-provided Python. + +See [Understanding shims](#understanding-shims) and +[Understanding Python version selection](#understanding-python-version-selection) +for more details on how the selection works and more information on its usage. + +---- + +### Uninstall Python versions + +As time goes on, you will accumulate Python versions in your +`$(pyenv root)/versions` directory. + +To remove old Python versions, use [`pyenv uninstall `](COMMANDS.md#pyenv-uninstall). + +Alternatively, you can simply `rm -rf` the directory of the version you want +to remove. You can find the directory of a particular Python version +with the `pyenv prefix` command, e.g. `pyenv prefix 2.6.8`. +Note however that plugins may run additional operations on uninstall +which you would need to do by hand as well. E.g. Pyenv-Virtualenv also +removes any virtual environments linked to the version being uninstalled. + +---- + +### Other operations + +Run `pyenv commands` to get a list of all available subcommands. +Run a subcommand with `--help` to get help on it, or see the [Commands Reference](COMMANDS.md). + +Note that Pyenv plugins that you install may add their own subcommands. + + +## Upgrading + +### Upgrading with Homebrew + +If you've installed Pyenv using Homebrew, upgrade using: +```sh +brew upgrade pyenv +``` + +To switch from a release to the latest development head of Pyenv, use: + +```sh +brew uninstall pyenv +brew install pyenv --head +``` + +then you can upgrade it with `brew upgrade pyenv` as usual. + + +### Upgrading with Installer or Git checkout + +If you've installed Pyenv with Pyenv-installer, you likely have the +[Pyenv-Update](https://github.com/pyenv/pyenv-update) plugin that would +upgrade Pyenv and all installed plugins: + +```sh +pyenv update +``` + +If you've installed Pyenv using Pyenv-installer or Git checkout, you can also +upgrade your installation at any time using Git. + +To upgrade to the latest development version of pyenv, use `git pull`: + +```sh +cd $(pyenv root) +git pull +``` + +To upgrade to a specific release of Pyenv, check out the corresponding tag: + +```sh +cd $(pyenv root) +git fetch +git tag +git checkout v0.1.0 +``` + +## Uninstalling pyenv + +The simplicity of pyenv makes it easy to temporarily disable it, or +uninstall from the system. + +1. To **disable** Pyenv managing your Python versions, simply remove the + `pyenv init` invocations from your shell startup configuration. This will + remove Pyenv shims directory from `PATH`, and future invocations like + `python` will execute the system Python version, as it was before Pyenv. + + `pyenv` will still be accessible on the command line, but your Python + apps won't be affected by version switching. + +2. To completely **uninstall** Pyenv, remove _all_ Pyenv configuration lines + from your shell startup configuration, and then remove + its root directory. This will **delete all Python versions** that were + installed under the `` $(pyenv root)/versions/ `` directory: + + ```sh + rm -rf $(pyenv root) + ``` + + If you've installed Pyenv using a package manager, as a final step, + perform the Pyenv package removal. For instance, for Homebrew: + + ``` + brew uninstall pyenv + ``` + + +## Pyenv plugins + +Pyenv provides a simple way to extend and customize its functionality with plugins -- +as simple as creating a plugin directory and dropping a shell script on a certain subpath of it +with whatever extra logic you need to be run at certain moments. + +The main idea is that most things that you can put under `$PYENV_ROOT/` you can also put +under `$PYENV_ROOT/plugins/your_plugin_name/`. + +See [_Plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Plugins) on how to install and use plugins +as well as a catalog of some useful existing plugins for common needs. + +See [_Authoring plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Authoring-plugins) on writing your own plugins. + +---- ## How It Works @@ -198,397 +628,6 @@ As far as Pyenv is concerned, version names are simply directories under ---- -## Installation - -### Getting Pyenv -#### UNIX/MacOS -##### Homebrew in macOS - - 1. Consider installing with [Homebrew](https://brew.sh): - ```sh - brew update - brew install pyenv - ``` - If you want to install (and update to) the latest development head of Pyenv - rather than the latest release, instead run: - ```sh - brew install pyenv --head - ``` - 3. Then follow the rest of the post-installation steps, starting with - [Set up your shell environment for Pyenv](#set-up-your-shell-environment-for-pyenv). - - 4. OPTIONAL. To fix `brew doctor`'s warning _""config" scripts exist outside your system or Homebrew directories"_ - - If you're going to build Homebrew formulae from source that link against Python - like Tkinter or NumPy - _(This is only generally the case if you are a developer of such a formula, - or if you have an EOL version of MacOS for which prebuilt bottles are no longer provided - and you are using such a formula)._ - - To avoid them accidentally linking against a Pyenv-provided Python, - add the following line into your interactive shell's configuration: - - * Bash/Zsh: - - ~~~bash - alias brew='env PATH="${PATH//$(pyenv root)\/shims:/}" brew' - ~~~ - - * Fish: - - ~~~fish - alias brew="env PATH=(string replace (pyenv root)/shims '' \"\$PATH\") brew" - ~~~ - - -##### Automatic installer - -```bash -curl https://pyenv.run | bash -``` - -For more details visit our other project: -https://github.com/pyenv/pyenv-installer - - -##### Basic GitHub Checkout - -This will get you going with the latest version of Pyenv and make it -easy to fork and contribute any changes back upstream. - -* **Check out Pyenv where you want it installed.** - A good place to choose is `$HOME/.pyenv` (but you can install it somewhere else): - ``` - git clone https://github.com/pyenv/pyenv.git ~/.pyenv - ``` -* Optionally, try to compile a dynamic Bash extension to speed up Pyenv. Don't - worry if it fails; Pyenv will still work normally: - ``` - cd ~/.pyenv && src/configure && make -C src - ``` - -#### Windows - -Pyenv does not officially support Windows and does not work in Windows outside -the Windows Subsystem for Linux. -Moreover, even there, the Pythons it installs are not native Windows versions -but rather Linux versions running in a virtual machine -- -so you won't get Windows-specific functionality. - -If you're in Windows, we recommend using @kirankotari's [`pyenv-win`](https://github.com/pyenv-win/pyenv-win) fork -- -which does install native Windows Python versions. - - -### Set up your shell environment for Pyenv - -**Upgrade note:** The startup logic and instructions have been updated for simplicity in 2.3.0. -The previous, more complicated configuration scheme for 2.0.0-2.2.5 still works. - -* Define environment variable `PYENV_ROOT` to point to the path where - Pyenv will store its data. `$HOME/.pyenv` is the default. - If you installed Pyenv via Git checkout, we recommend - to set it to the same location as where you cloned it. -* Add the `pyenv` executable to your `PATH` if it's not already there -* run `eval "$(pyenv init -)"` to install `pyenv` into your shell as a shell function, enable shims and autocompletion - * You may run `eval "$(pyenv init --path)"` instead to just enable shims, without shell integration - -The below setup should work for the vast majority of users for common use cases. -See [Advanced configuration](#advanced-configuration) for details and more configuration options. - - - For **bash**: - - Stock Bash startup files vary widely between distributions in which of them source - which, under what circumstances, in what order and what additional configuration they perform. - As such, the most reliable way to get Pyenv in all environments is to append Pyenv - configuration commands to both `.bashrc` (for interactive shells) - and the profile file that Bash would use (for login shells). - - First, add the commands to `~/.bashrc` by running the following in your terminal: - - ~~~ bash - echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc - echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc - echo 'eval "$(pyenv init -)"' >> ~/.bashrc - ~~~ - - Then, if you have `~/.profile`, `~/.bash_profile` or `~/.bash_login`, add the commands there as well. - If you have none of these, add them to `~/.profile`. - - * to add to `~/.profile`: - ~~~ bash - echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile - echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile - echo 'eval "$(pyenv init -)"' >> ~/.profile - ~~~ - - * to add to `~/.bash_profile`: - ~~~ bash - echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile - echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile - echo 'eval "$(pyenv init -)"' >> ~/.bash_profile - ~~~ - - - For **Zsh**: - - Run the following to add the commands to `~/.zshrc`: - ~~~ zsh - echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc - echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc - echo 'eval "$(pyenv init -)"' >> ~/.zshrc - ~~~ - - If you wish to get Pyenv in noninteractive login shells as well, also add the commands to `~/.zprofile` or `~/.zlogin`. - - - For **Fish shell**: - - If you have Fish 3.2.0 or newer, execute this interactively: - - ~~~ fish - set -Ux PYENV_ROOT $HOME/.pyenv - fish_add_path $PYENV_ROOT/bin - ~~~ - - Otherwise, execute the snippet below: - - ~~~ fish - set -Ux PYENV_ROOT $HOME/.pyenv - set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths - ~~~ - - Now, add this to `~/.config/fish/config.fish`: - - ~~~ fish - pyenv init - | source - ~~~ - - **Bash warning**: There are some systems where the `BASH_ENV` variable is configured - to point to `.bashrc`. On such systems, you should almost certainly put the - `eval "$(pyenv init -)"` line into `.bash_profile`, and **not** into `.bashrc`. Otherwise, you - may observe strange behaviour, such as `pyenv` getting into an infinite loop. - See [#264](https://github.com/pyenv/pyenv/issues/264) for details. - - **Proxy note**: If you use a proxy, export `http_proxy` and `https_proxy`, too. - -### Restart your shell - - for the `PATH` changes to take effect. - - ```sh - exec "$SHELL" - ``` - -### Install Python build dependencies - - [**Install Python build dependencies**](https://github.com/pyenv/pyenv/wiki#suggested-build-environment) - before attempting to install a new Python version. - - You can now begin using Pyenv. - ----- - - -## Usage - -### Install additional Python versions - -To install additional Python versions, use [`pyenv install`](COMMANDS.md#pyenv-install). - -For example, to download and install Python 3.10.4, run: - -```sh -pyenv install 3.10.4 -``` - -Running `pyenv install -l` gives the list of all available versions. - -**NOTE:** Most Pyenv-provided Python releases are source releases and are built -from source as part of installation (that's why you need Python build dependencies preinstalled). -You can pass options to Python's `configure` and compiler flags to customize the build, -see [_Special environment variables_ in Python-Build's README](plugins/python-build/README.md#special-environment-variables) -for details. - -**NOTE:** If you are having trouble installing a Python version, -please visit the wiki page about -[Common Build Problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems). - -**NOTE:** If you want to use proxy for download, please set the `http_proxy` and `https_proxy` -environment variables. - -**NOTE:** If you'd like a faster interpreter at the cost of longer build times, -see [_Building for maximum performance_ in Python-Build's README](plugins/python-build/README.md#building-for-maximum-performance). - - -#### Prefix auto-resolution to the latest version - -All Pyenv subcommands except `uninstall` automatically resolve full prefixes to the latest version in the corresponding version line. - -`pyenv install` picks the latest known version, while other subcommands pick the latest installed version. - -E.g. to install and then switch to the latest 3.10 release: - -```sh -pyenv install 3.10 -pyenv global 3.10 -``` - -You can run [`pyenv latest -k `](COMMANDS.md#pyenv-latest) to see how `pyenv install` would resolve a specific prefix, or [`pyenv latest `](COMMANDS.md#pyenv-latest) to see how other subcommands would resolve it. - -See the [`pyenv latest` documentation](COMMANDS.md#pyenv-latest) for details. - - -#### Python versions with extended support - -For the following Python releases, Pyenv applies user-provided patches that add support for some newer environments. -Though we don't actively maintain those patches, since existing releases never change, -it's safe to assume that they will continue working until there are further incompatible changes -in a later version of those environments. - -* *3.7.8-3.7.15, 3.8.4-3.8.12, 3.9.0-3.9.7* : XCode 13.3 -* *3.5.10, 3.6.15* : MacOS 11+ and XCode 13.3 -* *2.7.18* : MacOS 10.15+ and Apple Silicon - - -### Switch between Python versions - -To select a Pyenv-installed Python as the version to use, run one -of the following commands: - -* [`pyenv shell `](COMMANDS.md#pyenv-shell) -- select just for current shell session -* [`pyenv local `](COMMANDS.md#pyenv-local) -- automatically select whenever you are in the current directory (or its subdirectories) -* [`pyenv global `](COMMANDS.md#pyenv-shell) -- select globally for your user account - -E.g. to select the above-mentioned newly-installed Python 3.10.4 as your preferred version to use: - -~~~bash -pyenv global 3.10.4 -~~~ - -Now whenever you invoke `python`, `pip` etc., an executable from the Pyenv-provided -3.10.4 installation will be run instead of the system Python. - -Using "`system`" as a version name would reset the selection to your system-provided Python. - -See [Understanding shims](#understanding-shims) and -[Understanding Python version selection](#understanding-python-version-selection) -for more details on how the selection works and more information on its usage. - - -### Uninstall Python versions - -As time goes on, you will accumulate Python versions in your -`$(pyenv root)/versions` directory. - -To remove old Python versions, use [`pyenv uninstall `](COMMANDS.md#pyenv-uninstall). - -Alternatively, you can simply `rm -rf` the directory of the version you want -to remove. You can find the directory of a particular Python version -with the `pyenv prefix` command, e.g. `pyenv prefix 2.6.8`. -Note however that plugins may run additional operations on uninstall -which you would need to do by hand as well. E.g. Pyenv-Virtualenv also -removes any virtual environments linked to the version being uninstalled. - - -### Other operations - -Run `pyenv commands` to get a list of all available subcommands. -Run a subcommand with `--help` to get help on it, or see the [Commands Reference](COMMANDS.md). - -Note that Pyenv plugins that you install may add their own subcommands. - - -## Upgrading - -### Upgrading with Homebrew - -If you've installed Pyenv using Homebrew, upgrade using: -```sh -brew upgrade pyenv -``` - -To switch from a release to the latest development head of Pyenv, use: - -```sh -brew uninstall pyenv -brew install pyenv --head -``` - -then you can upgrade it with `brew upgrade pyenv` as usual. - - -### Upgrading with Installer or Git checkout - -If you've installed Pyenv with Pyenv-installer, you likely have the -[Pyenv-Update](https://github.com/pyenv/pyenv-update) plugin that would -upgrade Pyenv and all installed plugins: - -```sh -pyenv update -``` - -If you've installed Pyenv using Pyenv-installer or Git checkout, you can also -upgrade your installation at any time using Git. - -To upgrade to the latest development version of pyenv, use `git pull`: - -```sh -cd $(pyenv root) -git pull -``` - -To upgrade to a specific release of Pyenv, check out the corresponding tag: - -```sh -cd $(pyenv root) -git fetch -git tag -git checkout v0.1.0 -``` - -## Uninstalling pyenv - -The simplicity of pyenv makes it easy to temporarily disable it, or -uninstall from the system. - -1. To **disable** Pyenv managing your Python versions, simply remove the - `pyenv init` invocations from your shell startup configuration. This will - remove Pyenv shims directory from `PATH`, and future invocations like - `python` will execute the system Python version, as it was before Pyenv. - - `pyenv` will still be accessible on the command line, but your Python - apps won't be affected by version switching. - -2. To completely **uninstall** Pyenv, remove _all_ Pyenv configuration lines - from your shell startup configuration, and then remove - its root directory. This will **delete all Python versions** that were - installed under the `` $(pyenv root)/versions/ `` directory: - - ```sh - rm -rf $(pyenv root) - ``` - - If you've installed Pyenv using a package manager, as a final step, - perform the Pyenv package removal. For instance, for Homebrew: - - ``` - brew uninstall pyenv - ``` - - -## Pyenv plugins - -Pyenv provides a simple way to extend and customize its functionality with plugins -- -as simple as creating a plugin directory and dropping a shell script on a certain subpath of it -with whatever extra logic you need to be run at certain moments. - -The main idea is that most things that you can put under `$PYENV_ROOT/` you can also put -under `$PYENV_ROOT/plugins/your_plugin_name/`. - -See [_Plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Plugins) on how to install and use plugins -as well as a catalog of some useful existing plugins for common needs. - -See [_Authoring plugins_ on the wiki](https://github.com/pyenv/pyenv/wiki/Authoring-plugins) on writing your own plugins. - - ## Advanced Configuration Skip this section unless you must know what every line in your shell diff --git a/install_local_python.gif b/install_local_python.gif new file mode 100644 index 0000000000000000000000000000000000000000..fefdbd2f80993728231432173a67b2a1d2412f80 GIT binary patch literal 543836 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≫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 z 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≤V+9a&c7HA`ja{vFE3yH zo89miaSZ#A=qwSjy3x&Z=P%bk4gUzU1I8RnXYxZjq-Eo8^8VBCNB@aR6z>r!I~BRN zUMOY!A^5mxBD>))izN%_OI+*NS%cea?XAnkMw{K33l{h!YZqfIUtV-82yn#u3nVWu zWt?{YasDcJ9K@xy^y+iEK8+bR1`&vra0!`Zjo_5vsQN=a7erjkt_`?$BP=%Mdsd0EM`&1aPjo0~T^ zU+pXVJ*ye=ttiucONv1@?#*nVw3t|2)oY=CA1?4VwgcTRwxwE7BXhz8#H&H0)iL;z zO+;JQuk|TS$G`NhGzJLihQmi4?@9<@RCZrF@8W4%+nkPrhRy^cOy|!AnPH_k0IxO7K1qg1nTacEeBZK48vmDRHfx`(ncW$uD!H zi$ZD~3Itp`mr~P(pt&eLx3j$pa{vTw5+nI-A>G^U3`5~9aFre?Tk&H(L=9b!yqI#^ zV571W*0_-JX8z}Pbp`q*E_t7$df1rM|-Ul0LBmi(sYM?$q0=>eCCi14bBMUhch;e{CT^P9zL{A^4 z!4)+~U;zRk5oQ80#Kv%G;{YkZeJ=APyS4!b9~&#)BSFGztNRlRW`RZ5^((c+Ga zy)ZZZl33NZP7Q~V1DCZ60lL2Bnh9^J|1A%RW=8kwgeE!ssE2g1u-O^LNZJ`&l7z5m ztHrTTX%X*bs3j!(}g zu?qUKR6R2C4DRv&2j2u2RdzMh)w0#+A#KI*oV!*M`x=4?bAwKoeX%=n)pLr=(3ahQg?EV zuKZjG{yLKvHVQnH?u#7<5w$f-W_@kq|o{x(7An7H>e4d>8Q;3@kr z-^6#kTSnrq$mIydC7(-9@^0;1>CSLAY9Nbt&Bd3`H+(t%PFVJPHf13Ea*~4A73uqG zC2KNioL%~|$pOAeh3WUd_N+Ym+g84GYq?EyNg_o zZyb1dret02c8s};Wt!kI&IDYKT2Mi}L~hP{1+{BmS@_W%=7zlHh=l24#Cf}Q>&IGd z$!m8rtZEZ$GA{QjJ!${Cb}(-IMMwJ4U1|qf^O>7fS>;^lmKr_<@o8JGm|Azr=oj@m zBF)~xH@`T0H=<9edi-XxVqee?rR+lIo?h(p?Yg_hn*+{m@n3afV5_;1lRk7m7kh3k_c=cXPt@V+dUj$-3-VS|~) z_UB=ou|RcZN}j_hZA8b%fn(LdsaJ}ff_@Y#zB=u%^ICuNmz?`k^`o4FtCt-Sno|R^ zciaC4Fo*O`2FGP2YVjP&7?efeH@QUFtKWxPfMBF}gZ_jDh+lbC|e&`HbS>_8iBb7rECsAY(atIO$}vRV@Q zOi2I>DyF)+`(8Z11)1@ICS3V#N`N>%q5b}td{whD>@#-(XW?fK4g(FF&^lWu?Md{l zvpg<$UXI3|cTe;8@etP?f3y_zrPgc5)~cAAi`lPwXz)Fam1re#^3U#?j9b!E^joqe z2aM5jLaEGbcEdbYa!$ruZ0&m$5k5>h z)OQ%I#OUbyqhU%MaE#M#>^d%{rFtS&xYXyMj*?T2dDQtL;cE)nobGnE%0HRXdcD?9 zsO3Bz$(ON4(obFv_}sfR<9MKR>dA?N+?hvJPAhm@_uoCp_fYf_--F7;6M8F&8Bz9w z#b%n6ORFD^z&=iDS-rODJ&K374N5fMIb!u(M-{s-V@Qcf`RZ|pP7|46i7xA*pxn&7 z5EqEBi)_DF%jd^D_G<=fSB4CU?x?biVWUpd{o!kT35WowI~&sw7cKUM!fC!9Gs86; zulqth1Z!&Y1P4oYeeqP}cC-bz4O}lYfk(dG=eT7A{YRb`CdKNCj8K%r{gN*(8ahHJ zOjhW*Gxv|FdzRasYZ=R*_tLtxjz1M{GyYgUy5Pb4jsxH693@&4dbK}FPL^)ctLUBO zC)x9{C$42xzF#X`T9uu;Z6<4TzgGGbD+`bIO*R-J(XIl3=zGI6jWb`XMR7RlAvWLwJqGJ%bS-)Fj!?R^pP8g~8t&C*>!5^f?9;A<30=uSRo%Nx zr^}KTZ{*9(>6`bvVjfUR^1iC-6x|z|+@F~|rln{Suy|#L;o#9gY^@@eW}X|(Xvnd| z;I5W}&iA9gHJ4~s2V8tPFdzD`d6ZKo_!YEi&Bpaw;{faeU=qYQp*V@{aF&#Q#2*&Ke*noI5L{D}>94nVaXi z_@ke@rshWRc`N0cq60ociP?>}tPc0?N`rkOUO@|xl z<0W=Fv-qk_XUo)y>h$_Xg4&jANAhIDP<;WhYRgR_Y3en4FOj6SeQ7I!(PbAJLay5O zGEJBsO4q$YQQPt5j-QzvYB*1=+6l;vo1I60J55vD4f+*3w`zC8j$XAJni>0UH~pI> zQ|&{9U+g5?fzbNRh|l*7!0{XX-CREnKyVV+`qOSL5(xxamjT{zc0-_c*OD=}AYjFK zT!PPb@@-vkcB zbr8}98w`4j8$^Nh%|a=d+c%&iyw;$24_3@R_|<##y*5-NG5B$?vwt1e*~p z@cwsbVLub9z%bcIwxowDx<%e2Sc`gx)s6XJNs_|eQ6NH;0SFiuqo#=YISDZ&gEeqaO(H~t5~!_+Q6_>-6#)Yr zv~ddK=^g5)0BGaD)@A3k$0kgwh_XCib|@Ah4JAovC-mxbD^lQeumW`u&?~G!2?}hKhR$#aVw*$b6vCSy038?hXscDmqyKg0yB}S}*9VLs zhzOm;qEPejV)jxJ>a`QIXr(8vfJRK5xG^$cp5a=Ru0R2hDA zU=3jV0}bfFFcm34fQe**pZ~~_q(8y~P-6f#V#QVn!;M&hU}8!K4uz&bENPK8IH)9B zn1_M8(m_}vM1&Moz(Pr2;A@0PLzb%Su8L8X_yiOP0WSSAy_h7n}=S-Au%LSB?&!2Ko8S_ z$G(r+*|aMn!8~6~$(O+2Bx2Jo*h2Fk_*{Fl_xI zTpZ_mgbra?gLtUG2o}Xf3%+Q19fCy-(f}hm2nB%IG^#haNBW9@F{P>%4;KdVEjYk< z4b&zP&7gCm$&f)jdWDV@rr$u=LmKv*Yk2AGUslnI0g2PNR{-<`3o1@RF<7WkJUWvK zM14nrP82w}pmXs+1d;tbqu2^rV+wQxk4h+q2-7*(R@f;3Edmq*DJW+;(1$@m@bCo; zTo8bA(~-kuK%Ww-NkYwGP;(S62oX63fDlyVC?0Spp?*XlkXVj2CUOFgvc!PqXb2Py zJc~zQSP&EjHAn?`aHw`Bz>i10!2?-%w4DlvfCi|Qg&L-z2FXAW-gFL+5GI29Nazt( zp$HRZ>4z?*0L}#Ty*Ly*cu~WR?!crOQGtH;`t=gTO9qlD=yk@!4Lu-}fHr1=^!70z zEFNgVp#`v>9yv*GhzKztea-x~Sr$;y2k6j1b1Wo?iX0;XE>v_Z6>z0Pj5L69eZbZE zaS(;0_B$X*;d*36M$szs{3=iw$O46v>jt+t;nl))r~v7S8xxrl0bQqX+`q{^G0Q#9 zN*5%+Hd)-_EL0l?7+|4hnuK&3bG#qS|@S?ENo|}b1>K4R|1<;!FwZ;*==CyC=N4Q58@@XQqHicuaG=Mh$QhPgf=KZf#l90 zyQbMrR^%uXu-z|(43JQx6!v`r62Kr<=$ZSym6l}SmN@bas~t~9+u#8sI_QP4ItkO2!-KpRWOqpV1; z#_7j^(` zJeZd{FiPY8%P|JB18L(xE7V>cGCEOt63IjkkO5B`Y7&RU17Kqs5X}t=Kfzv&xZdKP zWATvg&ctqC^y~7BNh(M=EDk&Z5yJ!e=a+7ZxL&^jD3Bo_>N5`9^*JH}L>m;rwFWy(Y*8g#$=~aj}pCq_qNOy&x9+QT?N>FbG8fK;*$k{$WKcdW07FqVhv43B?P*N{P@2Dms7!LbJFR0H_TO zs07do6b=@3Y%K?!OGzl`MUE4ph<$F~3TOcUQy>lqkkRwgRkC(9;o=Y}Jc@;FG-3jc zv|{sTu+y(Tds-uVr@3ufA)ln0o>f0Z67uB$=o<~L2vWT;p{|2j?HYP}62Dj2QfGtZ z2uzM0B_i0#sTK-H0Tr#PlBP+5py|kQw#hf=cLs%P3*U?DyTgS=_3u;O>C>CNsyNpu zP#ZG)fq{+X)_7u2)mS8dKk5w*5~RVUfB`Mg5Vxg3nIx1I3kBGh%oLrQmGQ}#s-S6m za}*U{$ICx{03FR{YfjYL4~4qJkrk7GB@(2qtIZFOvfv`l-8ZWUWtSoSw<-52n4M{~ zTEXQWlhPuP&Lv(k=(z-c%e&yt683n{BO%6dtM68O%vn zFqSv^!V%Ehs5*bM`#G}ia*rQEM{?!Jj+@X!*THf2ZyjWHWj@O!GtFN&* zu0tUal%@-%oZLbZse#tB?1SD4d{D{lW%Aj*t26cc{tI1?&wUG+Z@s+_mpUJ|BMY{1 zdZe3{tF7+`1@wuF84bbf)x706wQ-W;h>S~8SK7HlXnmaGJuh|9IH^IZPNC318yeX$ zV7^6-i4pQ$wK2z#M2OU+l2o{Mn?qDaZ|l4&xDmn1e7#2hGEgiBnhWa8M>gSL_=DMj+Kcrd*N zo@~vSju*ckP>v%V7!{3=;%ld^ieHc4VCtg#*hd>~GJv}Xk;Vmw)L!mb1fLwWkB;HH zOeEx7f|Fx%hi#_edESv_1TmFdrQ-c8qm?o*@vD(%DOrK)Wi?=+84Yd5f$UfVG;#1>!k^!{aSP4GFMES4&3PK}Kbw z9FkXuVvmavYjcXCFa-o`j;dgd{3Ac@BwSMP@o-ufJlOu4xU*uDG}xRmA{%``kqCbr zJn*9!bah+DGWP&6j3RQ~kYJk=)K?>q)Uy_=_Iec9W#IkzMt)V(a>lvp<~1}H6wi+X z7UPfXjBDs(=2WGl`Lvd?`zjpQHcbG;QF22M1?!kEZ>Okar6zjl?J?tj-b2Z-(dRKr3K?XEMtqv&rh%3-Q zZ+EsOB?NH382zjrKhEO?H@63HoOK@t80nzF*C(j_SL$RLiyNH5N-N;pD;#-ye7G`7 zLfMJLsPAbWDj-P4yu6z+Qc-*rDgwnO6>W5@N98$)l!+xszGvO-5-}tZwh?@5%y7)M z*SUD^_naj=(VBRA`g3q z+5v1FrRtpP1onv!_yM>L&Va|E%I07>j^onQvHp((aff2vk)C1VPoymk2Ckul?Wm^j zjRInC*yI5Y*k}Qt6S~^iOQV$?c{kExU?A zuITxH{h+Hy#B)e_zZEG<*VQ1=!0_?{y$Rl%4>Q{subrDKxCk8FBpO$3sdRafCS02U z;yp`_=FJaGk9zUm>L}h?l!yZz$wPgku0>rL*t{@_d#$fwqK;X26pvEkWxAH^GvmJ$^0cg3eXzDl$`#1a*-<*_=V9;)G*NN{ zwt+X!sh_2*`b&SsLGAj+$TMC^PJ&k)>TD+NA_U8g{#>!U`)s`0SEmea?&msTXc{|@ z_sKCZ;j$w~|DAA3#h!G7YZD=@G7~`_V8|xUb;@MmQin*n=82v7Mb(1{UxaaMgM+v|8bjlm=6PJ!~X>`^a;FwDqFO zoERm?T|w*}u9tT}0IF8@$MoNKf^^ zN#|?Nnn3=(lwm@B2oUiSOri`C%N12-CK1Gn zMqif3cv->34^p}C6nC^aoyG^g7mLx5K}ddw%IPv=>?zV5_j}qU7<4diA{KE!8^Wti zj=^1(Mqg*OK@@zg#j>OLyclhqX0%wG#1c{$18_w!a~ke3A#x)ZMaoR7yrEa&FQ1+sjt_lNY~(*pHE4kLfRwC2DfVxdFroygBAS=m_A-{cj;X80AV;0-S>k`u zV+Jpwrl@@<2>T?0m2Q!e>}k=cQ)O{VGWSyUaoOjDimYHtiOiU@WitGAv{+7{6oe)b zU=q|0WeXE-3j&U_3^13|wTJQs0|+j68jl4HB6XDpRy+dN`J%zaqoH%y&;?i9`kN;% zF=xh@BZ3}x?2Cx&k;CwwHpL-ol7Yk$zx2>?AzTzfQvZ^WLH2Pq1_gxAmVu<>;(!ur zvg!+p&{;x^EL|g6v^#1sii|sG8wJ9Xk3+1>Iz^qCL@tJj;4wOhCzcv3lS<;OpvFK} zS>NOaWcZG|JV#jov4oxi@FAaQ>2-~Gl~fZ*#CLe@dFsF+8|StDhlfU--b73`Mt-#r z2EZAwVI_wz@k@x9D<6wOoZj9S7Zk;`t2UsM?Jv{#N+{}TwUn5;x&pqdVG#%Cj-{ws zVKL<{ZHl_QOQ#3gAhnA6V$RaBNP>)TJ;e;3Pfj^(h2^eDJPv1&f1M(~f*<6>L5bvO zX)9^YGx!*JYSf2BII#(iwU^90VwA4}Jh|S=5liE|kAuY+6^X-U9ziU6pwf&ueIn58 z7lm_)ljw{GzY$zWa|(Ah*NiWuv{ic%N{q~^eDy`YnHF#F7fhu)5ABBAu74!Dr;iZOniIrlV* zp)NR$6RljAJN9*hJM@C38M1&R4yKFIv-}Q4(RD4Y;@)^fpSFs#U&nEk9pUPMI{8Eu zImVq@r(Nv_qg|pESW$BLxXAuEHig9zA9uDVR*)6t%xG}Uj_IA&M6u5zagei#aZZUb zX0kAT(>OT{2&3QZ<^oWoip82h2m7VZMyxiqAkctpE zBApGEFRP}R#waC5uZ#imgf>;HXvIA6DU~CYR41r9F`!dbF4eW_qJ_zK9H#?$Vs*Q)6h`>^zE~a${ z2S>FBCyt-UYpW+Aq69fX>q}B19jFY>O3nV9NM%V;t0)0{v@Gl7!hQ99G5x{CgF{OK zW#gv@XEbc{YRl$a>R%uf#TX|sB-vX}Rc5t^w#SFq1P3% z-P6NgFAwkj7Hv#ct5sF`cy;*ai&LX!L%+s{|GYoNH8A`aN(Th-SAGqHbm$OsJmSkx zY(xb#gw7F1uUDpX7Sj>+^u=sC_XHiaLias~|GrJf2#%l!>AX54{5!*Z<|Bfh_Fqqr z2*r(v=nM)!7!j)+Bdjmo4oNb8IqbaK!#9hD0iRq(8m zj~i7gc8JLsRqh;BP3z!+ol^Tcdg#Jo^#>Xna${Pz3siK*w4EIHLAWuUkg-GlV|ow9 zl+(rx>KzrT#*R#k$qbGeeRY)D88a3f7ekGk=$sZ(8#i?t=RG-Y9x{&dAGdsP8j&_` zT|W-38b2{{8ZV zg;<>HoVXBYdSPYa;$z%J*rdB!uS?pgOXkkPI+K?@op%K$z2cm~7bbm*Cq*Am`gS_k z-kQ9+;>C4Hm;wj3_sff<0N6k~W zR;HMYsYsa1{P!u6oQqiQRJ1t*CeDaG$%yl0M29dEP>jR}jQz-BM)KfPN+%;?f{~Us zmHw3x3Y#XMoVq7B9i%gziJH3aG#$V;rw&eL#ZCJ@n9fO?%&njH>YUCyIr(_y?4_^M zPhgW2L031qnWvo-h32lVPBX=~CrUzQoZ@E6j3&y9XYA`|D*lXDPRyKKnW=6ae-4|q z7M!iQJzlFbYi>UK!f3qSbJiqew(-wc(}P)~;@Otgv6r2*1{1Tbx5r+8oz;QO(N2!F z$<1l$%yq!V-a4H>)dc0gD&_kN$%Zf zJ!8!LU8>W&i513V$h*67?-+v9)5Y&H>fgQNmD+>*5b86fyAjE8zV}cuIAr{P6PE6S9 zEIgF?CXUG|G{;rKY_Df>Tg)LRnVl<4bm$xpe6dGxk+)>-+qMJ$UpE0MM?s;BLJysU z)h~)1a~5@;7_49X^>$IBdRTJReecWS0cU41p-W%nmSo%(WGyazb6S#1Uyu*I^fPWr z@%4gI$)!K_ODekys*{(1)g^T)<{`KTL}*#lj;W>Vu@ARc){bQAczJMzF6&h@^&fg5 zOO_4inMb-jcqW&P(2K|RJow=6amN-vTy;Ml;9;8XZWixhUhQrXI);sZuXq2wbwGzr z!+V0-qHP1-cJ(snm-naCCryMrWl$>)k*y~qXCKW>ICeQpVDlt#*zNJtXG$h7AW0BB z36u?pQ9Mu7dwNwBqDWwG&iHeQaPw>+Ie3B);M_YJ7eRn~kvM!gfx%oSZ;MI8WReCm z-j^63$D4HV;c0&_XGwOgOeVho^>e@8&WwbWvIL)|)r5JU^ezww78;rjzv7Z`k@Il= z!wpz^6betWbp>1(=kulJMObcb>k34*d9<{$VxX^SoVk((WhcK!kaqsSxly zGLS>G;k7GW z*@ykuW+2VH6J*nrYTF+fw4B4RB)7qzAF;2)w`jbby^cGx4cC`nt8I?v4zbNZ2kdSw z%gnT7E(np%eX@(r&sKTjHk;{h|Hde#_FpGi-sHi3WxIczWO;Y*?5krVZrBgQs?VOf zb9?dCEw3}r-@N`NX0i_Z$4S-zWny3Wd%p`MUz^Gg8A!^=y_I*g=gAE&uPK*171IiC zQU5y01P1RXMsr8V^c@Hhd5^u3M^gaoK7TD;O8fFI;Y?&th#u$ZsE_su2St8bEU}$r zN>5EVyP7Dt0jmz%xJ(0)Wm}yp`^6h|&)@_db-Cn+Xq#6lbz6_m6EKrF;2qEz6J8)3qCCr0}EjW2N@one%u);7Gn{@N9)6>@ zRh3UY2W7SWpM&XR>9`aZu|*1psF>2BuV0#n2fJD9?f=^GXG_@U z7!{n-6n3^M|7Kz5|6K5a3|>i=q}U zck#E2&CuoU-E&8(m@2Ar0oQj64;1VxUVqav9*Yp%0P_X*yp@kH;yEWBV^#~{P$n<( zM3XK_R*DES6c1{czd9i_#fsI+{g~==wD3G}>8)+^)o21>#vYW)F9t?R&qC`&g=iCy@bJ@oBqENKZ*}hTL>VabQ8%q4RxA(GWNUwJ-G}xs*`|KWD zuh%o!tcA+OoIZA4%=m#Msj5H?kzJzOs3fCb*(NwfjX!L=Y#xyNId7%eOow(46{KyN zyq;QmG;SFY>QyK{q0x8rTkrnxtGr7R({%W;ElgJ=JF{o7aoh-!eCjAC0Om|9Gjsox zeC@m`WrAjEpwKsxo?i46IjAUswE^ztekqbDUpE(TvA^H)r5FQJve2<{$e#I9g0SDP zJ(oO|-+sD8wW|D7!cT|CwfD=c)Rb{Il*fwFRO`+(@mqxvc{qv^;OB`5t~ zSXInS8gkcHr};m2QDHMJl(`xj2CEW%DrV<}I2&K1cEiI|=9V%znz~M^6B8@uRs-P8 zLumnS*(&cgXJ9RpgX)fD74LTCVK3)VA5Ju>%zvtdzFIx`+`6Y?elK$T=@B;5V)*7% zg?i}g?}A(rpZgb*sf}-dhdq%HTSENrMjEGG4~c((0Fr2GL%M0ia{p#>If}fttf$5c zp1)Y*5ZWR3P$Tj4xkcVgkq!qP&BPOxmwqHSb?$g-rcV4?5`A>0OIJNG?Ye}U#An9K zBY$f`Z>zrFhBx<2$Z2I1-+V83$!KtN_;-g!mG=_be5wZy8*6{c5nf9r}?cF3<4 z%~|IGuWJ9CF^O~9b<_Lxevx&)?^M^uyPAiJix20U-&`}g={y{{d-VzA@mU=IOl{1u z;LE5gpC0*^kyKCZBHmx?*8I++52daaAKp1*dp+X$qrbryjMRKv;#+8e;<^4^TX=Wu`kwN zesA2h`Z>vC|Fw=sX8ZaR-0c3}ebTE#e}T9+zt^RWe-2*%`!&n*&+Z|+U(2T?zK>nh z|NQ0-ar^oH(EB(0d2M%qGSPiKQjRnU&JclRlOm!>$V6f8@1z@xBt92mUYDp~lPHmO z0pX^olLb*yO#+f4(KevygNXvNVbPZE(aIwHN{na$&j^hs?L+!8YHiWFRu{{&Vme}C zj%M@eur(NqF~^(S3eUuTJ05HG-HnY;yIvS;$H`|R5+@CcJI&yA42zR;k8>^KJB+t*wY#w`=V!fxMaN|-54h-BQp zEt1IONQ~8I8^{w^y%UqOBa`+SiQC8It!#gE8ANjDPHkEjnAOxwByW6?%nQ2(=FD>e)+nk1D=W$pNc1~2+AX7rr5Ay>IAp=|*02%|q z67MTr2|A_(V0uAjR3tmvGf3g&WqHdRc=-WuY|`$l6a62Qj0fW+_<*d+(}m+%5LX)Fy)GfPdmL zM@ZS%l(G(ya^B+++$2b#Qcjq8PMI@1iGx}pBDm=}w{x;z?12$9)Vc;2j0!0YCuee9 zHO3>>HPC|;h#dXViq)fvPzZ{`^$Uj@!SPJeAKuQnUmXwO#d7QrQ0xwFFFTiFklFXS zIZuQM2(V*3N{}AWyO9Q7dL+mZD#VBg+3L+--taw;Nx6H)xx?R+ zzn!H#_j%0Om&~R@)|XMx$|-CrP=5nljF31Jk^+q(3%m@WZm=APts$8z%*F0Q=#p(Lh!vpa#Nwv&qCZYf#aJ5 z&D7M1kZsxA$q;0P`^@B=&nv4r8ZYfDDf@$;v31n&&nUW{@f_9jJEN8l+?g(ZWfhaGT5q0eI21x{c88D zN>M9ZrLtA0FN{{Xlxtbb7m8!da)rLFuN00ldHq3dssMWoT|3zt7dN|8$ zTrKg#Hg7ig9cbC@I&t9Tr^ytlS9_}`q*{OO`ANS13s;qV0~VH$purXL#M=;huf*EX zmPf@p_|Djhz7_IT73~zeAtBr)mGE1rTP90Fs7Jo^w_vYwqpe_{diR__zt+@wfdSpM zqXL75-v;=Hj&Y>%4<8qP$49qNXyqHR(Np6awX;O=jX9io%scMveVcc}^~PX%?p^h* zuZ;VV8&_UjED%a!nF?qe44n(;IH@;%ec^G#yNDb6k8doveMU7++~LWuXU1Dz z2wQTH9cmg)F`j?1oFOb3zGC5+-aMQYDD`4Be{C*&-7v8V!Q*u{%f z_Br39+u!~M@w{$bxclV!_toxmkv~5@9e&-i^=6^^*QYG;JAYP3@7`(r_TfPF-@h-N z_rZy303ZD<&i39sHR=vi6#5t~K{ubAG;(?o}Mzmd~0BjXCKCmlolt<=W8_eidAN`X`eMJL4nz>Rrkn?_P4QKQFCU5gwQ84m^K`pV4?5yii-T2 zj_FqQdFiXn^@hhgY@W~F8EU^!zky_JpWwK}tMQ)Ui?yzc$~WW>KQuQ!KYGo@e0D+H z)=;B4`u@MOw8J*N2{rjdvT*;{=fCA=WZqA1026;!YHV(4J}0Sr){KBXh5bSci&Rd) zf`ny>nfIEec-YNJ_=xWN8MR}&O(2wYw&;CJ<$y4?cH!BC8C6@4ZChqD=WEB=;!ovP zQ{Ep7T>sW7q~+(clsKE4;38b1TW!ZV%XTw z=*$zDwabnmR=uD=53CK?-*eblq_`en0tt8M>D+_{>?X0{6s zCG;O#Fzdv;MS%+|d-Q4+eC95^{HhE(xd>W)u691pM5D^@1lzuYD`vwijKmGGdBLdVrA!@Dk!Ry*MLy`lbQoi5w# z(9Ny|$p@ERwolfneIVsEHL!>6qrE>q=!+3F9)A?DZs8W~{<8)awcFl4w6|Njd16gd z6S2}E?q%xWqt1oruiRU^F=NYomCkvWdhd5W%W8+REze&dMNCQ3|2Xv0K+y7scfh6w zJK#;i0nXs9)0?l_Ve0VBm!7!1PwKm|{Ik!2%MUhfOdMXn{JZUeD|gSmkN-ej{!8b; z)mxu8iov>N;E!TOmy0@1J7^hxq`0+plX!#Ko2BF%#cdbQsn3ro+gj(byTc4*DD z(-%(EZ0k*s9?L`eXy?325?Bb&g$m8s37QU%2g zw^L6RpqRRrAu6ij`(`WFJ?WWy*Ibm7L4g8A(qX-h0v)UA-MJE95ye0k*TG~a#pW@+ z6g~TcpLWuXZPIYd?Ud`D=p;p6V%vw6`zUf>+7e>jho5%k=^tToo1G%sinP}5zi}Zk z^jx;?u26f$#>g8rj-TlC@9{4?=Plh87bG4ZyPq97xFTqa>RtD7_JQAX&wmv^s4BSl z$6?l&_1#AcW*#*i6r=xvH2y!Ixc|ccNCq}*vd@1JMY=RL7?oFcX=TjZ-i>q%Rl6y$ zIfIJ;zPk`t@dob&LI>uIIZ3J~Yqz;md%22|tL=;4I}^Cc`J8Qt z{gMXqz^X+zwBXO;9=0 z4yngjytvF6W*q$J+0|x=p|_0Ay~6&+icSHt02)BhJlnLt)>rdJ8ERyM<9f77Bj})W zbX5RYkvVG@w4fVNLlrdEBsXI{rZ0MZuZ7!5XXf9)HUEXv{V%`j-|V2P8S6&PSaI={ z0EX{h8I?83J#3|5nS(sGilZCMTGIPaG+jkid z!$VS#NS{pOsmVhD@`~;ZOaE1R=-x{Ioo3Sx=BFT0w+^x6jV~Gf&0FF%ySnjzsN4q# zMd|4zYA71EN@PTHiXtKVeR$(TsMD0k66azx@>>N5Ta40vvlFLA5ZWqfwRGRU1+z78Y+Lf94OwE@w5t#ym zbnpR1e2XlNt4HfCO0#I=#oYNgZ#`j^s-Vfazc|{ieSQ8U_~Eammr|bKk3f;iZ?+u5 zpov$Uz(M-%$(7r`pKp*&mv`h$ejS=UH%wKkGw=6b%Vo z7~!OlwUZsIq!7^xQ}KzW7!u~AbNK$E1qmlM9RehWbB={a9p5i4ahbIy>L85&8)NFf z!`Zh1@qocU*GSPnI94P_&a!SHBZuvR%hU;wl((*qb4Btw=)P-N*1050OGP-I&6sgV z+R9frgHL7{+naGZ3v~3*s$5`I*X~J9fj@`hc*iyel#fSysR^@lf~ zL|42$6G_dyGwcV=dS2x2{@$b+MV!Rrfo?bXS#OT~`gAA}x+YTDR7ZzMSU>vjio7Ry zkw*dkH3bSUekAVDo+(bjEuUqR$c2WbRG{^q0q zg*ML6xV!#8g1Cvl4q0xbOmlgSFUHI`*$NY~c3g8`1e|YTh!5Ju6{lmQ4xE#v6GHAX z)grvh)@M=SJxftWBI(BCXwy?;ew@t=)&Zf=wKz%%mBCv3! zpL>3J8@}5}p3in!|E%ue<7$l(HQ{R0a+$haEgpi|s&B!kjHj(nn`bfakw$M8Avtnx`Zs6j*uyIYk2f@13$Mw5=ktyfXhN}W2tPgjsIgm=a0F8KzxUm zKfw3(!CQr;6Rnaowxc|Em8Qd&4;-TDnukdF_-DmS(Z7W>|I%=|8joWB)1#z+&Hi6C z1kN?`a+FJ1jp%Vdh+xo*M?zl&nvuatvuhB*LedxoIRc=yNKq{U4h~A? zqIo{0&=#R`pYX0{oT_(I5UEmA*MOfhq)-lb7Mfb+BHus2#Go3UsI1wnQjnu#8kM5i zejNr0ZgCvTu!;_9w!vv5^NTS~|NnWC2nfAyx>7Nj+)N|0pk?yM{#&bB%RIO|0{FV(w{hXjFt zlL+1WpA5;;9G^4^hhl3VJxkG=MKKyja*^~Ejej$f?=s~Y2Iq`K&&AA>2XR$*tyBVSu+_dynLsa7 z=)j9QxUFW{v<7JVcnaTlgO3q@wp4iiX;zMompP8flc5;Eic8{ZTU4Q1PJ(VM)xxJH zrmt%Dku_N`0~F)im~(tP=}eR`{fB=`;}MFxDdmk>24UAE-VRIAmyJi?Zu>nhXbzHN zn6bXGk~<8d4G(|so$%UF!YRTZOxrNPdugy?sAtn_q5B4fO_IPk;Fwn^E%giO7BRiD zzI>^T_KTLHu6G;1$7MY!yqWBJVh9@M{#$d7-1ui9iIuDr6HY%QL) z+XMtk$}+U0{Dd|~_sF^(JS=6y*;=-vSfHa&q0qv!&YR`H6sd89+qm2pyzz74?HQkc zmaO87ugmW2@n&gUbB-xLBSv7lu4>Q!JVVux05Y1b47|08aLmWl$N4z=cgyY5SkCC5 zE~v2_Mw6IQY?lS_{K(l98`S0-M5O1q;hdPczA6ATG0=3WR(8-CaH-8tP{7%res>-p z<02+=3#{4(^w2jrJ`?gn?1wdHILj?9_Zt|QQ8)>S?3VIo0w@D|C z*#R!AGK_6Q$}ml$|MHF>rV|Sn%W?+N)3PPa<=;9Ol%v1$CNIArYK*2Qjbh~{?Jtx+ z{0_|UmJ2S-zA)!`0kXyQS(Zv5{^L+(XXcaMxpvcwe{_)R+^0{(?PHgHX>*x3zoWT+ z1Q)A(kf$}IT(NOB`~7w5nMb^=%|?RjoFlQne>U`rBd<#hgD218Xl7q9rsa9e!7`Ng zdOskd&E$S)*PisT3t=#0!rFW_yCX=n>E^8DGfgd}zDZ=uk-7Ls?j!%n1pjh-Ec<7w z;jdFl57C@bB#7F>bLZjdMw)~`N`xAuYoM!Th`5h)O$YKK*(-z43==3OrQ58M&@Rz( zzoaL%Am*C5hrKDW5rMZ^4l&OWteryxS_cP@gDr4!vIn&Z`8rl{ zLrQ)GDgnVes|JEYRJ*d6W}Vz}i*(b!TxXZxTn4@wT8+L5hdK*!SAW~AsI%kmmN-&+ z&xJP=;pG!w);<2ZTR(%1Cl{CO%4kd1b(;q$F5Nylv-ilPob0fW`8=lH==iJs4_w~d zhBt~Y?^$|yKh#rI|LRvuLu5w6YG>J(T7}!(8%y23URtQ?yHLC%cn3AI5MKYJcM^59 z$23zv_I3qcb?VpV&EU!xYpOT}M~;KzL3M*ZI z`qE>&DM`;5W&%A%q>{u8vheKx9M~-skBd<3<&X7Z4V98{M)(mmooez(`egzqs zp@fh*i|I=*2-llz{%x-+g^9ftHtruXTAz2;d0#aUf`XC_cMk?P>>aFsA@`a-q`9hG zEEh5ge+12W7ak>Gv6y=Di|60JlWSW%9_SnCf;Rnr^|toK?d7Q@#2{rdz95L81)jwa~ZZpD0u(Ttlq zPCOF793$X#nf>ksrO+-YDziuu3{W%nk>*t(zEzkmG`*V}EcH1Q^PH5-`8HQU&_n^|5Z?fs7SakO#51h*VyLmRz*fHd%jCcLXl^Z{Pv+dOFDqn`v zs;X$UjE^aP{9N*TaUH6a?ui>S3(IcLGrbzbx;vDUTpf*4v8FJsZak5=kXfMFp~R8_$~pHq|w_EXD20i&MS@p%BA1Ayx>@ z>&qnV+j{y{h9}wbZrFOS6 zuwS3bX6nv6prrc`bK2>^yM?<8KL7Nkt>t8eJPp!dQ9HDJP3z&g-oL}l=bHXw_aaFb z?@ha=6!NEhX6`LsVDNWukZX)(`0vIdu>!;*I_OBTwPZ$!GE6ip9T7h5%t*)MERk+e zB|z}N$<;C+0^S2}?TOSxt1?+0)63lBg%KAdtyjoMa=9RnS2eQ8qHVON*75Z~ zkW|1h)(>2i?faGHlKku@IYu$e@5%zghkmJ&S9ons_u>_mKaV}=Lbx7L{1{!Cs`TZy zj;*@3>7>p1<@_ygpP`y2Jkg5eQ=b8!M7>!lzFJ;Cd4OxlJXKD}l!S^Lla3>}oE zIabi1MkyeCd+pwue+1q32{i^GP<)neqTq2!6)JS;iuilb-J~%M`#(&>1-cYW4Y+z4 z7xB;6aWa3J%fSZP5}?~J!%}?FJUttnNNIu2CbAhv$N-w4%FA*xy%SJhi2D`E$zVc0+jGa*n_!Cw|5~lcGPG}x zgrR3OnZV?2o@j?VoI?cRB25UdbY-@$Ch9yGcUiX?wi9csq z1753RRVe&m%n`sJromt%|Og{5(nX`i!OtqR99)>&RM;fx<1^c(;hSpx)=s15Lkb|3!xT74p#M1PgvK6bq z5(8z^^_U~s@Xmx9n^N}$SiX*>XN`OPFm8{I)Apo+KG-*3Vj8Fj0Y^H>Ogw?Rs6|l@ z82e-$$qjESZLGahgWsZ3;|up{QsD()DzEmZ( z$(CY1X#z(=r-=v+y?d zd+WZX{Ha#CceVU^V;mp%S>G0D!Uv%l(T1en$9FdyFiR(27fW*q8@TA-{qiP|sL3K3 zYI5fPNIld7ZMA1TO}3A%qoeQ0L;*M`qS)LOsiEzV~%{?bJ3ar!fv5iXPYJm(fw_Y zY~bn{(R_!oJ-i&u#4UMTW&GyJmGeJ-XC=tnPoi|2B3G_jhVjn-hHh+-`(n!_Rx<7` zKYO3SZIY2*2d-kDGpNlC+LavhVE0Pw*X+r4>h9LH0aI{HgS7Eml2Kf2jqWX0lgVxi ztts{*g+j-K;4Iu6xcGJJ8T?6Ix#n$p?MMxlZJ&0&ZIYATuRpEUe*Pe&@1+KbIlhD} z968WZ#10eN+{wj1ZSIRCF8<^5UjfAYh2OHm@nI0d|EEx;jrObe&_LTo5YaRVF(cVj z6-gIRuA>=QZ5MM|%#cQR!H)vZN&Pn! zPTdI7s6p$~hJ~#~<$vie%*}s}b7#5<2X1L9b$aOiKL%Z_25;n?CU0hWE>;}!qQiP@pG&}SPpfJAK>G|CnJWH4NhNL+L7bsKs zm2s~IYnHI>GR(U23>@YaaW)vA|8S)@*Ipq#k7Eop?Vhudx**(ReQ1f+ZpjG#!%Niz z!bF(#^x_P5$6Y_I+omU{iPI+c*Ub4T{_(?S3t8L{(IxJAO-3~`2YO*5@;9r11$g(L z_m{1Jjij(%02*PY=gp~6WgEME<6w{x0N73RH{8yf7-~~6SWPK?If$k{2RQ#zL)mrz zT{#ExCdrF;p{|Yk`NkCI$O5-N8|Lq{BfPAV5+1CzEO33=JX+|jp>7w`^sN-*w?0Yf3l%ktZx$wd%p~!&`d-jvY+=Vl!40&~u`?IOB?k zMV@s9WCpCR`Kz4k<9PXaq{f>L23nP7=<&UZj~nQLzL|d%e8!2s z1sX){J!^|A;?~AH44&7Y9}SqHnFKmd_3F`$1ET!A9TTS0QF9_i-!`sBx+nRhDtoul zJ868M!!tH}V^|RQ&HqW(Zi|_EG=+j}GJ-7{)npy^SE2m-!akqA?^FubdlEfLY?sck_B9L&rbO%WS;E?q$-v%TP*wKTT z%J0PCjkxQYJ56tH-xEG!JSNIzp8T4jbDBNybc68`!wem-B3b5Iz?gX?O*q@NUpHF#*<4VE*Q!uJ9j8R0!yrEfu^J?GhB8GR8eH@e0>f&6OHGb zVPP{-%3eb9@_Fk6Z4q z_0lFH>sGj4-3pq!vyAFOe$%=00B|PrZr!R;>iCHb@hMMPxA|hOjmQt2^RanC4O{+aokYmT3?ZQy;3e zdJM!7+-PsJbp|slP?yW&vTFplao`%6#|1l*oCN4x-Xf}O;|eQQe5U^D<{$03?kXgT zsFxY+m*$MNUeMR;*e;-1BaTn$Q)? z@;L5vE-Es59!7LI7@tm+x3Pv)*@osAeM3p4@iVmmUo&D$468I`41k1Dj27uwfn*nLf)dd?$M)be{KaXa9K|D)CFp_t=DIN1k9Wo*<#c!Ii3S8eTHhzK3!lg^-F<}{q z;XteNO@6_qXdm#dqSLv5cqhcIV9iVcT(X1Dk%HP-sJkTPy2mujZ{JmjxGY6lCBGrJZhjQ>dhI8Cd--yJQre0O$U!FuKYl=%F$v z-z5@uS^%JjDY4Z7kw9O*LaRT1Cx{Lc-I#z~T`(ZXGGlAXk{v5r0dY`;aXaESjVa5x zM9YPRXjcdDlD3|uB7{b-F@QM*GYmvA>{$VJdF2dlG@rdQ0CQ=y3Ls2(bmM*Vv+1rO z&w0gRA7o-K6~Wj_nFZ7%>U3y!%-euVFb2Q1x($iB4keMP%z^C5$K&%w?iQfO`gZ3U zZEQtJBz#bsW6nhBF+7a*8RMIxbtb&X0;azz^=9;ETW_w8#?X)&wt-Qi;^F8oQoJ9tu$c!BZ z7~uuMg@ez4(AS)7UQ=)ZNuV;cdI$Ol_S2TkQW-ydg?9}Q70zxn%wNz>ASNT=+!6~& zucp(1i4`tz7FC4SthcE!%h@0hvA9;9o^itf(b=~&;D(=3S^TaQ(<6b_f$XiPz@cbM z5%KJ`;-*0DLh_~J2~q`(V6>8ozsGuUq(|BbnalgZ{Qc18k(VCXd|HxoB=E3#7V!HT zXmHkt@w_{D_lq@fAq2zxxPKYL4IBW)N3Ni;SsXEsl4aO#kcwiGu<&QP{>#SfDUg^NTcp^3o0~n2sm`b}j0E@P0d_Uo zYT|T}$(^vxHnM8GI5VQly;*^u+JzT7 zbJ7Ru>67kmJN9hAMXA8K(G`Td(tGQD%QJ;zt#Cs1Q0`drlFiFB<5i|l$g=sn7YeZ1 z=TjHW;3vcRl`w3gemimo%v!rO61c_mvpH^-vr!;B7b?SVaRaV(0A6C)kmGn8jk_&` z%I?80MWNLq#y3~3gF;{cq4|8Jo6B%x2qj#}xGL4~RvD8%8J=qht{o11i%>Mo(1V|L zjEkvF2U3MX%4)TSw3%F|rkg6j2*hWf5Y*>+1ggLtAmp#0zfn;1RX{sN59eT-EpG+3 zrLF;tP*CIt7&GOdKpe483Nv}+Mng(*RY(W&7b$ojAFS?&*E`1YFvvq?eBIBe4}ydU z-6n}@g0R`5**E-gk?r($l`~IC8$syY2{D+4(g#KK^C)-+!(SIt>JZcuG4hiBMb{)N zVSV+~Ar3thfHcfh?-2Syp}nVKUN4eM(2l!|(r=@T)1vt_8L{`A9cdVRBBOd_!p8-4 zD>ip7mC`ew(KHa!gB-f27>vB8ffiC>l->($jvmqAsu?9<))U3NivxiP3dW>FSYJkc zgwZX#lJpl*?x4_AWZs|{bWs8Qa@q|6;(~x(7{ddAc9a*WqwyvHzF)Q1Qx2}y5Qi}h zic<`FC}?pV^j?npWq>iHfy5%9(_&yBkM6F{t3SK-Lxl0+^UTySgB`(;o(fF&huqX~ zmy~X)ve1)qwE+`7IXLAR&jj%{RJ&Np!5sgqTXNBrXe=6*h&x|0vU2NOdP+A*4`n+fa87F(qyU)e5Q2__lM1*hn&pkbR%+PlPxl!umiCaB z-or^Q98(&Q-zk9|!mGGr<@fqzP&!mQY&^%@${|KJFCn!>W(xuPbG6g18<@JuU~dhC zw$F{h16O)-ywpkWpI5t~FnNOFRjB#NhcL;aiX6_)_~`tg+?3W=S>6h233)9MQwWY0 zBiaX_f+n=|nqj`_pmw3a$NOEA*UPS|D-m3M^|9IM@ZRfSRycC@Ps3D+NqRhXv);7L z_@Hj5E#s9%ZTLyN8Ed&MP#p}pNRR%kw`3^+4P}R^;4Z#X@!kL&^mNwM)ORX@V-z-1 z2)y|dxREv`oMP^4t}U!QVP$RJ1k@{ka;a7%MkX(1w(Za1LZ5bZQkb`o!B^I;gK?RPzIq?0*<7@H)ra zlS$K5q$(H(RYeyhFj<5j)6l#*@bK~Vuhj6`$c-%`I!y`8n{`4JcrL-~yhZTj%fhoW zd2Z(dz%-;OF#$*At=c|ntBoz+5<=0F!@8agNt(8`izi%T@EwFV zhBcl$XcoVSj87Bex}?h=UvJ)hsO98Rgabfy6dDn2Dj8-+FH9Pf;k}ZVjVY)(9wh^5 zTu)4cbk&%rrE|-rRub;*X6U(isiPV$S35$=z%Y!V0bYNR&@UlCaT^#WBRfxw!z-39 zYSr~@-Fazj{iRd=)Mp&}GdW$Lu#ezr-5h`o)zl%5mRk|f&(UiAtfBvcr=7K!_W<>FZ7+oigiCa{-36!caj3JBe+rXEwexr-)Mi|}5@(^lT69>lBC>e%U;(*l=7bb5$hBM zLP@1?PHy?B__HF=7GdV~U9Z!D?S!})VrYg6c9lbZZMMI(Azcn+Ap?CLUeDWOa<1;! zPLNej?%5uH3x9oalv!b-D#gYdN4D0WRFw7`3Fp}dM6a*tR zxl(9|H@mS3glu_Gw3>WWL^x&xaX65|JVhn`&=-sEtxC1=2ql zzWS=wU3T-bc+D+ZYxNu0Q;3`M6!uZUWoDWKPkB;y>kvR;yalH!As;CWsg=42sY;4p zh*1_wA@y zwWLMbF+D{$_Xa6%lyws?8xo{&rAX%}hq{IbCL`42Qp#Ed=);NgwcxI-xQEJ89?!6$f>Dj8)d4|3HI?h(jZ z3F#sDDyimc@hl~jFQwG*C^KZe{wTfS96VJG^7~!2IFT(1>M`~0yElMpjtR~mUz+m+s-a_gcjBp6S z*Gz~>rxb)4a>^kNt_q+SDM*b7K3+;)D1%S(C_d;TPc>wru(wizwj#>MNB2Dt`~@CS zfZ)p?NnVMmnx0F(7#}IZO;_SHk_&?f?HB^si;%hAgY!2G1|J@*U3#xlj^D#0=F7=O z3c_MGwMqpSizvDrT%&@Z3s5RKU?E0vMDQo28iFHriGq-W5KB2=zU+Rpn4lvfp2DC? zfTAPB)$@q9GKz!)#>y$PWMGz@d=w)Xb8r_F1RXiPQI2x}D2)JRsR*8mdLyDzwh$i) z5R#Ysd!{LafCcWNG%cKN~9DA5&0Ac z^1x!0;wpZ$PzlW_B$V>-7IbQ&3U1^P836D zQq}^LWEJU<3cjEsJw8QokmJuGq!KxGEuB&&1$Q5T=WwWp5K_WrT#X7|A|&S^cpo0M zNHLJIjaCIPb(E6RH#2^}O*#bcm*Vpkgm{#!BkV0ykxEpWl}Wn1t@lD9 z*%%?dcn7B38eb}Ue^dqA$#K_AsrhPh!EeY3dn!ZlIgcpMf0KiF)=VAPLIoG0lw$Rr z84A)VQ=)C?R@*nsH^TV7vgGp#N%hq<92cXQ`FuqM?J!;ojTRa`k7Pvuk~PhtiPn`L8c zr&TOHDKCO%G<7udf!J4prqjZHwU;=CNhay)Z^s!e7!BBKHTQ_1biuR0Vh8^o)I&JA zyOe5uvbmg}nJe-1T@W;;8{Jb**|nWTf--Mqx^s)xb;g#4tWDr5l1dl74n4j6^7db| z??zs)a1&3SzDuu)q3=KIkEA@|XaNPL3_0*rF=Y9+U%&CJFtw;n*IPCA!6JT@(N^lr zY}S&GQ9TiMD?7`Ue0qK*&SMARtrO?}N?S`Za7fdnqOZv$Fa5V-b&bq3gx3iP^YLrf zA!~Hu$Ksg0KYZ zjsr7N3BO8t(SpiZQ*D>`B$Z``2@@7E?(^NeE ztvnB$?5N9lsN%sNmxmtGfZl=_aXk27Y;a@bbo|38S zdvB&Tyy%t9+{Mt?@8zAE`L*+IrJZ}-3oX5o%=&TeZSN6+jsZ!glFgj^7tQNZ^M?^F z2{m(Mi)a$R`!5B~%V}*d3@66p=V^NiXJp{UCk!x5wNa9S>yPhVyJz!j^~jB*J3hLN zzuoll^^+a)-U@z3>{tI3!f0n71cdDQ6v~S8)PRdi%6Y{M7-~x&8@Yu>pgP-fO`OXBRQFP{6E@kuk3pJyA zg8~oare)7AI)rWl{AGe&Og$NAhxp~{1ETFVYf7RD*R3gCPC+V*2VGu1KO}ZawGw2P zbJ0CXG2eA8w|+E34^e-W4;AUHHhNK>JNe{Y<3ztA(vh8u`Xd8uC|E8KC%kTbbO&&U zb?Ei#>M@P}aQIO`nd-y!tr#Ud+KBm0RGmZzT>?+=x7Dq+^A)o^w5_8^#aet7@)A^U!bW63bna$UfVaZF$o?YHYINWUXpn;-3g@RA=8)}D)8c9=)v_@wa zeKL=FkIpwfDBNpqJ$k|ySeT^7#yev_-}~rssn!|xwousN=h_Re*{-aUcJ8N)pY&Pm zV*$*B-i{zW=dAP!eTG+^`ubRXYhu~7RtWG$F1}y1P3inf=k4j?x32G|jqGskcNPRU z6e#=2pH6*$-nNdd_FY9qzwi^ZLc}}P?mF@Xol-j+8N#h}48FSaAo zp<{C#Z>`>un-*}yC;bC@@5!8t0=G#vQ{Rt#eSbBu^^i_EE_g;cduqa46Osq*X>GZ~ z#`sAO7?yWj&u%!z*n-zyrqX%pz4_Ps431znsQc79vuW{JyryNXu z=db;1kxi!i&2oRJ2ALhuh7}IZgC>lgqMuQvg-&J%C*)gG{pu5&-nPjEo}^jq@DDqQ zsTH%hP1#AaGV@G6=$VTwNp9kN&h))F&OATgsWV2i!}2Rxr~Ie6nMZ|YHI(=!jO4j| zvq=mXFQOgI>8vz*>*riaGP<((nuq6|oxYdKfN{5`Ne}j9+Ha;%lo}Ws|!G%Y6j%Vg&-m$zd=)QY;b&Y-MLf}cPrE}K>H~wgW`Gu4Bjm-AW zJ#fjt>@{fN@nZITx6cuoOK{aQt}dClz5UMy_tzaHLxPiXhlb`AZwvYuw&>}UDaw&; zH3ADtFspb0$ACkkh!x7h9&3UXa3a7r@Xnrey-e&+v;7<%f>S6ec?BStu&!4+wNs*MqvqCz-`6N`evD$lHsvWpf%jWhWs;L`)rPMYBF)B8(_NLdBI2BZ zw!-~qa39w5l`#XIo?q&vR@SSC6=CT-*Rv(J>ejeR<-g02$~k9x1Y~oyYSdU#y5pMB;S;XsR-6Rz*Mn3bGTCUn2_AY zT(Nh~w41{tAt}>eyp`uJ8kJ}tO0k(_KuVf_^XZ6Q^EKX-z@1vih_P1ARo7m}pfz

7XO(F5>#M8ndTH>2nPR-WNS%w(%Xz&@)Aia`lQmnfR{ zOjba{7l#*wM(LQUnaeYAiiN7ko#0;p(^JiN(JuMegN4~8spcJ$RI9{#c=@+3a7||K zG*b<}FrmTtwbv!jO+cZfKyEmiu-Ch+zHn{G)7ZCOh5T+6konCT*oAa*oQRUu0uX6^ zVo2>$SEgmEOfS(?Lgiy%a$^9;dOXM_L{q+Wpw)b}I^U;NBwsa>3S3n6qR*O2S7BDD zZn_i*i{|J_>!o(a~(+h+Rav}@F z=D7mgwLJ@(F)D|>nsEyQhj7N8F4GrYml_b!nVJV0s7Kiwv|g0Yt9xq19^WDIl9jL6 z7+_xAZ^oks;D(JjJVM0j$Z{C~z8tvH+zV0o6{L9CY=$bxq+KCox#U|@dCj5n@GpZ_J|~2L z%v(esCAy{_b^&Ib$TzI!2KfkpUy!%BSv_X&4r%%ay`!`Jq=0jK7QWQ2yXg(B(0X56 z1;dSRdg!(2%bvE1g%W+LZ-{Ezc2e;?ksvlt;i_!a(Rnc&8$h0l;=E)@Wy+|$bg-<~ z^}?v$jD#2ygJxFYf`j=Ktie>jx)W}!IvnclU>l67mgyKB*!epOI?HhTt+ud^EZ-1p zehO?Cv#GYgNy%`L-paX?;*||1gEES9stR9Jh9HcJ&-XM!c}tq6@FIw0K(6 z3Q&>N%8EI*D$@?G%JEd&u@?_M#<`RL57zDE2nJd^IXOkHhg?QNl?^*@jH7911_3+K zb})B5NO4pHvLeQ4*~j;I8+2BLvIye|wsH!h@k?zyVQ(wF)M2mNMaeOm-Mi?Z#Z4>t zQ3hhxRH8!N2FtTq-4o#1>;wtbTon#>V=bIiHLxT(4dyF#D0MZ* zC^bOt^HDK1^AZaU+A(z1x?+7w{pN7iFQk628CIBV)mNo)kPiPAOg~yOp`e8Yt~i z(f34GuAcrBTCC~S88>?(t?M?u-#!b<``VoTJ~YRHc{_#BWAt?=Sg z(xX(i7oyLukcv33`qz}KRDpv224iy5ihHv&VCBeh3PTt?O-~Cm#yyfRi9DNsRv zap*MB=XlQT#ZQc;@LhGqLQ`!%bL;?bnC444%nGe^wc*_-f{ZO>jEqJb^IPfy=)$R~ z{)$y*nfg=Ub;iGh2NJBl+sDHXq*Sh|%QwWv#cjb?ohQypA!Adwx2AhX~VFcArnCF~^E>_8H3HXQ&5T=CffV|awl3UB@(+ULk zaPr!ziVpDp0zs$C7V@MO3n*gnBC+bOCfR zfErl?!6b@-RBTEtRudi&fa)7ja%G5v2n^;^XDB?qg}9v>FI|FW*4Vcatd%`ZF4DYS zeQP^4Dc}X%w2-@mvY06Ln-IYgjPgfziJ!DYg2R4%K!i~e064qTqCATXR0lD@{NCeI z%jiYs{-B}6#6oL!5rpEcVIFS(=fQ6PCID+D%#SAF!N8rypI`r5>V7OBPho5&nhFgKW!Z* z9QkWI6>i%sm~|HGOT_i7y~aIl?&|8NJSq6I&AF@1&S$5&kBLZ-2f15Un5ph>HvG}+xP1bn`j94LXDG&^_@pQO+V9RX(<`74~LKx~BQ95pmq zWp)1Y9#8cGt^}FIhxj76gKl1YYxnDVSg6@O>&v!7{kumd=(cBic3yr`5Tk-^f$eW! z75oZqchT0im`w83T4JfNmj;@yg4{*W6g48&fDf%OcLnsYv$ACaA5DT6dSh?@R6tVV zZWT20o>HWMY!!|y9|B4t{5hV}-+e%T13T*ik@&w>Dv5X0&j<7>#LM3)uYqGip zG*Rv_QJ7of4Yzb*fd@bx;GbQwpT-sz6=;LD!JZbcG z!n}8ZzPoCQpEf{U2a`Ht-i+H``v3+=Y15UU%(Tfx1`3Wt*@xZCWS~`5lb00U&;c7s z&{ZnPSPP0Z)F>%f>4+sxwA6Z5Hwn@dvZUs-(apvR_r#W_@?3B_M)YR2Yzf0Rd<9)e zi4H-TD+L7skgkw*Ug+?8a4%bP;4h8N4}L?Z1lSp}E58cv_eR4N=tBo25vN?<30W(U zL>1DaqL?V@1V)lVU~3ILPlEX1lyC`Hr=-u+z>QLhvy^hv2mR0q`YX{yMd4)8FNq4& zM+>33r|>Xsh_Sv^yfj28gPP6*r*`B2C^_ig5MzP35xL>Fht9Gp`Be_ zWcAtO$kdD@?WVKp<$$+{(Tp)0l#HNUTCYXR|&3{ zQCDfGX)w>w}T1-x?@ zZo}yM5_+2k4plJAHL$k=cGNM4Va0g6-vT56DFv(EJsT3D>6 z#b}UC0OF&$XeL89sNm^p+SI>jVktb#RC!37|9At9EeA7*bBau4iin!VKc6NAxATw? z4RtO628gb*%g=AX5V3+fxSZs2Q@KAaE+SbAY`~rLXHZlR($3fA($y-`V(M{nt>e!{S{1-wUj7gMySAI zoOwt?o2-Cb0T?8lEP!2+LdwrP$QDCZO<;(f=v;C*_3ajfr=g9p|w<6a&T36!qByq0o9EWg_d=E(u$;9;&& zAHu=L6%==Zv0DPJQ}>$Ul$F@& zSt_L7-i6jE&^6dg63wqKrDQ2!o)9fopzE-gYjDP;MA|Gq(uPs9R1|L&^d*eGMuaGt z%rz>Ca&P*BS34ZnKsRWHvJ6iIgWfSTvkvosim7r4qWUi!bE+6%rj847*S*qbUA;OoSFW8i9 zZJ#gmwXdHCqyhLe0 z-}A8+sg;IzsHo(%HpfJ}wps;7-J%V1L}WxtR?2%q~!ys*+j zWm7>t>8>_&+M*wYk`G1FvTIWn;C4TAD>CjBn=eDi4uvG^!?VwVR%CAnnv%@kSSsKt z+6zW%Gcz@kt+-&RwLGu^JgWnrdv9heG^1>2Ik>RdSqXB5{hL$}rU9p3Hmh{xAIbnF z6FQVtYMQpf(i1)$)&4!n``clLC(KV`VEb%dznyB@P!{QPbDuGdufL}JnvaxppzH_Q ztc#2FCdKYa&$8}en_I+=r0b^ku?@Yl`&ISg0&2yq7eX-0riW3?3dl)!SsGSq=!Bdr zaO4LSoBFK8B08V+2AbN2(MGLodewDPJr!CkK*c6G!kUo5`~ZDnfJnpdJW!^qGYQG$ zLcJknT#p6!+NuA4&%jX7uhe~CD~VDCy{%%w|ZrWOk>#N`Iy$=kw?BxgN&Qc%7_ ze@-KI?i3|yXSyYmi0)?8=+FAejdW~``E8ykG8~PL{gg3ubpFL6^W83K2dCbweRzm@ zeBHnU=h2`A4C{Q#ozu0P9cO;}v~pzNl~ZwOL;9KqBafbQviXO~b%xf=Uifv-=@swY zJd)LWExui4zT52oh&}S>JC5Imt2yGpTaDkp)fbdc7J*b-*_ol{?uzLz6Sh3A|0KOB zE<_gQSDu67j#zcqx!#H_GUxvFi@!E-V+*BS@NG)B>4h~bI;knC@&c+gQ5D3Q(&G|r zzW!NTu;pgNwcld>eKFOh0*MN-+p*|asKfq(4_)`9?eZ|E#B$g0$)}$k3!l2<*s&{9 z>shq_q7Uf-0`LJ~006Yhq^_mL>VLP*J*z;NYA`+P-}Ip>xTwIevC#T|(TApP(wB5g zQS5o@-}IrE{bqI>$#}dIqh02#Y?Jw9#@JO;i#>nShpe6RZ4YNWxblg@#^O4&%)>tw zmaK?jD(3GJNefQK`KtDYpZ?{+S>07ayOPttKDvm*%%ZwfWlFKj0^Wk@o`)&<(PvCk z4%fMmP_C-+l-!hK&#SE8b|i?$ssQHxltb3Liwd^fwuPbp`gZ?ucmMzSg%LnVYA5~% z#H;=m0ENi-EOT@#O;mg>`52qlO_%bYQpJ2$8lb}+Y;IMw6UJ}j%?R>De33+fa z*IG<#v{LqnNUcgw$z$C^<<)5Pivjwrr)s&UlooNtpf_s22YVkTgM#kpk?C-Tj-sGW zv+3P44NcZc%Z{hdc{cL;&JmFjIlvXpI|O(0T+^RD2oG?$dkRfq{P@XJ@VI{S*@tg) z>&Ua>ime^zP0k3#J$3qizkEw*Qw>z-cg%QuW?EVg`u|gX{$oX-0Is0kzsdSMfuv}g z>*94aqhe(W9pq3#A{4kB=d!6WG{e>%eG5-pq-KuWs5&+aqJO{77Y3D^&Bz`bj|LuG z{MqaKAnbzm7EyE<8iC^XL*#6IEmsNPz@0G%iwaF7*^dS{`=YgAP<|;Q-@>c~{ zxQ|KO_x{O;zdjwm@93t$Rp_D_x=UP*EU8QFv~rHf0mhQVA_=Vrjo25 zT+ur+h+=cSthrx4DPM24nZcA!z8r^s{_^MUbHBcu2d=19`h0+>&XWz+jWFyTMD7=> zzrWLGRo(UAJKx;vL#4l=yBa<+=mc_JQMze+TiUT?f9$UrW*) zUxHq#yVW&07EgQE9Q`05IO5*eot55*(qlkeu=G*$oe+MxnVxeJW6$=8GhdHo$7kbm z>#?yXBDzF&Yhd#A{>NsUZ=bPKSR3>!0E1UjGRT{Jp&OXiw+BniIKs9UK>?SE%bwT0 zl=&=Src4BKw1vACjh_Dm$Ju?`HlS;vK)dNPMrA#~(6^^Il71+Q^5bT^8$FA4pd&TL zy9BP6w^v8lVzpjXvxY(hmnCGNc>BwTA}hLZD8c%&GC#_5l;~a@FE-h}dj%&}H_YLg zaL&Gs@r!E$JXKnwz@I%{s~h6=zK-tyZ(#}laVY$sxS%E1Jl%is-kbi{nn#r9(R7?9 z)noO53CqSmdt7oLuo#<`G(AMp(6E=;pA$(kZwa!`=@E>}0-P~LN5 z(X2#&(Jctl!}(X;7qduO;usOVzG2?!MbV~ib=9e}It|ulxFrh@M)fMp^#9q|{y(hG zJ8}in{a25?N0#B-U|Mje#S9rOxg85GMOX~m5D7o8i_1#O0X`hr(YK&;Od{#Wf)VeD zn8P(51T_Hk@~U}%`qvj1Hs7Fp%h`}7;%*i#`>|z6uR&$t8@7z$G?oaML*lpL;S856wocb77cG6LUW=A@vdOLG-&X;B9 z-;*ng-OBApmj`9$&p-F$^HFz!)ZD=P+HGBrjYe$`k3xIx2sOB8I|Lq%yM8tS@QmD3 zUvq0sgDT}_T}!Rkpt$smkomeYDmh7&&l5_eTY6u2Eq_>t%F@qtMjl`0Q0ctHS=JX} zXv`1_=Kc9g>VU<{nz`+uO<(1iA?1QkzxfJ6xvt&?gKnii8bf`gm45Z9hgcvd0uv*g zK%iRWq{8zeEZ@oUIoNAeTnIFx+7Cp=(eevbF38~K@?{|wbFF+9Sr@Wv|3@w05Ar7b z1NAEi5OwB5skX^p%72BzP6;f*ihwOfhE6a`Jop7&SJaNo)S_0GP?Cd zSDCx9rccF#HjgPfQ?~Iqem>utNzLp7GBjl@JwXf@fK$1Wc@zRHw#fc|=lhox_+9w` z!a3f>zt<)?zj`3{z0&H+AK=1b*=Ce|9>3E&S#rp7=}5Yv!{`hIjds~Bh{Q# zPCA*QkZOc?yF+wFS2;A;{0a{WHYkr9VwrpOvbytFwKGgZprtEHl&o8vZdQa-%@Y1zHB&o#G&Q_mfo#Mkq>v1&5E^@JSC4bHb zEwRwynF7Vdj?3iH@hKP-$szfeUZtb{R7{!AlAgo7`O-{z?fj@%~9#E@vq zV$K3(X1K6bQb&iH6U*Qo+!vGTlv0B^kmrALKK3|H_^QYsqwwh+|DOK%RZ9k@fOa0$ zS{`=~k`nj($5U;77hM;aj7(>)si^}}&$q07XLw*1&a-Ll&L&F4srEHbuNn$(i|uoG z5I@nIbZX93fBULSD&hzQ+u2|qJhz~@gI_W+gp^XT=*JNE9sJ$KzER3Wi~-j-V1 zkaophi|D>M)ZZzV;QujaRi!~gx2&zaKn$&;*c9r}i zi^vD6VlsdKIMUkM3YgoW-|ADfMDM`b`M;wf?O$p4DL4AdapD}N5Rx2mZ7h; z8~!W&CquP2E5&K5zh3gh{kiI0?g3kb*ZdQzjnYxNJVDswsbUaKMTDdjHb|UQEC*~{g!eAach&;!(e*%FQ&i)l4{Ekjmj?ot($c>n0?1HW&jZV zKBvgF$g|TH5;LY$D0Zb15Rz#E6&XEk;mIZZBUQ zciPA95IdyzZcxqXOhRyuW_?qe;sRdlfU?y+WT&nTW7=6~p^{*NCHy5Rp@p$yha zg^G?fFpBI~CUq8|k~}?GN6#@}yxH zCP_ULcYjQNeB{o+KOh}JufDT+leWGvS|~8-d1@6nU~~@AcU*vKtB+sw^EwZ(q6e{gXxuLbhCR_41Fe6Zcz}-?@6_-|v&7HxDhicJ=qa(_h~`zjN){ z%nX2KX%Mtgsz!{rZ`S0KyeBjgYAEZ4l(s1KMFD+P^NT`8?!=2CW+CgP%(go9WihL% z`DKaAxrvuM*?p|hQqPB}qq{h-nzh#ZexvAxCOWV1(Z(EgpGfwZ?+8?IBJKpiC<=u(PD`*nn+CQ~RlwBSUsJ%T#i42Md zYyZe8m0#irWiVn*9nOcj=EJ#>+;<<&YYLq|c8pc8`FLTXsrBQ<_vhYyyfoS8{OR)4 z!!@6-OuuUVboE!?&v(~;ryHRt?j!09RgHVAs2x9d(PTGyIaYL9Z*j)wUi#{`&wY%I z?>}E>7P)-sx80lZ$b1A1HQlidI!cWU4{-S zdJxI|K=&+#amH&6^&F_KFdfR#N)&i_#dRzzPodp@mTZ#(wSrw;1ap=ZK(rG&%dMfM zt^!t8okomHl6L0c7DdkF=b%{%mGZt>0aFE;O9c|xP{f3Z7HwMVon9OD2eIZ6unDav zR0rd&6lyNov2q<}9LkobpvY`07w;s6x#Q(AYWS@)eg1UVl9!WRIzt~P^FMWs3NHg5 zl_I;(oGC3c|C$anVCvfF1aCSZ7HSylqeguh zzCL?JuOgnqUfy2&pdC19Yf2s#lm6nPOnE9(R5_RQaHBs(_6bWD!YEk7$-yfCMu)g_ zhOOzq2w}ia`xWx{-pll%PsMh~VS<-+kXXpX0(-MYT>^W5*=!?Hlo3I z9GeuIi4-L0LIJQ$AUEz|Zja%GdolzPYNZgfV+n{s%ge-`%w1?PYm1~1j1#1%NPWuB4hYQtvgaUad@sYjj>d4eTO}1!a{!b%UR8mvM+}3we60sO69aSs z80Pgfwgl9Mwf!s{5gZ4rU*^g`}G62sh7vodH26JX;J3g!hEbea$&9zw8C9xBLNN!1rQ0_gB0E>9repT3qk zK5R|e6;1~EIZTX9OPXd;uic8;`ZDnlY|KK;nsb;ws+YQDiU6r}B?$TUp;^dcP$~f- z7LJQ`l4E-o0*{m_m?s0nf5N|>vcCs9k%D$c;(3Npe?IV6f}9Zdu&Txm?^L2fi(R-t zOHGC=S`Oxy#xjpl;lI4WeELi(%rxx~;~Dk$7AC(uhl)A|{`BvMRG84R!8gIZpPZJ_0J*TW!9e;qv>^Tr1 zr+LnrSp(e_lT+1KzNBnG+X1V&a@DPAqULH~;1OU*sae~^1p*8ay;RYJuE6Ck;Z2jV z+cXF=HW%L-Y>FWVLHhWydq#iS;StSZk;~^i3?X&vT()=EA0|dZ>-Qk7xT zSP&?`YGSX8ZOI7>?e|38)3?N>NDEXWfj4iPlednIG8G&=dg}d%aNnsd zBQ9}-P-=I9=L&oyY6=c;rP^%WjgGvcdW?plnij?5Zu5^=Z;?bN^%7G#)6F5I3Y1Pp z(#w|pv-+;cP=+0Q$E@U?xWQ?V;WA0v-nxhjYY#wRk@WmZ`1?8-G(YHubHFiClL=4* z5dkTHIC0x9(F#{3ZOMwb)5-E|EP~ACZGcfuNUX|3h4N60CXV`DNt@kYNZ#V5%O(yyDKQNjjZ#AI|s@@*dj#wcRL{$aR#gtzxq_tjHur}mfr~1ha z8gpbTyZ;P%ksB&}y^^WF`{~9HmrzYa1z};)Q7yh*xa!2G^q{uqKPeqSV*?0g^VJjQ zTeqv8>FVb7J^c+M0Mu={a6|T0A^F_3u9fk+2e03UW_ro_BbEZ^FSjopB?TxX|EyeA z^-6N|+9BM6@xVL6bM{HxRUG*Yxj`6dLw$IL3$Un}Aud0=XD|5@&6kQ`Y_i+EjaI_V zXs(MbZ>y6hXLpE;Hr3^;oW0bB>J10|E)1|!C&azXQ)NLrS8{;L5JwI7*&e9%`n(ex z*+t{wZ|s0C8?wsoyZCdK{BZz`r^0ItTtBwYzHvsHb8fpO3{KKe5J^*P8khWNWvii?m2x?%aNA{+7j<4Fq7r!|Vy}(tDim#aCz?{uu z=bObAnvE@KdgOAaa<$p;qJxWOw~WbdPerzF3_cYnq0@GTfwoS)~nR~_j{6l-Y;S^gYnn7oE3okq=2n`psX#w9nf0kM5$u!1-#3@ zbkyQeREBz0u1}bo2<6KzzJ|(K{x$RYKWm#eLZ($HmO3)&NK~T@;-pz4osQ%8MtAo@ zjtXCw8x>Ogo(4`B-geLKJ$CbF6hY>~w0SD;+qfi(cp1ocF51l!MktY({l*gDBCOs=X;s*zE|Ftt8f+ z<(Y~S4PZ#x3?9!(vO=Qkjpng2C}%ck!Uo@LK&f&Poz#JP$~}KVYpvM%-c*Q(*>y>_ ztZY_+B^Ao3wySzr3xTN{MavHwEi+QZeoqZO>zhSWg0>3CW+SK#nq|LAW55S&n5c}0 zf$>40jXW@FMr(i*f!!>?SQUHFd+Cig5i5YX@gD2lm9QZd6tDn_x`?9D_E^E@J$Z}T zITR5Ws!EET2AU^;qM}2IJcXVH;N1s31t9fpq#Xc#@nq9AK%$gO1L`RP@Y@7OH(|~< zPH?Bkdar2xTn*kBLyQz99%2I3TBQ>ch*Yf7j-%1#URG6vkV$B|nre!mJ{sMQJIU zwd{-KkkwI4CMMz=G`bh7%}3GIXvxFXa~fk8-B=m|R8FMtFf&L9aDMYLSR9LJ&`{J>oz*vGcJUPT~xWQrSSlM3Ep7X#!ZA8%`|&D39!@jzS9b0M*hE;RnQFlEUMF zuuU{`yQxuUY^Z68YoAa-0+n2}0i8DE z9Qw3LXOkhYM?eWv0bNKx)G^y(a_xy8;-R@z*q^Fl6X*!)L<43(e$HIJvZ)Z%5v^_e zHyFyCOR@!KZgTuZ71}s8AkdGAJ_1osRQuPVqjby$+aQF_i{(b|s-Cv{qUR~;0EVTk4#`S*@F0%IWu z*CbH6%rj;{>goNPe&a4%?N2pBdbL4K6u0m3IQsi9{L_%t>DpvuxBAR=(RY{L1KDY$ zqZNeC8z}ofP=&`^2#^9J$<7FNj&l-Xrgd8R3(Ke+8=NAl*X7oJgm@fSrBFxd zPZAz62sVw-w~GysJLoEyceEg(rV$L8Bsitu=+qOCkm%G1vXwAHX!qL>T)*`AF&pX^ zQI5Ytn|F;|8@~*7YUy@A>SLYQ+D*&X3-Q|p7z<5WI*cRbpdt$%ua~DTR6%2B!MnY8 z?qRTWIWD8_6e=lnyXL5i04jd<%1WjAs@TE=QFd_<(u%ZA2oO$+EW$#Rol2^C{eDwg6JbSZclX6DzX$=Q#*OzRDmf= zPWMxS%3774iu6jZB5G9IBc(S3RsbBPJkM3`#6&~I0kL*y({CJTQ?ox4 zGWdpqj)CPm#41OQGj5K3!uH(<1f#kf($pXgySp6 zV))v8=)y5W^n&bcuK+gWMPIs7kaPI{Do;fzgrILM^uwJQ+j)Pv6_AB3A6;hyj8coR zEkix|;Dd#zyq~Q_GvQl}`oS<@t%nwpt6CI*Uzemh^Y;D@a{-hk67HEqF;o}*)MwC{ z3(_TCW{RMN&q{wxfK1h**zraFr6IB7OP1LH*6MImSjJRFn!u~S__5C0XmO0EI zsN3VfQCscR^G18lqR({H(e{vtRR2wRv+XR?zwtHxD}ZMwpt3x#8PvR)(cK&P+=;wO zkr(tiG;g+I(Og+T>&7fWILZx)^%Qcv<(rA|A(iwwJDVZ+S@=s-L>N87S+J>o$mLPa z2XF$qx)kzOj3EzQUak8WY8SD?llmwbwi7LNQEfR$gD#*V{v>?J?ss`MH1EMW&YKje z?Bw=X4wWaw?C;B5N5wLf8=*WZ{Z}>lbpf`%I<7MB)b6$CLJ?Yb(MFSb$F@K4y7yuG z^3_QkDSG-x_orP@XZcG0o*84;Q_Y~896I!UsZAP6^G{h%P>CmBT>O;kHlqg3MNo3_ zjqi4|>8nv^XWZ6sJ`iTyio8CkAnE&n{VuplgFSzI)F1Y;SAM8XcrNtY`rC z#k`(>FmT%+v}x>w;Bd$;i;&v(BcP$9a5(Qqbjv`2#rn#@;!#|Mp?|bm5LG@(X80_s zjMEEJ5lo>c_XKN#kIbh#oS5y(4MP5|vkQ<;n{jwDrCs3Av=e}hG_y7JS;Y}#B@b8# zD*IbseoDTLzjIgGhXLHekXii_xF`;Ggyly zM?ugrVz~cDG>kgH$-+`q*1ZdN>sfo^%dNNI>6FYSRa*C|EHLS*pYbGgVgA{qXM2r- zxa}pTC73q(-G_bK$A0|2KkWtsxGA^eU8nzzfH8z*5f?{5zrh+3B`lv8oBhJ=+mtJg z**tb?CmhuYvpvN#SisX`eN-GyZ=pDU0j#M`Z$WEwi;`FMF;gw@(VL4pbPu1;u=!Ll zwG8$MWGst29d2LldD>Gdz^^^+WO^P9{|(id z#k%JmIM79GL>pS|=Gb|~#@OsX!xKNbmwF<0d4boW_#zMFuF|yjm^TP16o)~J6)?cX zv2Z?bxjmJmIc<7Cbavr68 zf8dAd*kIqveDcajk4;tGDPl~(_tuuQrlRC=@AxCRx}kB2=ihJeN-DA}oIaaC=>ErM zt0g3Uyv9k(tq(`bhQOt{9~Q?2TI6?0cG;}DFs^s^_;AX;)ww^O<=qHux1qwEeKor( zC*y(a`IPjU1!i8&rWXX=TYWs2h^`I}fY(h3zQNyALSXs||4 zvo9R|aROZ9dcf{s%~`mw_H(4O^*ZJ*8gh}qQb zjYVhH{k;SC=cwOe;WMF0t|AGSkGDv}y%ieV2%4(1dGzsb(d{(vgIROW936R|+rLhF z@zcTJO=pV8+v=6L0nMP>@BYn?#%8W+rX|-ck0oF_G97T$AM}QEH7)u)P3o(J+VA(m z{`%+HofzB4)#p1NnO2Tr1Km|saXBJWwo+4X=6C1$jvIlyU4lXc53^|#<0z>g6 z;jYxuIB1pl38MjZOGPBJvLqizV4QnLIR)KEq)dFYnxk04O`Xgii{d-!c6OrUqV)7N znovw9_oD56{U_piz+&zK{f#1*Sx&at^EbeFi_<)rCxG9%rBl}^%xL5WGir`PZ22Ky zqJLS4GYMZt*bGa|0xDc-j$E>~x#t)y#2M3u`9kE6ly>2lP0px@OC0iX8gO0*_QU@#g_ z(rQg&C}(g^f`b4BS8hC{z`7l~OQ1hku((%)o$}>Uk_CqtDx`v%MAKp2J77ttmGgR< z=Lht8$tp>6&Es+WpO{b((X4=!SZ{0Lt=&OmD_@=-y5^KGCJMEDKX)ci-h8Ky9}JjJ zJis!Uh$(_VxhD99p?kD6yq64OGmKuB0O4Yhc->;{2MY`mMLm9oOuMkb@*eMm>j+x~ zC(JeNFA@o(F{-{`wn|LTV?sHb_;F>1pZh?Ql z;|!W50M{AGAw3PetL=WDxV;<|oy~V8RP?lAJ!&B}3X`y6(Z32fE9D*!I`L926gRLv zmpT%xH6Wu$tI?&ugRPaj%I!*Qv`A%&npl4F*=JiU;{$fdIBA(QH3*^BrtOH`i=@3 zY3{=pWysxLh}FC7qHwHkE2%Y{2ITLsQj*_C0oU0=4$I}y$~4eCp&90meFK&Xx(`4C z#9&WqfwqicJ)-PWSbTA#;7Mj4$MN2t<#7^wTgdlfTfM%bAT9Ote%(!d9vv@cx#F2- zLjqpHfvB<;0)oE-w;OF`OqhO9fMy#`ZYtK&_jF)_B?uZl9DICHwF^5dsOUwzKF9J= znC2}>_U#!A+qFB|IV_<+Dx|M= zS6S*Qlju`f-@hGIWF2aRB{9VKnRHcnx1zUnu@vuv zN0nx)0k*fWI7%$@M=S7!!97oDvh%xGFd2OR-Ab~B&wuys^^UZSzI6T=FhI?qidLG0 z7x4qoKn@r?iktqsvy|E8k`ZTRI#Sbg##}8)vuG8czB+=xXT=)Cl8>8l7M?Cs_`G{-x#}^H!Mx=EZ$Yc@{8j7xyOgEuW|27I+atBFh436Ru8D2zZDO>meqgsfJr<+E z3P&A5e6{A@4VxG=ID84qL|@w?dyt4-(+rT+P+@mIvA=J5x%I0}g(&&u4Z@zK@z_FV zNj7pZ`~_ku1d>=q-ug760^f9|GO?NcN|2vs?eOS@tkhp@L2t#=kC%wbmeG*x=^8xH ztEfk=%mqwjh-dQUU`O$(dp;(e$3z3-+cD?)7fN3H9(wJF7y&?(oW*ChmPSS%b{@R66R$ z&F0-K&W86doH~8-v7A0(n34(%xLm06-M4OXPcOsGs3W3uUnP#ELmbBXQg8fB$BI-~ zaz}YO--pvs#$f;{&4pMM$iP>pOovyAjZpK5b0w7q70Nt!Cy|Q?Xf-ryve?jl9L! zku&E^rM-@~@*+LZS?qn!+KE|t>IGK(9*<>vxS_;m9Ha3YVjUJLZ$g$uKUJdXFTs0; z2&)t6yjdCfJ*jgnOQ?E%NDvhy~_Wy{`(BL{ukb~YB}As?9$&hPPCt!np1`pblcfqKB3 ze3`j`a19J1A;kvxu;o?OEEuFu0!>*v^#Sl`H^NNRk;#0-6PFpBtE{au_?_EBL6~){ zL%#%{Q%4>bKyq}zf#wIhhmp`gi(c4m_g!m+!TsmHVkd4@%+l-ZdO%;U$Qg91;)7@O zn(6Eo*RFkcA*H^oCEnGgz8Ns(gC*}C%$TJY7c>_KyAqPN;ctxquP62zFwclJcuEII zQC42)k6MipGq&L!Awp&`LIl7)+vasYjy)S(v?>o_0Ak6=qeCr>T}s-xTu;md@xy>2 zXJ}p^;Z=XRcT3&2pk17m=fZs+)>m>K=pFtgG8Z@Ryu@2#A^@|p z@P^YBN0JCTva0em&#o^Fm|3T%W5PNgY^!M?vD^mS z#}boSjb+2SGc1B~eCZgV|5!m>a7t*yZ<#DFHdA&i5nnbK)}?eHlxcvWGQX`~OcW6> z$u3th>%V56n7N{PT3R6PtcW{KIG^8dzKgF-t2G?54zA|N`ccGRjm+n)Lx02MAHKq) z#|#IeO3gNjY5XHJwtkki14tFKs0ahE^E0mbafsMdrf;c63ER+JSGEqf;LJ4bbCh*DR5)H@S@_lMXlN_=x(oLod1 zqPwiDAPKFHnybLDbDX~qG_(i~3iv$~mDuj>-n@0oB8$y3lb$l5qlFa0-_wtR?5$@W z0-ZE%I`A&=Ar7Q&m2u>NfLWkBl>+tydMbh*(;lQ_z#3GllOwr5)d&Wu9m;`P#QPp% zEIhZeOngp_kkr5+A~xsD-t=*Zq)Poe2BK~t*i+r&%V z4!|oY}U>?i@#xa3;!Ud^!(;R-QAOjP28svEeyg4(PP$7o3*ou zb*JNXnBtel8dZSOmmQ&8o4%(6Ux4=VIv!YwXC6&^0o?X0NTm8af$g7N0CT$NAQP>Z zY-Y4W#+D&hV)C~TPza@`f;l#9|3zv=iJn{wDhi5((js{QoQIFelf^UBK>in}=LN2l zASjgB;@@!k(Vz@v)r|L4BQv%z#tugZmWjZw+Y%q@l>a2kOKoq=Sr4+M-(&m;`c5lXpqma7mREd}UP9WYDWT}loPQl~RQR}ep)x~3F zT76I)1TrxXVM)p42Y#N+F%Bc|hhz#&7!?pq!=Rub^qJUseL+RK*ho2M+%JxkCr1h} zGnSgQ{!9mRrtsD|5VCyas#oJA{I=8>N!)>-14DIrs4JXr0V0V0GTV3(*sxtDzm#7_ z|7L1}((gdAl}K4L1hRA3(|`s1XsIFj-Uk`qVZW6ksD{0|rodz9R%N-P_@^nbqWNsm z1ST6FbKo)P>XaxG&dW{YTxh`uvT)X^HZ~~Ggi7B>ywzb^2qAxGAKfBzNB)58{PB4) z{IBv=8;)$ptL^}E*#*3GP?nmd*^al2D{z$~!Fl1J9FR={@y%Zr3fA?n$FP<|2^O3#96I#z__AFv5n2jJ}`}Z{Tq0F31A>UjH-Qh^YuaYYq|yzbYSOPIC^MFY-Goqh8 zF=^E!(|3q&OZ{x!S8D2$rL9TW^vkUS4?gx}$LN8%_8gC@l^Ury6`QZG;Uh$_{dBvi zzeiXn&b7s}8@a$S5|mD8ej!*GA(>@)LVq$yRWj=mI&~NczFDsC6G8eVfOtd-$_+m( zz`QJQ+GRlyI>WaLoVSy1n-2#AbkK$LN)HZJRn3UgUFZzbD%1fLb`#xm#pFpO)Mqp8 zZ`kH2Qn>J+W%K~i$xdUpk3+waBi*X-N88=$HEM+~3DrX0Lgm8Vpbr{tHW9iL(Ow%Z zQpfIkeC7$e@VPf#Q>l7#hZ&@YBnwdzPJhtws!6f^*B_;OBfCYbEbypi*8?Z7Ak;Dx)GiA_g*LqCVJqxUzR1G?-~+n8-;E zJK@H9CsP_svjrzm$2AkMf1O@&;nPJ~dvFffqMls636&rfYCz&lA*s9z7tL{}raXVF zTtu8do=PQbJbMopGHIe7MW*d&>G4Db#p zwl3=@vLp0^-dle-;_&OI__R}I97M#Hn}3SR+&wNJI+PZqZb>6FTrh=O^m4-&3T|8yhY=Ej2u1JfgLZauj%@*nFc( zWW7i86Rk6>g_hCc_&ItxE|krfF-ax`v&7GBA4qqQ`|vB-`8a(@VlWa~@WGcvUIt5O z8ey?_M`u!yutvP(1&zd7quD17`dZh!(<61(vzzpLG*~BPevp1p z;0t~Or}^S7QTA&2&2OLb=kDoW$h_w?nA(ux$zWO=9P1AmIEpw3xP<)g=cygHHyE|e zKlHOwqCW;N<%t&$Mo*q>Db`@EhH0c!q_-$Gtc+;8V#f64g&A7*I&0w*g!CsxLT2gU z+-e?SV$VlhHIXj(5}{d0*?@{NMTZ^VPp1f{u7BTmxAOcHpkrTj#Iy~@vejHw#^gzQ zrEnRlvy*z0B{9>S+WlGUCLW9HD`8~K{*vur^Yz%BZC_^Dl<`2VjTzK`53I4$?C*M; zcD9kLL>Uj$QcYi8+*GA;a%J&xED?&rSzo9ZRS&Q<;^*~L>t{XXK`G1udZS`LIld`I zw5n6h)LXSUsfqQPUhW|FtcF-M{Y1+<}u(LY!+UKZl{dK;QHi`YfYA$^Ci@QlMJLspy|ezTX446k=yq*!wRQhCj_{ zIYE5CUz9o(rYmKlo7bpZ(aK$EQt^Kr2fh-P9~i5!x-QxmWLqV-JG{;ex&U)STOW>l zoWF4U86RAzK#dC&sNrB5E>|eQ3t`v#dN{@%0jYQrI-;tQqWMvZ8*Dvh#xx>032z(s zs5U|LLg26izzfk}Dqg~5nCWja6iztYnn0)vli;;^X>$!?<_zSUixl%s>5=FY31WI3 z0)_qtust4fLFFiJ##UruJMQoDZ|!>K;+$Q1OShWMi-gvA2<8$Q0`{*>3ZYvZ7^c%? zr2Epv{=7h%u|v{*jABb4Qeqd^i%3N-ia<|uycb%52H{SWgfnF z&>JZl97HM%%orHugw5Ku&{I8xVf6dVWZX(-m!`!_>yI9z^HNb(`ChX__!^|!r0BP2 zH3ojFL*)WvlRGyix&j*gBbleo`AL~7Ag%2+F3v!8h^N+!tgyrUv|ApWoIWnCThH7) zJoBYV75OT2&!rK-MZrBG7Mo==Iknqm_N08uNwT(x66d+aFN7ge>FHp_T;H~~L7y8~X$_J4AJ`#QrV)rKX#2z+?sF2KdcSJq{) zrS0zPImIQy2*HLdw6gSot}Sj*^*#8lwn)rI;wUC6$9#!oa>)Gj$8s)rrd#MF;Q}PLJ1>57d zzpJ-F9lTq*FA3J`RP}i2v1%yqr0jbSID9ybmza99C!^<*sil6YU1&h8 zW(TA4;3hAi!jQy?MaUhALe~g%WMpIN(1Ty08v}GPH8TceDeln+fW!(@lBI8X^Yhs7 z@Gk(*Guk$?$I@}}&w_foeKhC`{QjWYwYJ+avepY$@PHSvmKiTyaMBUNXx|lH0&Fb- z@aXRZ*k7}7n9Q4!N>KgCrjY~NzlEbnRnI5N6Q-ZCrA4y>v{C+jaC1Sexk~r4iAWlD zKemPotCs&F1(4AJ$Ksa|5TijW8tHoT8>B0>bePL)?AJXk+)YaEcI-&txu}+3R@pXN zG;?~~YwlC}WBVPsOPb=*EKGw#Tl#nlPeyXbP&{UAu z@Ln!*!yDl451eK$W#iL@oihSWC>A?1Cqk z;go;Z65v@|yJ6K`&{Ud5H?H_*g^?H3E62Ptx@|oXMP(;edodJ?cvhk~b=|HVIsu*C zIxR;3;^C77#G575T>|*JBs}<);GHUd+cBVjSM{BsqE^}YoUlu5+68(7?i2Z~H(-LT z)!y=3SfMy>evN(xv8ApiI0HBlZ%&D$l6R6ZyVK*wjquNns^9knR!K{o{46Fn9<-i0-Wc+Z~d zatyf=))jJ1R6s%iTE79Pxg3w#x(7(T4R3wiI!~b?;K)iqhaW+oC^vd@d&^Y(Qs>>s>e8(D`9D|n*Z-|D`ij@VY;z~s@A<|KM?O1YQ!8W`eX^=Ec15gS?^y29L zt7%&&9A0gU4JZf=mK_3=Z!9icCrkjODcaDq?t=Ou-y6s?Ud&8gvrbC%WqAmh!S%Eo z?A62#+V(u>H)FnqFZ}?=?vr08-8DG{FTG`0;3N%J-VgeA)a6vvS%L~Diy{vp>B&yc zCQb`JS8j>LwL0+vPrVLnrjnKbS1|T!S5KYwxl)-o(-DA9}pY zMbu%Krr}X!d*ZZhQ4xJ{#$1)tAfX*;eNq3w=+ zX?k8gkt}ZYF4gpdVWf7Mb zG_QeYG@>&4g+95iAAJ(Wr+~Ot1P@o3g_L~I)|45&g&AT^gHG8m_^%g0d|<`kzyn?$ zqDL2(dARjx8S4A6I&`rqiDxi4bJKhRKV-_g!I7qjkh>JI0a{GwN`L-Q0>FD=&HbyY zzTWpceGU7rrXu1DK;ZD%mL_pc>d zA1vHoA`5CjJGm5mYC!g8R^XM~g@au%t+RL<#;HP^Jz?Dp6~R-A$$+)}wHh_3&knUv zch=UVTPT5)U$iQcG?~Pcdmc4a_SMFIO(RKDl5fz}{Ev_ePXHUJLn=w=syq_ydFQeo zB;BOT%w^_l8m&-=&ixpD#G-G%R^mmv4Cq`&EN*pscuL^7=kqC2!18%;-QmX{7LTXI zqcsorukAjRO%Y+0+-XUEWQ_Gj&qPxIwWAAd%cZe9?Q6OS!<}#j7(px3JmQ2`ozU={@h~Oi9x-`JFvyfcHCf z8a`^n3}(Y$sbgIEv{(;t(QOaY^Y5v9Ux14(Z7rNNi;qbxLV^KS@b=@Si3Y5bB@7-ZQda}!21+AY!EBf zYY9AD3W^$vfGkTw2PqLy5m7^t zq9{Quh%FQW5jEIAMGatYD=LbeGuJw2?|1DF@A&V1#{Zl#&KT#bF^uG%b3QZk{@u@Y zMU&)!j-0RhF3^Dttg-w=&&*@nf{B!Vdejx_)4V@ts6@`yE6h%=INvY3M`s40O?>Lf zoxnw;{&<8aJ(Tpn%{!o)%oQWIPa;GwpC^r15K)fpOwAKvr6-}(Wte@W+7~Ol;`kD* zP7AmY!?)n)B*ymvmVLJ~r*L0iQG@zE8k>9b<|a4lIek~+4_E9GdtnV{`xh5jY7sI* zpZ1%_vjc*}Ic+vp+L+L2zsEoOHT{%K{Q$$EUWB>J*b!sw+RtO|(oEpTY-P6}l~5^YVBTB#u`}N&v*TC_q5u2%~#n@jyLOLir558!q0>16o51m1SItKf~)Zu zVByagu&T$APz?XfXJH0gbSnZrT2#2ZJkXaQZwt`f-Rs#Hs}hfV+Lp&i?xr6|Ht!?+ z!`55~g>wjIMt3K~jVP4(&kxn3N!hgA+A_d; zyJCMiSH;WghRv>`PhWeqZLhA@*yiQh*`}AZ#&%$D*VQbGezFY7dnj3Wtf!^~IWWP# zzv>U&+RsO3^nHYg*esHWwb?tl()p{^pOZ^>T+wamh^1H604RKcg;}Qh5wUeSWwPk| zl^!!~jLJBhk;G>3Pl!1-;+7LYOIrXr5Z4b@cd~PS&M+`oQj2$GDx&0glAW+tGE=TF zBvEJeYCe^aFXZa9*oOToZC>!|vV#{lGw+FLLD+9KqKDWN{ETI%x0?nVbNu@$=E%6{Nmz zR4u5Jh54wam^NEQ!H2sjE2_(mxq)v__e5K|37UkKXf3EIhFS5_b zRh(cXgRolkXc9BogWs=UwUjhY>+8jV_LwNgZXQ!%H~eX)OAh)L3Uue!b4CSo&x=%8 zI5(}K`e}rWi{a^1XCJ>yrY9uO9nIK^pi1g*0|y~oDuQ$;tdiqAvr&+n7wzar93BVF z8$#Y9`2`qe7|D;uF5q5pVi%|{s!2<{-5lB+d9h~8hOzdT!M%$Pq`zx0kDTbzN4!Z4 zt2D{DwcM*r&D=vIJ2*8^oM#s?QMk#|2d9wojB2^t5KB2^vAiX7^xKJIEqxDlMgkm@ zOt*`i8LxxS;SafQl4k0|F$tP}$$sp7`g)-N+kpEn!YRrFV({vB!pw5jFi|}Xvq{1m zt>--|Ci5VZqdl!!Z&Qf*fN^hK@A>x?F?cnJGC%>NUcO_3>*u=aFq$Dzg1n>7v4My> zZ-O;2>IlS2G*$(e<|_{!D9qFGE37M^UpfjB7+g8GKsUg2vOqO}*-@Y?d7yOqX3~b+ z*BvHH!f!aeYD=}lc)bx`DVj%m{ug&aV0xw?U)7!x za5L=g1v?X;yNrk>Zg(ewfnZE^e8sW1ZTB8*=(ryFaN}Z6AfJxgwj?yv;@7FWVX#i& zoxt)3SM%w9;z`WbR|hj5lUf63AGxxxshwHwZCG_m;qF{;#)MmN=iRWo@r9v&OILR5 zf}Yj31^vzxT8bz>gcpd}YxX@)CZ7^3y+h}l}}QSB7EUqMUEului$b=+9K0le_}_LGf?Ul;59 zZI-icb@l{kuQnO`k+tD?hUd`6x#-kyQDBNG^-tE5_YeQP47MMCmJ+^dNS+=?16v=_ zHAKmcBwimQKq@P1PH^V8_!)xXwXUj5|P>}2^9+qci!pZxxDb+g{wuWx@I-unHQ z27=BAq<=S*flAeqOCU#}kS2rAtw9JO!fdr971*kpt*}YF;)#I{+IIG!#d30uZDU~L zOb@ja(w#=}ljIn}Wz_*;z8&K*d1JMwPUPl%mzhb$$^uU&b$4O+n;50t)n50Ap+&)I z^)Fq&o;L~ET}-xJt=3U}<*-iZu9Y(e2dlq&TbJ#&k2adt9L;RDXxd%6@j|$2-3uS5 zChL;aQ`4H)Gkq8B=qUSR#!&s!S6{YUM|qB|kutp1&l~Cx?n>*8r>cDO^B)lJt~}L9 zGTiDPTr93QFw=-z_{~2wOkCMuYfPHV3|Nvct~!>sh8+GaU|EQGPv@yMKRvbvuDsN~ z_x#M7-?85UW2V~o_1UidlCm{u&GPo@YiZ9vR(uOeG;iO3`_w#n{np@(A5YXgoO%A{ z4ZQZ?F-$J&=9zXc$l*#ba*2UWowH^8~(|r2lx5a{! zn@eFkQ`elWoV@RChsj$KlDgH;IJ#BUr}Tz$APl|F2_Bj;*#K2;UsP@NW3cX5*)?-?VpKh9IU-QiF6pYKF0-T3)#)VkxJ??q?4`#i=i zu=+9{zi;E0`w7j*zdT4f`|is_-k{a&MB3QK*+-c#j?X^cHaquj_6Z+9|EnxlW7F5k z!r5zbJ!5J;$;838d?jCWSex&w3|&r<<@*oyfQ*sD zGxG`^UVoUM$|wW~oR&*J&nfQ6JkO@Y({i+j=0{meKx!f*st-EB*<3pP=yQPN0{($K zXWNfQ3WbD=FLXLKHlvo17O5xCCP5Z7|o{nMV1bZ04>`n(0! zjisg!INwtUk@&i~QOn(3BdOmB@MGf>%)18|mn*7==KqssrHw+X{>g0gMA!mrj1gl< zE|cU@)O?H*TQ(jvp zhps76c9aQE^i)O65J+<+Nx@Q1Y&HOEayVPpMMaW4elKDS8 z6Aox8;%@236{+~Dnw{+ZI)4RI7sHX!JU3xUE~EsvNB6nQL?QSQ>MpIA@KV8_M>no; zvAC@V*N6Oi(e4m=*xI>jv@xM#i?^e}?|XiAJ@B6j2DT>AM^DBnGF+tV^xC()pU5F@ zp7FX`)%-K}xXJ4U1f|&iQngnm90d3mJ^HWOX#<)l@)_Nbh$5dkA_|Dd4$#D6QJ;W_ zx3_fs5Yv;Rq-Jx9(2+|iH;%0m?e-WT(oL|^@q`Zzf#qgVZ>4n&zSp%FE|((M27<+h zu?GFc$EQsz$&vY+fM7}(HBWQ_b+7abXbrXcalPlJoJj2$XnFD?zy^m_fw7tD*U)hkh7>e&KGO? z`^@vfd2_LM%dKUst9*EU7!K#aUvnqWV2@M+E80r|tW)UcFrx9DvoKY=;-0dHk5WW7 z&}e5Hkw+I4>Ia6`MMdoTFTh)4wCEcDDmsdb268ZQ1dg9j#Lgva2h?WrMC?4eiJPUq z2rar9rq|Ir3?b!X79B-_h#pKpvu(kPwq1;({;x={y5u?B1KaSWPbMnxJ+4rR7IDUv|T=*&`F9g z00zvgmMv4bts;8A>_XxgwW^a!#wAW1Iud?sWPa>LcwZ=4Vy=S)u6eAubf8*fw-VfO z?tqWgqm#o0zkXFVjG1+83{al%Sa)O=>dPEG`bb~6s*_;NkJ^=fY`?*H=DKwk*{t3& z5~t89@Jn1$(qu6;&BCT)>Jn*tt*U_~~o*6f|8;n@9!s=IA0+GQ;sJm)} z390v2WDpyr-p2h>Cc!a6iolATalqG9Eln8k>8iMo>d5zt&R1JxB-}Q4g|AekPOM`3 zDg^Y$?jnY&(*AY6&qqtI_K(t|{PDlm3L{ggh@DN=^x2jv)%VEL!0+Wn{k2xu{IymX zV%eJ7;q{HX>kFv+Sk@_C{+*Z-jAN>OmmrisTxRbu@!I>;SUX3RM``#UP>mu7VBAW-WX6IKmkt1@8c>x?gUE2PPbqZ%yn4wSyVL8f>U?iE{@Cf_71X*Uzo1mfR?g=uaHJ|8NaE67 zg+-!*#|lc{Y%3QVGjf#{Q`92#eTboroZP@QrlSZ5{;SB=XpuGlRb;=v&uHa39I}vh{K12 z3h;}29nr_&{eR&mzhkeg^Qp4UFrxo;en*m5&99maEub0@cl>&YnvgGtQPZnbqX18e zCWYihaJhHby|bBd0p0$N>9L`w)G7}g6^w6B|Ik!A>4RR*Z}vLHEfMWMz2;Wc%+Wt) zSFbu=hUI9>MVNxk!^*CvJjad~S0L@6)R77g)1+th?D3MWPpvo+-bM;e= zWMa=ETPbaHx%z3pPz4QdBTkUYt*^Hg6tDV)=0g9xDLR1*Ks|JG@qaArVi7wBJ<(mG z(1TGxQKF{#b;J-0u`2UbdpHAE%GIy~g&*R46)P9<_?dOQDNi9&&%9)^PLhp+j8$9s zef7TO)|+I7tzx+9Z{+9me2>N1?tvvGw3q}+E0oSM{oH`pKZ2S95JNrmKnd1nOqimcGnA*1qD4Ny=MiMFaz1z;;@1MV83-5}<-Th|h z>OoZeDdPZz16301r|0`;l>6r~YZwHttRpM#aeZ^+pVhRIj}*R7ybyzpr3r(892JvQ z7+(6@_KGdV0H(9)YR1!@t+UFuvn7N=9crW9)F2aoP#s@+>EOxvPL4f>ud;MjhoJlQ zOG}(jxe)D?%a*z9* z>Oy`xriYhP6%mqnq{@gUMmt zxgV%el27yw`KiQwbosFR>@yk?DxxqJZR$5ohVg@X@CbSZ-d%n12qw_cl*S%Vpimh` z!cgQjdWe7D?TZ=hD?)cn=?-pBU7LrkH0 z#IK)Ad(2XenIel%8?7H?ZPOu`R#JBX-mj3_@ApJ_heZ?WhmSW`$hsxZwQ8rH12_k# zj+;C3Lp?<5q|r+s0vwX~^V1YkMB%En)*I^~Lx$!&WFMZCmAx@FLBGUr-DG5u;s`ri z0N{;6B6yN)AIydDW2>55Jeg&B4z#m=sLFI2aa$f<>Fre12qyEY+`a<2Ry8pD4oHX*&H0B(&{SP$gwicTs z!DS2ol5uygyIF$-er5dq46Tp@sqs}>|3ZUSObDi%?ly(}g$7ldME`wLbnyMtC>oS= zjYm7C`WG5B#%*CnBRouZm`2f{OXD!9H3mZofe13$3!n9ReXT3`iQag~BGm4d`-~0~ znd)3-0pF_3bC=H#XoXo%=KYFAN!6cTj)_mZwS<=K$vK*H-)7_S{Sr_IVh`$uOsp$f zox+NmpKOSG+|;Jnh~9VsJgCLjcyi<55ejbjgWH@5d8J4|r5PY1nm$yhYu66%{+(Y=k&96QxezagfGv0x@Xy;SI-N)@{8i3 z_)Ce++Y%#N;|^qeIk&RNq-kjF!5!+~ALQDvEsR;PP3v__0uWSR=2TVFP&SWB`~I?N zn;DA@U@<%i2u8?yD{7mL?t>P5m3t~W(~Nfaku6)+Z-~Z4%|nPRg49Bx<*~VCB6g3{ z+m5xGyWXDk{^v@s2snVA;Jp9UiDMNz^dC%FhX2X9>I&52{x?%L|Hi<@TK`V8`C=bV zF!hy=%&SFmP`yo+eog&f7Wd&>%6~Iu?FyNLcTlFRy0=W<0}pDOOh^MzrtEH$iM z4Fjbbj>~INrtBt9bPk{;6MagcYFeW+$EI;&iMF-#uw=J9pVSA@$U^JLnAr2x3(5WD z1~{LlV^Bql&X&nYl_qg=rtG7~P?I$m2o-pE5LE3+OfaUefWV+-%Q(wBKXd~W#5C{3 zimo+Ii9>n=fT1cuLCFy=v=F zx28OFSm(<`Ckc{c=bNrcxtR zf>6-F-uldXA_u~{G>&Vrt+^t+#U|67GAdIwqF1roF|G`8$AlL%o_O7sqj zJGP&$o2df!9EuGW&49Do8obI+?9o6>pVcxYWF;?_WPuEkj3YL#(h|GMDy5#LrF(}X zQk3_4V)S3rRQPti(R0Puab{I9WenpPn!t9gedl#(Q(J0)=BpVSWTDIBSZeY@(kU2Q z8IcpRKxsx+)2Sr3c^dEdlh$K@#g;aWy!o76YWHShO48MIW`!z%x0MvTOyo|FD1OZD zl-Qkh1+vwjRe{s+9Rkds_r$L{5ggXFLnqx-8bg3mu_V6NL|VYbUX$sS33pgA*N%SR)SZ5v=)mdZVx!W;k+i z&dUjNexIH=^gIL>OhyP%H+Yv+!urIRMid!H%nc)jmomw%^0Gd5een$U25Sjk8{I>zUi=`;01|cIHgg3CsQ_ZJNLEK zqco8x(d+_8p#J_Po4rDt@u}1OrD2}tSjWN{Jq#T+WH|&#rb;VP@2=B!O z6E|@LziEq^#)Z+ESu%m)j0ofC=&`{R$h-CVCEi_*Q0xjljH4#;XOizJ&G{|yG)-XV z`|=_6Q$U_TCbqRMWGloWV3_{X8JM%v95iTrScPrnH@Cw1Y0@{0snDn$CB)lUBydRCjwD|`S;|=)> zk3QYCn&Q7l*W+ZitvQZi$~X00=54Fo59me-NL~ppnuvh#aertmDgx1F`GlGCN`OdN zwYFRtYe$RlcGmP^sjC=RGX+$ROi8OB!NSV|x7+OB-QNgcjFZ&WfSd#@!`G(bZFB_RjW!Yr(Y{Cb)u%=z3YuG^L?7SUJ-0)Q{G-t4x> zS)H1OPH+!x_Sqm7=+m?DYtAEhOF5{W#4OYpmr#|r3COiFtacX?Zuk?zMocPLny#Sz z||msGuc$? z1yE<31lrt{?YRbk2!v@3$4s_K28w|DK0SP5k^Jn&}uk&n>+c~Pr9>sAt%rELLDg#=uxTB}mOj>G`vk5^#~j_;%0ORW z_BNJmHJ*3Ke=-M2g4B}a?D?F!kB%HBsmbq(Ig*T89SzhPhOX$p{Fbd$CBYdK_F0D2 z6+0#X(njEl=^=Ew$5f!x9fgv|9>IF#T#W12KXFH;1kVWpHQ$e|r8SwYu(}7gRi0re zK?D}A+4%WGee@7fzKd-(HBrK*eMIoiCL*QqB}OXlVUDP{XLLYPnvwr0a_ti6{3 zxv{X`-d_yaP2GJ-kA z!>Mrb=)-)2oY=RAB;dkFg~{vw7U%9^k~?VxEivYt7^}?1oswYGxcK8V@_qzk$cIg6 z08Iqza4{iLOdNt=Du%Ram}4f;hFP5D%WOX;w3&rN-KW}8I3p7bmf`F7l_kn?Jykgw z5*Xs;y1fJ$YYVtEaMufrB@e%pn-@jEWdNA@NS-!i?8 zIZ^X(cQS*AE0GbFF(L900oCW8WMcG1E1zWG41kD@B8)Z%)}vMHiTysLW4G;#2@&F^ z6S6jp6Lv^3-@=!n_T*A#7HR`#q=RIi-1$84`%8=&KS_hLj4m(p5et{nK+3BOHaA0E zipk*qVacr6A%hTBz8*_m`+nRKc?J!D{KV-ySQvF6^GI?5=6OVUJzm@kOdAxE&u&v# z8eTwfRK}B&0Fv`JBE(NiMupf?=+&IYuJhbz6!NGnB%YK)Zd_6mK(cuOx6rU<tDk z6Nvh95z=X4vc5)IgXB;vN=Fo7adZoV`I>&fBP=B;rO$V3k34Z^y#-NEuKE)&p>#9GSo zRHc}bF#@X26%1x%@5}4Tz_U@%A@dDtiESWhOP!@?|;VGudE2;gnN?^n5h92KqW2-{qxparTr zkZu|t1}DCP+QfKtW@w4<1e*!#AmXK5j4dtt=NWOsUGiN-p_mVbR`GHiD;3uT=yMmJ z&0AqEi`EoH8;BsfY?Y=2bY!lw;ICM~gx}p=^+zkX3?PZ-#KisG*N}iLKBUbBHG~1WLN1F3GNoI$${=-`zm9Cbv|nTW%l)XNK2DB{ zbA%R%wH2Q4XVD-d1SHzin5?r`NDxdT6$^oZ411Dq;Vt5dEyHYQF;v+U82v2V{yu~< ztba8^W@2dPsCZ`wY$iLZ=c4UK!v}Go_4>5vBhYX^PE%{iYh#*)Fu+_Cpztv${;s79 zV!m9p`bs}^!uh<781z9-90`Ri=UAII_N;!n9;3ry==4D@vLG7(laY7P1b|nch8`b* zq^d!BtPS&JNB2zzeXxK}EQiyK0fTXjBLL~DNNmLFwOcl4r)=)&w`){`SER#3FBGlw zdU}zAol7bY&P41}f=;?<+5(b!(Y>}bNHKlA0TT><7L5H6G5>;DzY*Z-Lvz^XefPdM zz*rh`1YO2sLaQJ%&bhdr)m@=Mxl`6Kr~z?$7pq+veY)~E8(wcpxBD4k8ckzg052E^ zF8mk)h4#jH^&e98Ifw~31`+rOVdFMTenjO^+CU;@z;0Xj-q9uVcXMi%1Sv7v?07zQ z(SsDWX|7r*b~p5fbs*GvWC*v0#^jh)yakxjo|J6^s&(Ggs;YKxm2#sGmbxnKouHjL zMc)Aq^Hpg7$N{T>K#&FC&?bU6nga^|!;$Od$NNjUrf|Y>$Y7wfkgi`QW_uz;P{XaN zaCZkfx@hl10&W=#Z>G&$0w>84ea(tk}El zobvS58r#s22veHz%>xE1xc`n9>EC{&|BWyF>)W-V->yVy+E+0LmrRH@tCfAE8E#7hyLIP}*!MqXEqVg7(QbU^tM(ToTx_~H zjd=ToyU4-w_0vSv7HOW<>h~Lto~*lda4zfn56!feh@<|gv3G|*w@O;P&*~m8PQ{P5 zuHR6j#*1t7-#M4tp^&(nppWo>D?3BklO8lBWs`KkpfN_^z#9@;-s#}~a|-BxV=eyY zf9hY=`~T04|1X^ze;qfqzpv@P1`z(frj=c?esabe3M2)1A}Ww;U<-C>sJN;|i4A*n zR6~@seNx63fYz8H&a2&1<pbq8TDM$L1Z7qFXe!Go& zLT6kjYBOW|TI0IuUngFut}hT+CL_GaP5W)Fp4Ye?@r8^BwN+vLY2S$+mDJO)r947#NhBY~WjN2;chkhk2*&rc3zMi!qaV!b2}|UpG>&TgOr; zN+;Jfi<8Z7&|TtXSfP?z8uG6c^*LG@&Ht>7Dzm|>Cuh+Pqo7PfG{J+3%C=}i&8A^( z)-q^y+50JO>(3zyVpwogZ%=UfP8ETWP@bw3UHTz{Gd&AT9Ow)d#3AKaAE& z{K*yjUCxx%sCD^2E8A`+^eoVQWea9TzFQD2PIZr^@#EmCv^DB8AIbEO~%r772w8gnh}AnEp2y96-e*gR7i6TH=asC>31 zs(!Fck2xWm8T-82wqsB)%%oi3GoOm2%(R$b@;oy^)wsQ;N_CgEQyd-_P>MW#b}}5E z;+Ow(tmPeAJNkdtt|ZjMr$^Zu^Ydi~Zxa1wf+e~7vGOS(OiHj6BK5wY?}%Nort38PU4_r6p6PFJB3L2rpVY? zoHO-#bob4}W7|27l4^5wYMSIgc|1OR=a{>gzG+*;x_9hIP3!UWUt0D)UPbqqPg#X& zz|yn4XIXca1oL_>z(-F%yEfS_i7mxz+}TABm^ddByWKF``sc$-dYjKpvBnM7T{^tT zK8m^J)a2D>i=A&jDB~WV-aYs2&8wT8u>xFZEv6``)MlmD<1rv{(IV9 zRM1zbojPyHaMfDr0W2F}2b_MzDb)#-73$l)x^x6-4`}0fSd4WB{ju%zeI;K_rcPN% z-hsWAJ=%=6q1$_qt1C{WY`kS9;O##|STS3F`t@1NePt}GYDxF?H&bHwc(Ln`ThGp3 z@>+6|=jm6j>y&$eUu|LdnN3nkc`?AWot7N1;bHc5G@Ol0Av)Q}6qt(XFCv<~G_!Au_czut4D%X~Lppb|;zHJo zr_s3^cbw6WvzrfJ-ae=5-BqU?Uk+W%{J!G*=8Bve413D!Xw|F6I`5^r!LM(>4$n4@ zpDWt@o&extfxL10YH<}1%L89S2JK}yTm#a3h}ly&4JtMhKR zLwwW9a5fGNUJKvR{hk( zJBrE*Py0vGmgQ}lc4M4MP$!<}27)OrZq4_~VMzWDII&JE3^?mu4qDe5H6EjJYI0?fC3<<*@W zu=!E6?LP=Qq?#ItUu^wDCcM4IK7>0WU37wj}=7C{_*nXpO=Y ze~s>2al@`zWeYQ%K9%aeaotqW!Yxl970XUL`swtrQYqH$Ua7@KH#sUnIu$HKiTfyL zTG9H3-&C<}Z9g7w@^MI|bm1H6G>I`n^AFPFVHRFr5Z^ULvA$UtHfY@Pxu?YTY+Fwe zaC_p`6)o4#O-tj7M-$f_%yhQbEZ+8IYuGMJ+=KfDD{DWMyZ$~kz1aDLxbKGBiHORV z?l=5CEq0l6^&D|;7ke&NdNJ~e|9%q^+;aP1~4{18)bfub=mB$Y^oIyQ}w<1E`CRNXb;!+jmlf7u}Y2 z1}mu?TTuW!kWZDHzB+aLBY-#cQLu(w5BXQTAXen^61{bltgt~7`p#jD?bM4Ot z)t8$6F*pzp3PI{lu4n^BczI5V=Y3{tAdoR`0?mKn;vWByG`A!{>sM+1{O{Uc20@g@eUt{LSdF*#Jz}cqM z`DqE4nX>QBohGl+3*6ebQ-glyz6J;O$9vc$UXAQdSq_Chi^kaO=TQ4SF-6lB8CS2Z z`u=gBgwn(+@E?iQ`cyp>)MT^o>d0E>Py3}MO}5Sc*VixqR5L!(WPkSR^-Woy4#+6Y zj)VR;QffZcz6@%19=m!Yz5CNac}cVD3;&y04?Z3GI@0Vmdv)&Sj_;oi0}AMd?f_}F z){KY{+~T1zEX{YGsiT#)c$ox@7B8Qvr(bXJaTp#g%bICmDzy6f2HdKsnQ1f)ZVgyE zd~0v_%n?>;YtXuY+cghnnjEjUhGY!iKJ@Lf@b%)O+z}0 zmyS%SpZ|J=Rn}3mE@)co;nxAj8y#gCBh$J+z78VPlR_7Z9A(vSLq2EbSL~~O`pRbi z)jM`4s}2V}GFf~M6ME+3?ql25m@YnhZRPWmdpj5_X#`*-@X%{&cPj=gIX5>H{!RdV z6b5S%`1CiXf|cF^NJcR02XhwVx8 zikCeXBmmyIx*lrTC_tUd#4e%nn@(%O-hJn4T(eT1~Con#q2hf>{mthRlZ9CY0md$IEU^f!NNQgjRR$L z0nAmr#5V}K7l7SteG$fqr}UU}1@6B`cVT8EH`L~upI2XNeXCZz0w8PnDP$_3J~)&& zDFx=)g#M}ev-^dvUk{N*!}>THkPJ9I#1z?Dy3qltO7oW9&3t)^q8HXWliht}`*V8K zN?pwv{l#zQvR)+vK)<&k^fsNb~2V`)w zFJ@RoK($lGJP>WiS|E@TkMw{?8IhB7n-VwTx2O1K7>~gj1(9P8B&drh5)w6exC9C2 z!R&T4>)6d9zd1`hDZw=&BrO)UQ;4+^lb3OEA~A+ZCnux(;s8>(kaU;@rgF&1T;e$) z#)?L6VqsfYq#zSWO9bXQKn+~d3Km~ih(V*DAU@8U3+n;ck5V#O2+x;cmdr_DT|QQY zMY+c#71IDqX%Zyg#@m;3d+GMXyXc#7yIJ@GF;SU?EknZ;gyf9oPfXBXma7SDRpt1PYO(DH%QkwUZ&3Q6Y7LLsAoMf|7F%nr?R)&q**Y zPCx@O31Pn!I>jQPo$)3qyqC7iLrf|=OKcE=d-)_tyepgsT^_>i7GfKjmqF*N=C?QX@v9Q z9YP0CX+P{QCJFes^I~i$LUN)J4#rzY-~xqMG_2DSLcTIeB?3AKA$uXLCkBlGD20h{6A>5P1~$AXAAPaM zbtuwGPF%q$F5nZ<0I*R=6uyA1#Kb0G*PG_rLH`0n9^trfM*<%_EF)+kkedkhN29+v zKBO4;-fNP1piepM#vFkR1(;mta&}H5=_Ypb9tIO~W0F&ukf{`ut*wK21^QC3dkoa)z!t#a zy}nQo9@dxD84E>=UV}Xn5{19UejJdVRb0C~}bXV!GVM0v74KIJk8*sw1pZci(&t_Zs?rN)nzduH=tb(Cwh*Fg+f z$c}cduRB#tV=|jC`mmCS@LZzsM6NKwrPhcJ1Pn)>cBY*-->_Q?W{F^yG|7W;Zf;a?BhGuJQsUZehE zIP$+WcltkXwf@iFkq(5QyNnpyIa62KB-TN#I+?vmOq%Ua#6yRUAYxG54K>}Q9v}RauU8#jn6jzPb zI4mTnn)8`akWUd=-A~+AXMn{jF2HyRJvTqTF#Ne#?PUzdhoWhc(!v2fy@?EqRZm5t z7l+@V)67oV@@a07wsFWQ$5D2{E9KTyFX?o97upf1+4!DeI9sF@FuxXf7voDM^p_fL z_Idb)ifo%9-u8hSnEcwGhND|DEZ)}uh^*|IJ*L96OjsQV1I(!s|r~RLezQ6Xb6>347CTLxCB2UmRY#Tkrn_r-9gW*UdN}hQIkV_*! z6dJ^lHA0>`(vIt1+&A;wOz8tFm#^aBH#6Q*=T#0&{QmaC_s-!8WqWn!3!xCM(6CRG zMCZPH;yw%C=|)EfCo zsv((XCe8iJF0Maqu=48}(R{qIsH75};zeFsNnRgbk)5+Ac}-YUQ+2mH4di+o@ys0FC}$A#=CmPu5WP|Q_L8~V|j#uCPnSOWrR ztWL62YRE0oc1UQGi0U95m2N+QbjbUQlnpjth_ER?6rAhFj+xf;{l|a(i3GV&?qouS1 z2XMEJdV6XF46bOO>-8~i@n+`hsMK#atSDJgbUFEe@+l98Uh1hnAYtnH84GR?#+}l} zfvq}#I>)h3jQfdf!oKE%)X&EkPDo?c<=VK>T&y(y`j>U*;Em%VCJ<0gci&Vs zq(43My4~lv8r_wa4^SDd6t`!ElS8AQ<}P7{Nm4`KS>r7351+#a&c%>3&EJlTV+K_K z43i7Mw)`9)Xy(N#-@nWKT|a@g?1bh&cclH#SJQv{j@{@otM;#D){lcjw-8_-(`XG| z9=Qz6SEa9DL5Z@_d{MKzc!KES8Mx{_> z&msHwB~FQgwbumJTOQD)eh5jRo;DS4E%v&h5V2*ioFCJN19f6WLtXl4D1qHv_3}eD zZkLXZX@ryydgjtF{T7_lKABEvr9C0+Iw4QHz7%<9E) z%n}uQo^V|LSDW?6&uBla; z)%v0&AU|!hz#2bljcwWYq@FWV?&&7nTn#bJ|C3B38;Aa3aP2?%+0*t7(x!-yov+k8C73` z*6uf(0y3cJ#;N5LaV*v0$u_t_o!&oBy2{x06pR5dvS|S3({f62$1`^W?mwkD74DS% zLbl2Me+J=|00+bY*uNXEW(2yUn7E6H!M^ny(y#M0Vg9r6T8%Dh|H{Nvd2u;;WS#Yd zukx6|d}R$BwTGyslA({h% z|AV^sjB29o`bVdv5t1-KfKW{+5)d>XC4kC=E`kOG1Vjx*L_iIQirCWV#h{3&sG%sR zs6kP%hmMFEQ4xEvV!g3r<;?xO=l?$U^Wk0Vf7*xhIcve1ea*G^p1psij%JZEH(Hc@ z1M0JDNZNO^H^M5=YEZQ6B(${6^^a}T$-82P=d-?=&b*RIj2FCzMy`ue#m*@T_6SBK zG||oe@$1e?ARfFnds_)Bv9o2>1Jxe8w68#ZWbOSqDft-yD*6U9`U+<7&;8JIT8k}n zCVFW<^zfL#Ch*VYh60No{r@Zp@eiV#<9$oCEpR2efFD}KfGmUQN-TPMuBjx_pdU=2 z7@!a2ZI)d{1{T3@Q&fi^&B)=r*^#QWvcz&JXSA)oMs<7(I`REyZ_#8wkXbPU{&w^( zv}oe%_xr6|Q=}G9QXDs<{+7+m*U`;IuU8$uZ5}x7S%E?Uv@U7r+wEB7`b3N2v3pmi zA$a)KnE=(}^Ui=W!v1gXKDGY!xEY#>tJm%kb*{yo|E%pbdFt zQ4_m0pVqu>!&6Qg#=lS2@upi{<$T$jzd!Ra_o-^bqu(z8*od-jNzV6BDUP@UwC$wr z?aq6Yak(%zKACFr!X&-rGNwOt<~9>9R2i@JT~j0O836h>El3bj!qh$P4>rQqo()(H z+Tvy6hR{p_M715JAnnDt?!HRY{qvZ#GWHPy2Q3Kyd;tC5>HwPmqsGvgi3+U7Xp=ER zJ|a~{nvy=u1Ol{7A$C?9?+M%`4z2z?%2dqO2Q7j&yY#_*duFV^MQT%q16A5n1LBsu zD9L$xlYWz0KCrG1SY!?I8<#(m(4>R%Q~l3c6iL+{NbqvxjcMlH9++0oW?DM->1C zFdUkBDuNyqfmlb^$tbo9c5B8k1}~8^$u6D44MR)x*wdohkXo3Y!-*f-5T)tuVmPH& zv}M%gQB3Jg<39tl*rz}@qDci0>X}{a#)J)p zm3adsxqHwQf}2T0sZsU8PNWBjmCvboFeiR~xRK*xgm8tFB>4wUgfW!bPd{A?MN zgf4vmeCQkKEdxSD6Cgzm(7tKaKNkP|t(Hp2@A(=jVef+Qf5!7X5D8iU2LEns742dp zntdFXbJZ#j(YlE6Eo)VU)_RlAH%l~B&?|w|HpUa>OPTD!pfF!7%Qz)zurT5XWHXMi zQN@cd(sK%KBsJG{Q4K8PRapzRT3lHFrO9U0NtiD(wT*khZMKw^=mp1PSUbg|ODF&Q zIbb^0$<(S_;yo;9J?+wB*l;TvU#?p6c*_ei-#qAR7mZ;MY*r{}vB|Xv?*FmpybkBS zB>42J7~z{eXO`Ko49PYOz2_eF`A-pe@MIDD_q??1h<^-EBsjGM56Xq}# z(Lns`=)JYcr9QaSEX(`q zI`i{bN5SXMr?$!@g?=|8opvaFiDny-3JOzh18D8oyQb0;Y;mnb(H&#AlN>~a}p1yFYD*u@P45H45G z8Q&oq|7aU+U?0paZI3uAYW6gd9S%JH{(R0^y|+P(&R263sqmFCW*uChu$imsYgXLy z-ZEh^VH%~$SD7FW$-<&KT!G3Qm3`y+6BXqEaDD~_;_vO{1P*RKBX@_ zh};B-ne}itP?P?&YW4feYxy|uUjaP!)u!pQaWlEht4^ksBk>^1?WKhj)ot;mc!l_M z5ng-_M|HH4ssPeV#q&5rre~JT@6e56gLuQ4U1&R%kFg0;o9t4apguOwBZy`iwNbrUmPj0K zAw=%jm9OzM-in*~%qUv2e5elf@>Aq{yv!(^%ccd{7V!mHEGb9dZWqCY}T|KED49$;U>jDLR#Gkk%9zq=Yg_EQ-^z%xh%8B(5vh~T&( zY-w$ezDLg6g7z9L6Pt0$M$zfw|n8V|GVDaYOTwl~Oe>R5mpGyiGa39eOn9vb_$BAPKhnX=2v#9?~xyMR5RQa*xXikLP&Eps(CAYDu^Tu{3W$L0ity33GdEGB4 z5Z`Kgcu92b{ji}uL~F~$r&9;oGD4XT$X7UnXE2y61Gho>yPazA2&(5r~)Q4D;(wf4E|^ZM%&Zf*L3Hmf1`hYNF&` z?>#x;f5xla@yzWJ+l;7AN6y|Cr+rG=EWO^+{~{v9(8^tEpF z{xjS#2YTh$^H>tM^tomOlUzs8pj0xueJpQYjoYSxt`ELgtOC}J`W5Mkf@wsWwF0p^NXfHdBh()v$@~g4 z23^2eD?{sb$u6YS>F=ec^Njm}8w%jg?hJha_uNhUeCN(G>UQ7u#t;xqLozHdSsvQ4QujgzZ~FYhWeW!o@ZTz+kKq*oXhU-XLMqjSon$Jic!_u7e*S7iKaf_azw6! zg0U+)%+F(2bhrC;UYmX;`i9D-chq@6ha&{KIsJWNkWf=yd&P;Lg%0x}KL9m;i?)Nl z7N6Bv>LtnA-P?h&EAHl1FBU`BxHm-2=HfL3%S`It$kSoOnE{1 z;_F$1)(}0Tgz85NX?{;BuqS2WR43uZ=o5gSyS(v==T)p2Si*>JC@{#b6T#jXZyxXu zzexf3_K1c6`h5xkt_JC&#xIZ$RX!7;nWdf=xJuv9`FB4rZ!|L#Uvqq2ompmPP`!SL zN^QFbEcUWSDel(if!I9L!=JRL#0u0rMX&pzM-2!C=_{voEel}I*K+pL1bc8Q)V`j((Xc?zL+=e9EYyv@FQRcdn1BF3 z0=3>vo80A3+ zAihFGdsQ*<1f_V7j@+WbjaN~;nP|SvwCJ8Be`9Ml9ViALAniSToYLAq{El@+r1me# zHKKEMF-+L5UR@-1Yrm^a*A}b}0S+j9Vcq-OBV`t_pMEHi1FV?TMs?}MD(o{<3LhAl zAArmLl2Gb(HD#M<$}0y<1c3TWzRDBP2ojxM)lVCF78 zHg8d1s;f1#*CPlsS-^?JGn}MkBW|vx2|`%(Ru#}0oo8Xs7xQHuAYa|B!!@AOMp=>z z0l7uP@urZXYE=h2xt}|mJSVd!JC#-1M84v1ZPZpBu75|x?Dq;`(Z$5C0~CKc^+bBMyBN`q~;<5 zA>czCW%CK?q&@}CR(M$)ZfA1#*(%}@O0dqxkK5t~{g@SIMZ{oKqVFP0wo$YXELH&o zk~O}uNsAJMP2iO`_iT;pql)etsa50p(OmTfriyN=Z&d@(^Q38H(9 z0@?{0sH~nzgaqxRgBntZUkyBMOhim)LIyG>F71MtHdi5`DnvL-#hY3C?Jvt7XmEBx zyub{=V3%k8k{WdK|Y^EC2A;lY} z%K>)44bY%KwBM88PL5E(lnDiBkWm2JZBvM^t)=6{E8dX(MAErM0(|EwTT;4EVkFWK zvZ=fjCqJ=+RucYIEsr?2oti!>!NHxc60N-M?tk+7gvW3fJ3y=zkp#jSDBeEE2~Qno z>NTtU?1woZUk=faa-_IgpxB`WHB1=;?P~cl2a$y8FY>nzaw1P2-l^Nh!JE7-CV#0- zAX|#WR3Fix%j6OLHikc)qmYc(KGB~Q1Zq{NOJ@5ih?9l^yyXH3u?;fC{_Ql+!-#G3 zlS%R&4omd~G0-#7g}UJ`TW6NoFkr#8hwT8bQb~&6z$&T~l4Pw+h#{qfn zJO^;XV3!DQT7YUB?0KTEPx5oTrXj`pwG$63R#kfSgXPB>Fo;4oooyzuZt9@T>GRR` z8w1&GSa%Cxn#PEX9>juJiMf*@LCl_K^vll{eO!+pd*~sl*Xq~H0V_egl-+1~^;92Z%FrdoOutWT+#xa#XNkf@K9CRJ-^@o*q9n7DM0zcacpGOvF1B%lVOXC?=NeEH=f{J+FvF-(2&X5) z82XsK=8VsEt7MiCaj^Z+_P9qltnSPU=(L3}8E1Np;p&ujcEkW;Av=Y*R}js-92|GW?rXilA%SN%ThMC$`TR z&dsl#a;6U=1);K(lnzjBpd!x_iv8_ zfe*Of@PKN-Pq(6+IMDGgv1dPoSt77?_v{IG@_rFHOqsoq1MbO%iYp*1e9CG$*m)}4 z5)Ee}36KJGWkF1hhXvy8q6?d$-~}Q1g^cB;0=Ayg31@5+@T|!-&ObjRLGiFB6XSd0 z=F4#yTB2TwH|qhNgg>W>X3jsETBFXBnk@( zW5e}ZB1{74-T|_rT`Bqo9H1qr7#wp|7U&)yFFKR0=ROAS&@DOEUVI_Cq^Hp)HoK(1 zt)%*7@xXY=mC+J4xAazaD5U#O;-dwS3D4TyW)p5MGbLhC>_*c>qgz6~cp5L};&i2_|BH-V^`~Pv0 z@qhh?wZICDGWoZ@YwEu!4}Xtq@j7I76`$3ai^DrRu%y`TgX|dfpfRi#Eu}kJQZ6^w z`)y;pn>g$`A#1OktkpsJzHRBicDLoU>OkmPklCmT_&^Bhp=x%w!o5!54JF zfP8FqJkQuJNW~OOWB^8wdK-iZG+fA;_B?~1J*L?TzWMY0{`cb+cr$2r^{{#*P@MJm zn&;bAi#!H#bu|+@;0vyqy?*eB@M!=p>Sc9CA^|uOz9n@3`xHg-qFs|-^((FvtxdZ_ zxNyQXg>!VL$JynPZsWNtcwp*g@cxAn4CcYl8M=J6|JEVFqS4v|^Yi9A<(<3KhBuU&(usnboQy@z8EQP3D>`Hw< zenaZ{Mf%V0sf}194F5gEWdGOxml4vZtm(kSAN~BIeFFS*jjVdOptPntmtkch%kW9; zC}JHVu9|iVXuwsYToDpWl0H*PetZs^|#IszO(kXy`tA66o1gs zlvxtXI2AMDIz^qRfR|r^D(s2ieY+_IXFPu&MpZ3|7?8#5^gG7ZqpkYI&N&y zbOt(iE>b3xOtN-UYXtZ`r@jqcY{rN?f*2j=s$RfJacK+j3pGj2U%K~Brw;KCq5%FG zM$FC^3*&!-9R4NG3;iw6tBh~gBN02e?P?a!*oI85A|=-NgZ6U;B`j%Ap`Pu$Y6Pu| z*D|zcRRZCHd$V%BWDd@Uo>+#I+a##FzFuE)W6RG9A+umm+D9|nOi|`#Vf%;Kya1Y zIKbyS)U*0=M&_{Yo^}Oe1$@|~!|MF%z{xgGZMJT0nfCoo z`ZRR-cVC}N03Vy^P^#v6CoV0qT1p=OP!~8c$pZhsL!ZvaUQDBZznDQvg^EGIl5ExA zVx&YoGbxB4pjChgbBmghI{$oHV!9bOL(^OQx7;*K)1^hXo+}Sxl|S>XnB;F(v*5Vx zg-y4}pBt<6mX^7t$7mEdO5EjHR4py$jLjVhA%dmo>3l*+IdVQTC2xc30~ zoFqFIdg)K68)`2TKzqvzGy}V*uRf5Pz2a=e%B?WeOi~UV5w)aKHm~t=ik`aY5VYpi zlYkW}mw3QsjWm4P%8_O~PN6S%7_P_PEWoR~N?Tr?Sz}9L7#);Wb7+marpW6(I|gML z-$vu30Qa=rdVbn&=zLf9j(Kyg>Vmz#G}~2KKHTt}{ol6?$;e$Jpe(Gyr0mz8c@qmC z?qOyu4*4K8aZ3X>f0_e7nwhk1vprRzkbo{i-`N(gY<+dS`9Uli>7VibJFNe?v_OsV ziHtbxzGI?!x_S|fV=P}|8zg)N*!iTp1fpBYG905-J*JbmTPpp8;$YA`GcTD;S9t zqrCP-GjqJZ?V6)be9~Q~=Vb4wE5+k;CVu&2xC>OLh#SmtERQ@gm*Je?Cpvrlt@j%I zW(=_8qbgH!H$NL-JbiTu6HMQGYB%C5U3|;(0XyTVpALop+wS1*N~Y8qYH?A1P23=pNIaJH?B70@hhwQa!}q%Pyl^cx%<+@jO~2U4 z|7-uIpYO&e$DM5<5SI@}TQS|QaFv}tzeXZd0L8fqpiylKZs^dz@-f!!KlGvh$8hff zR)S27b@*@5;&!PM&9H(cs_Dolo4d)PG1{()9W5B+iP!jvwRp6yAYU{{Y&L&woSl<( zp&m0>j;znD?cZaLe=m^#UEICz`?rCeihjnFa!Z48EAhE4e`^2KwW7U+y94J`3=5z5 z6`I>5WSOh}-Ua{sb9IBFb`;Hzzf`HrOn?W?%`;Qt`Cps7Ptmees@Nw4qK)QY*vVu( z4wo=gyX(z?YYwrebh8?nB&+liTJVtWlre|h(%yIdGrr$g@H*C>Y6laX<;Fs|$4M;}nLbT4b8|0U=*l)hnIY2=pd5_}`|Y|Fe(Y$CuHe^y!c#Fs zCQR{EGF3F1442=f2brfoV34LX3PzXI}Sq8I0DElI{E@6lZ34n3nNF zgg5;`bfUHUbpd}nZ+0_opT8D1uCIXUNar@~=8BuMo!(;W=p~zD=A*#BTf7GB%#8oz z%mCxRb9*1BrbJK2l!ndDYefv31heyPa?7r*E;Fiu4-#Bg?xacmZMwW07jrnT-u=Dt z>MY@|b5Vc3zW>s`i3)?!nlMxgu?bG+hCzW^G+SoKkH1%6*e3e6OCuay#xR(X9jUt6 zaC=L49@*goX1$$&{~R~vTWGQ6;aSa-@7r@aoWLbz0y}VJv}noT``z8UPxqpPfm&BV z;Q{mJ#aGmOJ2tF6epM>RbH~Ls6tAVd1-azg)2GFrf-EUnn$LvOOX%nOMq<9CH-q~< zxQxjry`|*LrcFP;9%*{h1Fh1ym{<{rl)%lLs+=#c)AqR2l2Q63-#iM<*+luLci*Oy zV3}Co%Bc$edR>Wi9+Zl)oAXzd%8rZ*J$r=nNJEG$a{O5YV5eurt zKZD9_#|q|TzdkKY-?1z{J^dDxF`B@z?EAxMtt^R+sgh__fv<9i7^s?bO|L zzE8kaJ?@NKB>sxOGyAJA?D)atepANUXpgaX`@I_`zP6Ck+ zF;aCyaPK$?ukv5iwDYKH=^$6{)|&LaJM?rLf8XOP>=yT=?$ml4FE@}g4lQVX^s8mD z&UM|I(Zc3V-l-*YLfeb#Aw{29kpEDw%Zi;wKKJ3zoAeXJ{5@`4C|+&nj$?NWnIj6c zvv_#v+h4!mxt@8Hyp_;-G3Nf(QWM%|@?C39s27K$5|b+HZ(yU>u}&SDC-*i;{QY|h_~3;Hydf-!}U#188_SePxZiHc$0;CSB zD&%1j0)hSc^{e{UX|ZApsN!=~%##2LjsNTS&zJM;P66IH!JaP6ZZ~bWVanZ?Ti;yV za+3h$W+rv&I5sHw%8pa77No+pQG2@3o9>z0Oq46`eVG)epak`Ec~dJMo!&GOuu17l zAX$#M*bMi7I~on@q*k-Tp6;1UsCf9Jv^XZ9SbwG}Hyk;;YS`i|V>>r5^kM6=9Asfx ztaFc!jaS95;d95i!&m&~2-zd??*?B^D0v3x$sYr>;HLPKJ-_!HBY5Fr4UW?iMC(6+ z77TOl=H#uD{(AhB^G}rGc`Q;!{~akh`@hXpgo1V{!N9FLNZI9E3@@)&u*z$FikYlb zhc;!Muat=w&EVDkZBV(iB7{-r7i#Rbfs%51>*5Rhzx4A}?MTwq-6-Vu^X2tPH@7Uc zr-y|3XrvbA80zbW@84xj^+P{6LbM|s@~j@e0sCp0YgHDlFgc~M2A_ZC4=YCZ>>v#X zd;Gjt@t(hv+pi^5*YTW|cPrQL^@=(S(7aWSk9by+Q)~Su8(DZoXlP>Hl|n!g`mi1t zBpDr>GS=%3B3bFmwM`LciPw`%r(SW~3oQ3uxu{cj-LRm)1&``B`UPy&vq(}2kd6D- z{gq^#=_XuQ+f}Mp)9`!Y^~G#IG0X9N3I?_~_48Yeu+7P7bBQSpOOGOWt)@JfJ5qrx zqdw*FEmc)t|DsdVw71l~3{x2>CuOp{Htk+WXkMt2+7=HmfW` z&$`U*rQ_f2XfpY@f2b)jaPjcn6YuV|fqNcZJ?Gv&3x@}dxN(BoC**IIMvSv(-oCuH z_vf`YWy4u#w?t`=`XmcJ@T9n`iAlrHTgUx3wJiG-A*7~)X}C6SoD!ncRT1}T}(2)68&K{tC?6q9eRCADbxaP=M$NamD#g^sozw85aX)eNg#zgNypzP0$UQapgL{Rqw zh|!E%*;-~=KArk8&{9%jKfTlCPWr7aT1VZSG7Q~i4>o-L64rZdz_GRZYLM-P9V&Wp z_2a%;Eo-MGTgFD32cwtmH9Rz6?qb>#`+vg~%l6p#lM?s$<4@&*Q@=l}Sg`W@^QvXX zzQ3qm_x}4!MgG(uqxCyi{&>~caO}tHrq=gA-Y9#g{(ReVXXVd#Z7+}ge1HDi`=5WQ zh|_+Jbs4St^`X!9_^*!x?tlIIqz;_+`}3^@tA2kOUUvNV*9YtV`u$ClKkd)>vz@E{ zd>?H%{^!Tr*1!Jz9P6ESDYkB4-bE63SR?*D@>Df30ZL1a<-aG2#3 z0ycc5K1m5qZ2z!hP5N_8?q*KR!NV0RS`JM8{~3S&mD8LckigLwjuNu=;+BWq-0cwc57@JtDcxxq|W(6fh;CAOOQmB92Ke&g}X4|%f@ zCe{4jhie(c?H4hp$&NZq@nVYl-zz}agCLz-Q`R5*64XUdSF%Q=&j%JjH^7+fEX3w~ z6rkaYP!w4721J3sHXR3InScwD1VJhOypRm}2$_j1H3%|eoRG+pL{w@`F7HQfkHs*` z?7koc!a0cbXIIvw#&+HJk8jMO$ z>+zV{A~7n9kY_%-9lmX{m7w?C`SFeg0ErW{A3vsr`?Q|<$DqK0t0nt9xy{Ka(6|Ewte7wyyoy}vc?o< zIn_ISK1z6|GHb|IMJDnkho?@v81E+HT@x)4Gk0IZ@jj!O0z^ymoe8fLQ~a2K7fD5A zj4ogj%xu9%0p5|%qZqEt8@u-HSeGG*8U+Zzz8|cG7C|Fg2@&GB_$T_0`kqkro=M`w z%o&RD+-6kXf8CD|Ijy}E&zI;`wUwN6+sMmOf;MJWCcOwsbQ2a2Y-=txV-%#~eZ*$k z)(?!h;35yE)U0Zd_iQuBCL`v<;P1z7XfK)lq#WCRRKIBb+?q=3%6)UPuNbW(aBdYPHL z10JwJ$W;I&kk;WB{qcpT$rnB7mO>nW7o9NU+lB?V0T)hynL;>CEemDL{Fn>43D-F* zp={fnDGJD50XqvY`Yn`ew8ayME(?I16{0D8$X`Xb!fKLzAPBd&%qQ z?uBs1dPoG7FF=02Ov&&oYTD+>b8 zRYo3)C_H=zu3v{7t(vjlA0wGT<)`xMzF>rDp_{O@WE|p-LGGu8C2TRg?#GD{IOMJZen1*4I0%>rnOT4JLCZBc0Nc)|X*67Tq^d|SkN9LcwZ?HF`N zZY-sI&KYZYtx--y;2H%nhi+VMxPBufp3`SE(;a}i+!0Jh*Mf<~7vlRvbPaef06z0= zzW0~NskYnE$n8fWHWp6wfMy!-u|cGV2wGqexIHrFW-_d+0-cv-7iJ?)Q5&so^=aP` zz(aTbUH#+3<@k2VVfUQGE{U#|bfIzO6h`GkDR4J;@ls3JP9@iFh!5mYa@N2)idbz0 z?5bI1D~BxkFk1*scZ=r$@UAMz9)*(DP=gw@^c65$0kQcT*>d=Bw}TZE@cv2()`05@ zx8dXM&hlgEQ9E2u%4>J+NLar+ao6sKyEAoE+AkIO(|3Rs0Weby-i#tZVyJN0I)-p3 zT@AWoULA&@Bqf{N3u))eAr|qnoaT)}sOt(Y0Qsr4{nu`b$z_>ZZDj({YY)UastLUl zQAM%s<%=_R95|G-?m)#SDL_?d-CH>rZ+AG^|62;{DS`}(N8 zD!>DP`8IIA9e{0?gNF=``vtywMPIZVB`K2pAUm3fMG;ZYY5+3<{ux3r0#-ofbx)PR z<8TmGP`EjDTC)Q}4dF%ZJ^75?anWozs9L6n$?Z3ZACf>Lif9l1IX`4brj> zl~k0?!myR@eX)nTOR&SqIc{ZQYYS z$V=Q)5xZ<$tBRJR0vWoged*PhG48@HgOnfjDFeFygt-^zzbPAx)!Ps4t3Uh~P;=+jJjrwS)?l z!$m>JV`fxk$~=+=^dLkhw!qdCYpJH{1yKlrdIMaFgQjdi?nVY+;J93SAPPn7lMfTx zBY0Ev!eS2bUj@91g3JYZdF}zP6j~b&?90JNPjA~2h1q4?$;4;G&GFde21LT;8;Vk* z65i-7ia}OupK7?L8-AoDPzEG7Zdqf!Jl`NrlpX1%SXW5OFHC8pFNfX7B-G}#0MkgW z9C8=rUTW19-7aA8g58vxw^u=|AG+>6n7+wYs&1gWuyl%>u9p(t8|3%O5dN86xMU4< z&k%MKZn7WS_&B@t;*qn5(qK!$0^XG!hlvqs#c3QgTiLi{x?SP=H>b2R}I)m9^B9TpBm!LKm zB`-7O3j*e0o5yp|A7A1|>ui&#);~e}bG4ghS)1Wh=Q2M5wqZqks>iY}k0uibQ@VTG}< zXY%(5ufQC|xAT7ra4nO8zhyR*Lb=UySCz;*pxab_vW$)Fa}(ouy{{O(`wgI@u420h z5w!X|Xe7vU)qwQuZPr3;!~)HG4jM9`ij7#E16}wP`s3gqUkQQDDcDu&g58)hCU>_H8Ma6bQU=R~vwWek`AXW;|_*)S3|M>Y9+}w73 z8iK>=W{MX~CPyRF_%Yqe#a0h9T;*jXFfi3MVCrw5zivZoCo0KxOdx7U5i*Ld; zWGG(ijx8d%v-X)0(VwsV%LYgv+xWvE1sA5xbAaps$c~@gA|SU2*W$u(mK9!e4j~qfz?PZF zF5CDNM?8e4I-}5xu?$$Zm$^1$y)Z4H0lV8^RV`)mHlW!SxsBGu-D^2?E1>q&732Cf zn8XntOgV@aCM&h!axy)cY|g>Ynu&aKL;Ms1Jx+=yu+RgzrKcjjxed+Iz@K-(Cp08u z4GCQ#goG?aM!Xjw zaabF-rL-iGi5wmphE(u+;drpg~If}U~fZKj;Fy-T+c-(`~ge{9ep1S?zB5*f{ zHXQW`2OfbzNM(au6H;lKt?nVM&RzHLHQ*lQs)K@M5K8vFN-$QgOnc#dZWEFrA?RuD z6>*8v*Nd!5uH1l0{#!AxRkeaC zGYMu&_$4*LP);yANN|utri#?p<~K}$1Zx4Q=4C5zr-HZIESdnBv#1 z!^#GT?+ppa8EJ$)@?^aD!LwfQ*|&|Slz90|62!-uhzKj!Ay7VSJGQaqC}^sLFA-Xp z>fTMiKqsv04y_< zsbfriaq^XoOk}Mx*~yKFKAZ-+9Ld%|2tv&_wxL@0rL!5qa$k z()jdS`?x|VgJi<|gozAcvN`6${oV^Ues0WR%}RsIiN0v6nF`h;#If^+?vKOO0T7!Y zp?|$&I{xn0J_2++!&FUL4uHQ`JQB@B?9jB0Q-OViYWhKfGkW*CeP+r-@k&Qz(F@9T zgjR$cC7)X`!n6+PwFp|LBz|bfdkI`t(JVP1reY=YG%iKH3X+4fIm8qJfkc2}n819F z;7ME=B>Iv4Vo8GSs>M5DOV!#q$8`y<5nLtobx)pt?;9p_-D(8?;2Ri-d`QgBo+R(L zX5zb_Al7dg+iz0SaAM=lnp>lz66lqmR7KJeMQs3K-^nWPl(YGnk{)T zT^XX&ZmRF2t3T$$3fN{7y3cP{`19aO$3+)q#`9l<>~>x8sH^a#42R%do7h$2IzkP^ zd7xIrTk~{h#Ul@7<#`;+MFX*0v*sQ=>ftSQ!J1a zUyyG9=C+yDaZq{vdFm z=~H$m>5?Q#$>NzUW{PFFbNV8@@#JS)70lou7U5(bK+W&tp9}>|k_6&h3uij!hW`Bs z=F*j}7~!ZblSVKrdUiR%G?-oP{V1uCg@+e0#DoD$`U!h5Rd9l7xOP~~%vJRL#k`z7 zMLc~V;Q^0mzIH72P;txoVJAg_u)#9fClzvT!<$?ptNN;&v74xbaE1Ou)op_pQSuKD z1jjd>l~unxqW8i~mrz_%T>??=Y-8opeP$G>RAcs6m^u>t*IJ{Y@X;xHp1{>3kJ4}I zPd6@+fqAACE^2G1yEyl_j9#18xIIDa_PL;*A1A;H9~7U9!ep1&0BsabPkNX zxD}88b@pUD&m@-5lF>Q8Zl6P*>7$DkdKE)b1ecw9U4Ng?tsCY^nvelmP#l=gc=nsC z(yMwaT9`G{HJqUH>zP~E@f^;PzkRenEKEA?+IYS6%dNjSC62-B)AW_YDp*!X zw)6Lig{zPEc%~g~oopo2H#;?wCmBiQE~b+1B|xCt?6Fy!^vSF#b8s3#ZuSak)kC~5 zmlvO{6O4^5d_+pz`a92W3v24S$NS2K0wx_KM_*CQ(fx?tF24F?2W%@kkAo-ZTWJSf)HNT+H#o&n81Z~ zh$0hEiD`+3aM2F-#HpngGejo%Lnt*^NM}X>EcdZE9gf_``AN+5vaD6p%ouNbjD-qQF) ze+~jLp0{~25$n7I;ya{Ur%OvdL-NW_lASq#7q-=aP4#*K3{g2*h#EoT1YVW2R3cE| zXlxO1BBMm2o@(RO29hd7x*jefgQx8LSRo*O>Mvz>Pw1-L8g=u!BYbo9nfhFu08gxb zVtR#1B63bRj@I1R`I#53&khqm5IQh1u6uk0?O|;M zvPd4T^SVl=jaOA0VPK~Eb0n=S^&p|C+pMdP=h`$|?v~9mk8dkrJU_GG;@8{9aZVzu zNyhoxs(h429t-`=b!$KESY~rby>&u3)w$RbNuuG``#6%k3?`ERgV@=UWwMuuafyhz zigVeHBRFJ^Bbrj%?0FY&0E^v3IDWwk^q2_{Du<8az{|jHp4_>llg!{=pVk!B#17QwO<>Edbbv8A&iU zMQ65{X~Ca6jZ~|(?`lECa2%?0f>*M_Yy@Yf2xrLWcqWhqW+_(>yW%(xc9l(ssLZ{b z>_R5(Q3TMTHqO~U;Z!IQCF(s1N#zy9%mQbiL=PsoVOI?;G(MOVe?b>PCQ zNB$Z;m+aPR9118`@m{YhANtk5-zaQ9&Txa&M*Rete@F?K%|TdnYeNNh;Z!wWOEQZ2 zn>IG8p4GvjT4>n|-45f)8(-@2%b6|=UZmwsF*RMrtWP=$tZb)EUhtvy#of{9c}3;4 zf?d|LOJ6u^XP&>C+nB8*60hPS)wkcPKuUSf0y<0N?5Ci_v%y$XA^er3xndup+F5EQ zohGGOEi**zhU{j#@4Wxu<>^9@3|$V~yh{J8b&&n=OmSn9NVk5h{djo1miNA+dip8- zv`R(ML{MBTk>J*C?83**_`}D!MGyH0=;A3Pp8TK^$4q=EnxwG{H*)Ir?ZWL|_;rvS z5$=aWr^_3Q;z5WJz$-vNU87aTR|_(?*J%xSegpaV+RFo-Ads-ouCfa$g)#fxvuTzg{YCY!G@J821O=zcs8f_C1-N)@C#ydvzyUV)a} z&Nb=AQQRf;d3mg9N$Lzy@P`p#lq)~K_|VCQn2r!i4j-}td0M7GJN4o-w(il1xmv-B z|AVym3~M6)!*{r~y&22SG(d zji@VP3r%Ta1XNViD7ePDsJP;;%0IvJ>YVfLT<0Ax;JW4_lW!)U&;2|%*4wkZ=Rz#~ z%*ry3o`r@fH6740D%F@>{tu3` z6bDw6nb7o(-_qTP8cL4XckX`WrtS46x%OA}*vcy=bsbihgjPS3sPH2ud(c#-r?M6M zJIb3QAJr!Bc6>T|shm^&8EN5GoU<0n9JEmMcB6S!(8&aP>0sT`Pdh)x;)L@ykmz7P z6;C~HRtHMhIvX?2&P%|o#h{;GZDgqI+Z1H5vf&f-&^@P0Frr zr`t8(92G%7X5yA*Mi~c`%_+EA2(@t(L=kSzt(tFBwvcc@)?vXPZn4Dhgf~`dG2UNg zL1s*kb7LP_KttOU+gDT5X5Fe_-;A!fwL0>0OpUAcI4AczZmJ6i(z~D;mGN?{%Z_phc0}h235x=1v5*>k=`4GPS*9yXJB|susy!7tEvfI6Tn69`PKtT0 zij9Yk{peRPv91Gtj%Kme<4uZX3D8ea#A&RQYNIsCju(G45ELg?pWai_bU+^2b){w| zxAcs-AzapRrKHidFRZ9CTTYNFN;D^A3ScXO$menMWazN*Wu@w{yb7`vduJ)FN@K|m zksapccGg&z-_>?|hUKyP?mj{Mg=}nYDrv{XQ`>tKBhHi}gVa$PZ_|3>%~gsIk6fhd zs%w#N7~DU>;gtNxQ)H@eraL8vmtUUiMyiDhbAzJZ>|S`!`by}XcWu4nO?BeN!ko{J zKJPG=7S3XW!`r=VoD~^dmXb@6qrWj?XSqj0)?%E(zf{eGX#5ImjiFDO*gb}M?>@9c z3;!*e?EHO4&DgZLHYck^6l)PgaJB5~>7`u~-Jr4FE%%m*y>pbLFN#vhXaDu4CzB{l zNGZS4;FkFkd*(th)9!DX6XYaCzQ#gc)FKi`u^wDs3W}II&edFP;kW?O5_leze8GW6 zv-t3W=yTV!yghwyDqVLy#>cNJnAagYXN9}hq_wS-)q~yR?|146bs1Wm<`XtSQ#xsW3`A$I_pYVKP2H*y$Bk#y&JD&6IY@EM>uV$)Uc;xpQ8FzG*KwIitt! zDj3TpBwi($C%LppgWrekf>hX>BzS)w#Bf%yJ5;f6smuEgn^NR5aYKh#o|x-2C@8km zVWHREcv@H~Cdsr`h3Y*g$HOKcW?ff&Fsh3Q$BD!Z#8Iju_C^kH((^yS(jviiXRhD0SXjZzD)gZpX zOR;&YqW=+ok^O)@&f+D6T+rRxdAi+t+}B{T_%etqXDDoRjQqt_-qq04|DentoowTI zVNujjw+EB_2MWyNd^YbthbM0@ThvBCTI0;t6J{2@(a;@;dRryQwi zIn)c3#NC5~vB%IgHkgq)_DAj0NYA06Ga{I6r~!l~>gUpJbaySqIExo$!GmsI5EMEq zOgj$c_&BKxyJGdF=8~iT%z&s@AX_d@tiX$GpnUw?>$an)ab;h_J_glhMwbI|!Cv>{ zwx{2ive@|DetxzM-qXVZfrTj5c*evkw`~Vf|u?cu@sl8fer-GI>Fh`tVJ4u&~+0JvKUFNA(?3@q8!wnc5riHq^iyAS6M8zt7S`7CzNiWa-QDp= z9GL3etesItnwkadnj$(H)L{AB7RsZ{huX5F<-9B9Xwh(x{CVDSNnKx7uKZlCA<>Xv zoHTjAJJo%2)rm1fFj=0iyOiWip5vj&(j}^V$x#MqnSbd3VPxG|?Psa8NVSx@sP=wc zVK-cROf@3o)h-#7d4WQg%A?7Oe9~3tu`8aCxL~nZW}&X;)z;do@%l!ayH1qE@jbF& z#6b((ljxQ_g*gYFxResVCStn{S|sAJ(kNJ^UtMPK-MXuaYz-{a6G@z*i9CFLB-^nd0aoD{$DiCeEaQ+4MU zfEbZQNCHgg>bY`-x;eA9WRM22`8yM9JOSj`=tnm!DUv<620`YdCPt%Y14a4YLDD?! z?UM1r$9*$xNIpaUy(7$i@ib77GzP7+Qry*1720obtY9juHDsRyLe@;oTA0K z*RjwIVu(T_k1~HMF#ARNk~m@qh!GmrBt=-}gI z{)^E)YrmQQdg1Uyh5zeMH&X6`8um7uhe6=F@`fT^i?$P;Y5e_{1|e5HyJ7swT`l{f z(DCS2{7iTeKexEdv&6I|0umXX7x$a`TIFw|c%8DHI9b=^b=PD0<=h58@H2N|#6@O% zX=n=_5;^0&%VFbWc#gORva%`bC_V+Mo6H}mx3>@=rp@5t&ta__aP9g9UO_r+=1s){ zxP~K^OX@I{3)MN8ADQxRtAft|CA(F&IIaEZz$JY{(|Eo2Kg%kpvvB$Y%6GM6vGNS9 zV(t(>;qVJ#)w23UvU}4n7diatuV{`pGgAF`npx&B3ML&ftIXA|+0QmguB_Uy)Azx@ zt+&S~l1vWd-fEKUxG_E2a>ak0=br5OA$I@IoRffeAOAOFbIGz94^FCH?ycP#u-(5c z=I6NY#$*0ZPc7S6vu$UiL*i%&HGK>I-=01Dg8rE}2;L5S`&rbJyWmmo*&wTy-JW;; z-WK`khaBJR_U7Bs{9mv4{nDTO_2%-gx3_=2d-zK~@$=)pllOo7^`>l_@&5lF7vYT} zg#>c`d(|ILnZHaUt9M^v&J6p#?=sVjJKOCF^Z5FSUt|gdlTAD&quiDPnx$`se$+8i zMk2JSIG>!NOU$yOXMK44)nicYzI&nBntwbWUrc}4 z;J^9n%HBV-UiY0@^KD9E$;?lmKfL?qExx+`0%=OdIR7QLEvED1-1p-?BOT?YOZSB3 z`u^2(AaM9_$9F%y_SmWadwVC#0L?Cki~c`Avnwe7Z)kRi^8bWpXFOoU{r`Ywzr20g zefiw;o7n%L*+%t?R)qnY?P)wed|T=4E#EY&;Z=8KYFBs9l?$)$sv=5$r>?vBrvJpu zs-<_DF1>rGPVGJtfA!A~Pa3n|8K7B1aik`n?lAjW7WBRsVW|8NPyi`s9d${$e_swZP{~O-?*;u_yJn=V( zcIj~FXTlxm2Wo*Pa_fL2md}#6-FBGx9#a*yjiP)Zx8B(CqR3u8XzH*fr!l4wI?*V~ zvx37r@NJaxD%r>FtEywan^!nTl~A<9yQU?YA3-DPBqL!ZjK1NL0p_t0lrFnp7@joG z4cn8v^wg`0&`d}6zNO(Ku9hkGS8VsE9&^)Lub{A9!+eBuWaR9K~b=Cvdda;P+ zP0>OmuR~b)Q8(Uyp5d+<_ByI-jSdj20_L<(I2!7Qt7bw`1l6|#%fCMU?DYB@KJPIc z5lS`KVNSc1H;XzqM9C1;Xf-4s0gBT`+&#c0Si=?31UYIz@qWKRc>%7kOJD@%jDnaP zUme~_e+t5p%QxEV53~PFDC%uC@lew21*#%*qd_<1I$_^XD=S2MHKNvcKomg<)N7Fz zSO=mwAwNVin&+4*p9K$Lt@md+mr84UZgCAzUVPF_HNv2pE`o zj=|xX(1_C;<0Fi0Z;rOonK8YYG*9U$(SwuROgjVL<7$jT7!}``8|gI>&#VJ&B3=}g z{LC?e%UD<2H-D2BTUb^&#ZXl-PZ7HJd(mpDqeF9-k?ovWe3r1rOQgR`AJ}Si@hI~r zOW4-=qs|U(roC5RWnKlop4%cib9S?Sj=kPjUoa(3F!NVma^TTTk8G0@XcUWw*XA9H ztZnUm49L)flw{Zkkj7Msl!{|!v8w)iZ!f`9T~)wHXpIDO5%bvhBDJ@ZY-Yf^DKi9zIiCjGfyBPcsjD?UpH{T9m=65M5 zBEcdcH43ImP`_FTBS}T#5Kjnc@(-)=KM(aOZh^Qm*7CV1*U^x&v1Z3Wo?OV7XDFvH zzYRCK6Sf`G1m-nkWKWfnNC~6xq|Kxn)oGPjt&%K*X&j)I1efDRhQ{4ThSyu+n7(%_Lhxd&ADE zB4)12@}V%sC+`z(Q=?lNl7adVq_pKcM>x5$oytcGmV&B;JzewY3)#4LWdxOGsJNI^ z#h8k|gW=>`Uh72A4E;;XVs^Amq!bFo#we39oMkVit&^&dOS;EZb!KFXAaFv!oo}wyBa(PFH;}@7=cpKMyjw2I*-(_A+VWF%GpUJRnj*nrg?W_s@AvXe-gBW=MKq$e`0YX{oq)2r z(>_U2nXL+$HeMK1pLxytA|TsQaOONMyhiA3)y;*8T?QwTBFrvJp%K)CF;<}|$Z=(K z(C?pU5mTLQZ}Z3=79!SaRjTznru3y+&>Njc*S z>~~AB6Gb>{B?C2ntAz;lVGQDX6?9!qBF$DJ9E}AjPy&2LK9#H#JOA-c6ba2PV?k)M zZC~!KKqVVmry4eU&Wi@}Pdg00CF@?X#>kq@NN+27G(A>hVa2D$CgodmJC=pi`!H4+ zW;4$vB)^?ujlQ0#c5c5zW_g~>Y{KK}!nN{7XB9PjjGIK9QqmBo6mPXxHxsHfPJ&M* zqC+h-lWon;N2$aO72yzlBDon}SGL2@17=MHEkSuN0P&*X>!~oxpQMdTj&KB*8%f0a z7lo_zGRwdZVe~BUmyHyqzo8(+94%P6!nwpwr19#whXKK`6$=FW!+e~n))0l1Y$IDK zW1XiC{!1JMj@&B+qG3y_e*JX`J3lbB*)~ms679DY5Hj-3iQMyGOtsTi8E7^@K?1DB z%#}cANRmepc?hDOcw4<`b{ z9e=P&C*WZt%>QjKw!WeTay{olG{{v~1nQt*O&DSJC^LxS$$35+H^gUXFB=NdXwMB) zWh(J6E|~-TjAJag=x^h5P~wQ#h08Ax6K!$?264R`>dleT4aS)^tpVX6jBv>Yual{0 zq3a+cPz#%?==U*b*n;*^%ruyL?z7=R5$Udmc2mcoDUnBgVZrJpuf;@5HDV_w-V?C~ zRb&Wdd=N43qpV&v#2Tgl^$#*x1IMpIf;FI<&0N2Ud6N&S04q(znx};}^?SZ3N9Y>H zJwxosoc5Q-Fk@skX@Q#7!hgV%3!w4O9#y|%ec*F(nYHY zwbbV#($7H9r)JHKmQW2iBirz6Oo0Y$vZToik@yp{X0?JlTE=oQ3snOh#=6hnUatX} z$%f-H)P>8?iCNdx&{PzjCt~GsVTq8*QG#A})O{2i09LgEV}$2sBvI*lg(7t!yJcRWBw^ zK?yMvTo5KKxGqf!)`o|S#fmUi77A75Lu3u;<8Qn<%ABquOw%I%T5waugs>?GFT%@A zGup&V&Ky>p93Bv}dfCv?RncnmC3z?mqLETNp!-rfQOs%rp!6HkX-KiKnLG91p_IV^ z#7Hf|mQw$c5^P0?jhLCHV;s59K$Wau06GIf7k^_U#=5v^6C|RYQ~WQxlEcAG5ZcXsmgAC-@?)EzNuvX zNg)ofnNj-19PK(50k-|(ztJhqvN!}b4^|F?J$8bogkafwdpb1s*N&*}aL}e?H zyEVk?BG^t!kJkljD(QFvLzFnfB~_aG5})Q46ixdT?3hF1=PASYbxQs4)fIR zqUylYM1!cWoT-6=bWq4BAhWC6kjZ8maIPTo(*eU-1zeMkUo$1`G2z`E0AI7FT<8Pk zW3W&MI2worT5Nk_Ic-oJM)Wnf(4>Y2w?nq*ECa<(R0AW_Pl!V012oC!-B*XqbGXg13k?B~sYtppAB;Pwj zp>F+wo$%TG9`oBXYEvYt&}nvKuLk&P$coaZ(&JabdTw3U(57Nky|Th~A11G~r6y_aAdf+ETJzU*#K zdoH|Uz|(F9zpZrO-`C*Y9AA5JB&GVEOFla@{PgMi0mk_U@Kj&v)Q6p=(}s56vAM2f zuI^Z(A+8Xk1fS-w4Q}}f?2qs1J1WxU_wB$*g-GfZKdt>lpdh>t{I^|_c z7x4fxc*P9{1Z;zM+TkaD$DatLhYMOB_>A5pop+y(5+mcLG&VI7(Z|hbom+&c0 zn#9*xG2clUn~VA{*;U?G5#1I&EZEJ^i2(eK55aicX!N(`Me!?oLZpN(17~3=q2_)hBgwnU^uxg&{OQ_@2h%6pjUq8h z!~gf;bkWOVjFpES-v1L3q5P-5tdkmW#}qm)Vog0brT5O$e>bn{6@dZ2*BisLp6q|u zdnfMlC=+A{ZV|k<+us|f^FQ4d8K+L@D)0X>`*rfVCn0NJFU`CL>u7%g*6{=;YdM6J zA^Z8XYB9BzPc&7%Il-qTsi0{X_0)uzTE`}vs;M>Lf96YrT=bNZ=%J>q(jjhtBT0ak zp+nAK)LN7_Qw0Ty$#r7dO7NvdZ7_U(F1*p_j=`!+grh2&N<*NXeN#J1ohE`^P(rtE zcGYLdlDjHE2To$lHjwxtOEA_FSC8&}f-+dD!|O)D_#`r2Lw_Y=^>Tr!mI3P+;vmq( zUCmO_`}rGu*g?>c;Zv5m)DOB0SltHyGzM|Fd;b3ZWBBR_9l^G^-4nND}A&CG%f`)U4gY&R8T1c>TW?qSN?J8#hUf26vV@K{0Vc{Uuhh?FJEH zR>_~LQVSE?uFBRHLoX4(xSqmhhmoo4j&lebMd`Lgj)2esep-7FNsI|YLH<3>f(!7} zx~13Ms|jSD?xI-fxOn`&9V>Zlwi=1ppHoGPObWo}HrYpxX)tW<0-3KUxJ~r?qHWTz zZ=POW@383C)_=c#cz*lnvWee+{rovW=A#hVMU5iNo|Fntr~Ucm@xIBUrgKD}n#<=* zVjojcr&&e8F`_U>+Jc7BFsA_4_Eb}&;ZaA+02i@~xluH9in92nD9k*>MUlGKNx)Ct ziJo9rQ5L>b0_MWKTv^3DR*I~^a)l6A*vINM+XMS@Ta|)P?#ul-jX{Mnn}Q3)g{0rF zMB~Jogh^P^jn&}bQbU;I@S@qBD-VDZR+B({BNPs$=Q+NdIK<~^arc`mI^xRKR|wzl zODBn5+C9Y|IIYvXe$((hH<$K%~4z@D__?cZp{l0Ir;|N8LFV)ECG$*Ou1tMWu8DV>dS z)>ZIOs~q_PIVav)C9j0SzyDQ4%CowB;QDMuv-i!7oc9NvS4cH|gbH4aG0j@Eg0mqn zQ`3-HFFqsB`aOkPk(n2Z3)Jf*XU(M6lC=+?EG@zF6OUy^m(Vt9ckDNOg$!FTuJB`B z88i4T4iK=8y@yjOgHD*8s?tW;q&q1bWixgroHQd#V~qrx&Q1S${rAhSZ*2MdCVBeS zpC+LZy0`$h<@!K5{BfSXkLQX<8Z4xokQ8JZLAt z=l#lEn#reP+pX61$t*95iT=sBRASPQkfWQRX2gbDWTlXdYjl)*+Q&u3SvNDRZAA`7ml=&He04p9mLhC&`vXFLCE z5W_YKu^Q7r#rz@@RELR^tAQe^;LAk~SYw!9_+oJIq%hocOl5n32mE`Ruh8d2SeXqP zrk>oQoQmea4^2DBlXMsr015Z!ZG5}m_)IO9&0h;amm@UU^s<` zkb`%Fr8Ni=Tv=ek1+3*`q@|bJmVRx!Jag$kefw^XrLm@^$Y=F5v-Wpr97X4;qS6+! zS4X4=AEFCZa7|Sc9l-U_3^-2HVsZv;mGi1_r>7Y8d1=)4Mz0TpuDYDP|I zHPX4@E^`@rwQih78$gSu*h>*zEqT*z{La-#Eh9&O5X>u01OLn{A?1eKJYk~~Ztkl5 z)UAkZpGZd5=FjY1YE*fYxK0Oa@<#@McA| z#i=U3zI;6YmDIrda$zdF({q&_nfzJy8(BKx2{bRb6^xIlQTi-MaEgPxUcK+^Q2vU$ zZ_6((BV|{%U-O0!865H89GH#CtUKl{uxD%Nv-z)02Q?&jO*1{NQf65S$S$fQlwfwD zXQU%BoL^|gSISrvF2N%db#i1i?17s;2Y^KiP=F|3xiT1hpftjPQ zd98}T$JTGb=@BdmvnE)AO{uK{Mk}I71&1Svzns9OEI>$?8^AXm#5ts!J303}xnelb zwha)zv}?})hQ2q6^|*Or`NOsKcdVCZ14NbS&4_M=P8<5==RZX=8j7BO)1tL5Y(O2_ z9n9m!ZTfVjtH`7O*+kkVRm-`}+Z*D)nQU|{pMRy`ZmaXOmBsUiURpjh+LC7X#;k3@ zLc5!B8PUpo(-HLfIb)3W^1oOs1&UZJjWXu2Ve^cGgMXW2CsI9A78o6zwsq!a+B}iW zdL(XGSaiqvH&oXDlyrTbF}7xL>uHBWVq|sn<*ggdZT<;ZH0|S0y5;7B$UlG4roX+{ z{O95Lqf<^;yb9Kb-Cw)&^Wt_DIYf`|O;JXjyKNbuncKowiR=2?ug$j(yt>U~SJu1E zncX?N?mW-z%q^Y&?DIaOGmoCqmri@V`AgyLE2OvYH+9^;j0B0kcP0JO*LGuho!gmr zH=FEqbq&IuKXF)a*RgCY&Y$v5;LHK)V+Gk*x4d@tM8^t`b#pUDHy zzhwUX@X3}|X2z5ICFkzK1T83EH9g?tD-@<_LC&{0VxaEIqt~y-Z>|rXzlc1s)#9e7 z{^6?6m4+FbnPy27ZY$c$7J1nzpm^t?eh0ZyWzzGmR4){9)K>3Qf&t zW7qnPI9DMjHgJ6(@?YioL0uuU1F!urn5~s96Oxuxwmiw5ZZ7uLDXu*co_T+-$!qxL z+x-^$;pQKD--#|8O<+N*kl;6y!@hIXa;qt+-A}pX6o7caAN+2@l%v)eq0NoNbg{hK zclV<5z+Y=Z6}v;1d~W!+<7Q?4wYZAbSp#kHW=E4-jU2$4?BRXw*`#IR%~}8qPs^@4 z>}l2X|B$J6`E7!MBQxtG0!P{w540~CXxK$;(Qt-ab<56V6{)HZ|Sb@x|mqAj_oxa z#TR2Ipw2z^{JrTCQnp6^A-j!#s4coQHu_q}?#RxH`VMOs|EV1L3T>gi)^mI7ZD~#9 z${yD#B~g1uI**La5X<~NhBb3)!Pg7SvY{CZ<{16i-+8E}v*t%&W-#R-F3A)w4%6q_KF!)aA>fXj29r+)2oJY6ur}k6t5z_E1|2T( zveF7{0dCykL^buNUUhUG@XcMw-p(XJxu>!(|-fF0|xEynCz;@Xt^%8=?PBQZ%&kZ z=c+9XpO>|!J>wM7f2#JM*zEU)#MDv9_9li7D(jACY}pP3$G#o`va1Bv=V zQm&6z3)t8SF*u}bK#o2Iyp*Jk`a*)v!tKNgHg`!-z^J|;!JPA^}@y&@47WjB)26u?PJ zTB9MY;>s*lAim?lS}zOqyen5F&(YG~o+qtV%GYrV9&RRO^G=m4*=eH!Q-x$#fR&|V z$(fj`PA=jh>%?TKhV+gj&&nljV9V($EOA`EUQO~8gLy*o%5nM1K`i|pwCy^Rg@IWK zMKh8+8l93n&?5dIu){El7@HAG<^ue{ngBa}-8FaO#{L6i*!^%IV6>@qF_r=vXhXwS&LA_kL+qeRBX{qE+L!uEVWV&Yvw_`-nG0! zf`pY4Ta+@Z$SA64*&s+)%ArOggux!MWJwuBiUp)t7E3Ej7m-&guvd}=Y;H}D)O!cP z-`1WuLmH9|RG z2e=ZjTp`yhA#SZc9$R(|K14%0h z)^m0)NG*~!l1`n$e9*?$w8`Ww)swV1parDQG$KUe&!7B zKd%QF&UziuNZtL8n-a%P?1$~ zaiv|o7?TJ|V|ySeuMnn?(g7y4#~e81JMl)g9m{f5wr=-vs#3mEBhQP(O*Eu_;fmEf z;K?UP&nCNautaRd62LUGU@U|fdi5VNg z5D(W3^-?M^>L8TEE4*IEI5~XmWn{BW9ai=+W^w)fWs}nFh~NW3X0MY=a=q9T@;n|` zT05UdDYQ`LZ%9TMJlhN{B8g!zLrKXI79wI| z21?FW%Y*+U#j6fTDlw*rl$}e;(dKJ!d2fAytm7M5se+7a!3J$1p(E%ispzy7NI@+; z8s)wcY^F}WUPbbdfO(aqJ!eRwW@sDHjw~cf*;p2blmw-06c&=y2baf^HwejTVr;e0 zomd2O*lrtzvS_+IOPwTovnpOnUNC7I8C$sh80IS}nlOM4XYh~5b2^sJzWr`*gz)yd zkGF(%KxSGCag`P}oaVV(-mp;E7Q8Z7L%#>ZY=0jot;j+FaX2`=7IMIPEcAe7c;4kf zb{$#=q3m9=-~4KOJ1xTFFXpLZI;-&mNk*Jx$gZ(4OJbJhcHTrNvr+e$YM}DnkjWs% zJB!f{`n{m=9oxK@ZTGdx#s2Oagt50E=(Q$I_h2R?v zmzS(+(itGJ^3clTv;89*-aPB_xv=iNDR?;N`d?l~PiUWH*Yz(gHWZIFyuz&}tmD^cA+4C0JGytC zMQPgQ+IIm0{CaA{E>nq_DZzWnLe`^3$JLLnTv}5*faZ{< z_^~N_O!(vBdT*`cpLXL=*B{fqC;ylr)&D%7zU`*+(v#mp&KPak5V=ena_pajn{!Ga z+TiKj$vB&N@01%xU|;?R^@|SKbqK*p%C8GQ=KeQ$?P09Hc`gR?0GYyXyPF1yF-Qfz zIpGxa4;J^}NUqB_cbtSyz(B!rkJE5tMd)^>9f7}sQ|%Zj7bI$h27M>d*4XL2WPCKG zP3dIitC2c8#g+x~1&S9bVcW}$*F;LW&aRP%;AtP9dXMH#iULrKyhF~S3&MD ziAWMw{zb4(ATbXxH)bS@FdVb7&-EQh=7vSEsI{{Np{|lPc zX=G$miyw^T)Ct>=ybh)DpXBW`PV#iz++*DBNxcV{Ni8Y2cba%efAA7oiw|+82HU=g z8j0Lx;yYWPJapkU(=M3P(zsYA$4n1Yc+uy+kiQ@C4MyMGpJggHoj%*kRMoy>JKoXy z_Hlhr7s=LaW?QUn^(;<%+7|w=H|#YubF+1;vqbI#1g`h;n zN74g-@Eud3Da5&M#}{*}fIy9LSDW7Awz2|Va-Fw0Wb$Wt+qRkI@1W3twS?4g*^DU= zOQ{|cMg_*R{H(M1RWWcuc@KXw&b`gQQ_&C>alM(1kn;rnrGCey>NzPmEtpqTXr0G9 z<~k$_gNRbl$~4gTz-J(K?$WTpNNIdfv-HcI{}rL;GnRY>z~dg!qU443Um`*E4Xup0 zs%(BZVr-@b5nabsdf$73-Lt(}ZIkjd4#-;!x;%jzcN*mTF@w{@%2sM%)Z^Bmes%=I z%uehYal#d7XYs)tZY$G9P#pG~uoG(~iE8{h4Uyyvbrg6++q}?tXaFD#p%NrA-{&PJ z8_z0dnVESivD)f99a?R6C^7kKXZKblfTeq4`N+ z7Bdu0BQQkYH47%UX`A7uXz&oW4ZR46KB04DK~15fAk8*Lnus8yap^>+_`N2AHd)hL z49#koRooC|s6}&$Jn-(U(dq-AB76tX=745~i00od&1W7E&d6tlL{dPDU%zKH%g4ym z4J-~3pryer0@Ju$Mf#1P*N3Y*k;YAq}ZZS5{QP zPIws0LRl&q>9Xo=jPg@)VHOYP^zvsj@_b5{sb6ybbqw=9Qbli|sz@x=Exw70n8MCC zZ)t2N7y{?`< zABe(3tSRLaCZ$9&LsSriaSu8~a=}fsXof7Z%x2c?xnwDzqbGaPd@t(wp7C8FDcg7Z5? z@8j)SYvlpF(fpj`2(#C0O>LGMH`B04W%sJ5Ok!JqDT^T)S4R7Bw20AwiV%#(xY;W6 zpW9Li(+6(_^)xfO2Rr|WG&42|@@-Ru;lAt2<_5V;V4T+m z3bPl2JZmGYTa$|>8TN4L1eEngqGLH>JC>HZyYTr%L817Ll?-q;@-!*+kFuT1<~Um$ zj-SxT{j4Z6vBAuTSq!Aa*kNLudc$0-CgqWXfn=mgqk|e2hLV4T+jot(dz)zK>-5X5 zj;m0rna>W7k7D>*rDx!Ydl>(sv-R=V7&jBFTg)D|j4Odi^~M+Mq=0tl&@H39@a{@N zfSDeIyHC~jrX@S4&8ULPC0AL}j0jf6=1ISQIsN?Suj7aNmAB4b%%r>2x6&YmT)9Ma3qnE}_}5rB;mG3$w5iiV}FqOvNT&0t})Y>NtU zWjhMY>`8$=FXVo1b-qT9anEbQRRlq+bIgG^uP>BsOR~2m=&V{P7~o*T zkPEO`^nudAIhIdkeFR8(D6^7=a-S()4dGNY*IQkOzofS^+=aH%7r$6n;UVJk~ zpA}q}vLoxzF@}EJ-KWNA;3Gx3}eDK^J$G$qRWt>=*Bk!=k3E;Ck&GfOWL zjCsxA#0EjpzeXgX6cv=;GsuWkR(&cIF1U}mwnrxPxy5YD(_pLksUTx#^U*&v*dnYN zenQEICi2fSc$!x02ZM6|3N{pYsG2^xQR7k%5i=@q>jP3GSnl(o@^JOED#~qAi4keE4G zWLT4g(YNn#nGeKO6#$8B_4Cv)-vdf=Sa5Q)A}U|z7Q^V-$!7qPb^^Vc+#FbwZ~7Au zMDsu-AW6c4lAG6je+> z)SSmBR~MMS!m5=eEW-pRM^jdTA$-(7G+*{%&->bZ*83~&Hpj0B14ZN zW8qs~0Us~b@Qw&0eRD8aU?p7TnQ%Uw=y*)C$+$t8#+^#E^eS7+-{d zP&C68Oof1VLl}RO>b)_p=NkZ5vgk+H<-ki0rBpKoz!dWUI3`wrfDhXlb;vMp~2)TTZcf7sd zAMba+^ZotPALrI?XWKbD=e!=z$K(F!RtUItd=3m0w+D{^o&QfSA-v_;gkQT*_8{NP6b7KO`I9d4PbkYN+t@9h6?JMn=T0{|{cokU!zNq|p$ zIG{ve4NQCzQIpOA(FUtbE4@0J;%|>{3a3Z!4))Xn@wB*3Afz~kCDKZZ=f;NY4<>BE zDC+mV9f(I#HK@Zdm?ny$@^G&vqORs3+oK`LZ^`0r(`43udAAAvxW})hLp~tA;}u&n zo}lQKZkMAIjqnEET)DRmxp=RG2$hSvIzr*eN|-Fth73Ils1Y!6fSQNUQQS7IV~Xt~ z_~+tDHM*izM2+1e+*#|=qnjkt$yHUHp9sP2g!52QcDOt(y!<5d@9r*U&?q8u3HQvz zg5x{nwL?dEq_akVz9~F<5U)A81i11fF&3UI*M$^>k!r#P@g3v2;c^llut^sX0sChI z<~<-$1?-{G&DsM77DK`BpM;Xa!HpMaav^!M+s*=HoR}(^YQ=$)FV7Y`NcBXi%o z^j*?>lV}4NUJRXljnYbrJhB1lx~0_WBB`?LU*)`}n36gb>cI=2pu%m9kZlC&;n_|B z24urwHYm<9hIKYQpyVxOp$IE0OvciAL?En>2(`G~^Bq8U=#XW;x6M)SB2V>!eyccAg^&~IFYQU<}Yt|Ljaz!-A04h3=>(P zJ*?Vx+pI9YTtLpI|NW`5EOB3s0w4=JiwnZ|exp^dkOet>n|5+rW;goKLXQ=1n5-siT7-}l$kF5w$-J_r%O4gyr z>_EXxi0o-v{l5LuZEbL>wy$Md$xkm^8I6XRCiHt#_&)2Fw{J3={YTn!RJhv!M0Yzb zm9OwjL$9vz`Yrzxs}Fd>L*ceadVEh*OZDF(HTfYD`_GWE1=Q?8&8m2)8?Da+O6DL8 zB$BWmeH14<ng{=V+CJ z*U4x^VHOU{NEUarP8zXnFKSnNFhd?S^C5m=1M<`#2bxx}g3xE+E}Z*do`%?ysYsHf zkOS->fM)GwBj{t<%#=-c7wYlbsmUaC_bFv2bp*9Dmr|R>VZnG#H6C0G5f|6~Qia^j zvdJDetEU< z#?1QU#zs{lRfeB(EBUvTwP`y>{xf#Q5P?+3|M?y7Y%Y0|z=Cgf2KfVwj}hdNlYh@I z`R$&S<=DMvD3TLIUgRr^2r7;DjxBtAH$6UbP~y!=9_^aR`y}&hKWy>ds4U;Lj<(@O z)N10{83S0M(QzdLEn2$9GiuEUhVsh!x_$2(-ICC#jRPyz40Un5`$q%d`uea>mD&v+XVcpr0umDv-3!MEM4b4b}@Jn zS2F40)kO{i_t_e}rvJB?k*>-hHv8v{`p-BWeQ7g{|M!x<-^$aDppo@&ZGae7)6E&( zD4Ke9Ma?r#s(*cVzt;kP`fwB-LxnHAY4tg?hA24$_>z&bSxslQRi0VZO_TgVk}ca> zVU`7Fykj@v``+B38GC5*8#8@t{(CxlhIKpQxx6c(yX)lH+`pr9UPI;6TyK1cA`J(0 zE>)kC%tC3M=a>JC`n7Si9jP$>(O=8fA4s-Yq6lu_d%qF?Qs}wH%dC z%fg9)$`=(=M{h??k!yk|LH^&9dPXPC9;K$~XGtI~qMN80DUDn&pJzP2;wUNd-1ikH zzDK!|X8k?OAu)RKixup)=vdrw^$w<{IxkjZ7uJlMyw+**GJ*j( zZhg{~-{yp`pC!wGK0GNrE^nD%OUjn@Ngk!tZj>FAT(cZ!HlaX2%F06Q>Wc*Nh{vXO z8yaaSI)+}3(CblJrfJhGEme=tyn@pB8u}IV#?zC}uK~vfCS|_8Q0GR~{_*F`y!DLC z`w^W8)U+HNq0npbvfTh9524mu5>Q}soS)>ZY9Ka;zNtTPWQPI;7(~R@j6DCiWa*2+ zJt}-(W`1ot;ytODv33-osltCL?gDPAmSncWu>xD_SqE+Y&rYH@R+o8fyq(ns;zA)95YeyxnEAkEgjkkW(f;Zc`X@2>FYF+O**8 zns1~|&=)f~U}3y++@=N+W+1)q;Im;l@wZrX`H60TwC!?7g>0FZyq7a}s^CxPTM`L>u*m4<91)jN%+I<8Z zkWmv^6}`Lw;CPy5SMtXFh1<&gSe^=2(?MY$eU>dqS846z$xl=!8~lcCd9$6T_oWQ& z&O3nZ0KiLC=vhXfT5H$T_-n^SL)p)p+cw>?|2;cn!>?1m=C2Ld)ABPRbK{-Eq@M7L zqn`7s?oov{uOAROu0XLakb;Wt4AkBZV68JoVsk>r3bI(GB>q*>LHK% zFo!H$ghReq`=kHi9?fAMosd&B;Hhu-?1qHVIIkznVHokl6t+#5xY?j*r`E;-5fFN> z2rY#RdYHp}JHe(SMGqJJOZ~W>S&aK+0Anh{{3^qED8lRky)nr12Yy;Ks*uZ0a_o`juE(jc1P8B6!wHj46nJ|@L*IY&vu$f zLx}$bRJJ~w;K1yk>)u`Y`B%ul_eWRG4$3Yo4&RnvvLh6!)=TsjLNWbF)`c^M1+TcBKiZ z{e{8!&Q~oAFy!`fZ}D~kkUk*Q{CMM4#94RW4^bOR4%SlCo2&bAb!{V!=W%lP?v8=e z(7kJug65nemHq=aE8BHWN^fHw%$8dlDq^KEb-ToQ(d{&^T5~(Y|BAAM6+B=Lr;*Fm z4LT%L6H&c6Ht~l2yzJf^jw@HFtH(?Cz0%JVjrOPSPE1nVpw39zC*C^e_&=FEI$uF1 zdn^s^C|h_|?_CwIuk0vGyQjyiQeydJ9>D-uQf1d!jc%V;Va8ceqFZ6Gq;A*$8B_JS zd!rj^CbC29Fj~S(YLagEXZgEr=dH=2IIk^yf>8N6XfolWyw#|s)X#epxHixd06EdR3JQ-LI-bW-vJ`^!id~epZ)&aeH4Tu=3j9uYb*}h_RF}k_3Up zE{%gr_XWt>w8dlb-eM^Bf&l}TG||PvrI0y8-H-p(S)t1AA1sqp6&%H)6dAh_&MmjH`N%x! znA9~*ZuYVxeL%IVv!sONk#+0b-tlHUlaaLaQ25Cpw{p^6UJEpFZ&0kh!H)h$?|wHn zbDz7OWy$R5nNw3EF7pbQw}io#enN~qy;u#q)oUarOvt>XW;IEpq88<2$p^@U^OR4X z-&QKfuIm3TI=8Mj9J~mdGY^dA4=)jdP0KN=U{Qg##8Fctu3njHDupS>&%D{I&eMJ` z&*g1Rp|WJ=&V6|pfrAxXJLB+-M#QEcE=v(Ql4wKRsDn!1-CWCyzar1P*z}70`wz>G zEsle)T$2wi+-exzvFM+7v$MfH6a7wQj*+f8(?Ly2zXfie|5B6bcvK;Ygv4u8(;a5K z>|et4h*~~a8SlF6(Bd${@7gE_ zL!9I5Sj?I(|KvFw;(3+vf-qNj;1J<_bDLdTH>uyBMUB852WU#qW~Da6s|X4KKwd0Z z9798x{9&zKPa=bhBAgGNB_cu<0%@4QJGjg)U&-+8jCF)?#aI2W-8!~SB<14huTsg@ z=ordr)lMGmn`~dq%%uU;nttdf@yuY;;E%# z#;OIr7D`VHjgy0eGnE~pVR6)#SR+iez7*Y;mC0O;ItHS3UPs&jJvG}_Wgih9O2sD@ zPTaa8^gVPp`X)!k)j13yVo%w2@@5mqCr?aq4sr^t2ggfO!)L#I` z;u5wGVsUu!qbnd506}iXjz`LNdd(U3vQG$UxBPg~D1W*BwJqsT*Mi@ZX67Xy^Jv=8 z?R3lI%>Fqi&z6&7;ps?-O?f%RtGnBjr6id7d&%C% z0NM%!*IQ`iKdI_K(Qi0?@xm$|Ub&y)+vqOF9+m00-c#AUC2 zr@!uh+FhbJFW!;teSN58RQxN;_Za=v>0h?2x4?@7+@DY4Cx5ss+pua+yM3!Mo~EDY zL{pK2j3(1C`QjK&;JF}xHx$Z+oQlQd=|8OHd+uo6A`~<)BJg|`*E$s-z&K1%PEz$J z8bOkrW}36Guh*#`pg3C*#*YY{Q@0AP^o@z)Y}K79OtD#I!JmHI22%&5Laxe0TZ>n& z?$$ywehfPrDcV_!A|d6bYU&ytFU_9Bf9J=p7ac2ph%J^@Xc@F*I}oY3DShv_W9+bg z;|Amo-D@i==6~EhmTe}w@KBK;|B)_umg?Jiz0P5u>_pW02mcnvpwHb`P{MyaIKoLi z9{gOjV04F2&A4nmt-U&@@Do6t5Uf2BhZg-KT>tpMW;$DrfgH0>bHL9pCXut0?Mw35 zHajNwNo+@0M+D``qM_LG@sGcF&v&;OLiQ}Lu>~_{P*+|yaqit+84e4c&0TlyG#UB$ z%Z{c28-wX!hV|80<2vejVfT*7XNNa@QuUtL&ArO&`cSzz;8k7KEop{X*XNtH2)^@I ztneW${QUHK{HGk7O^(JwTeoA;--Ax)ZeDwE`s!CfzfG8V@A(&ydSE#6rW-_h1~V$L zi_hn@#%3cocGQc90|o(VlJZ^owanW;&R&eun9&zqc-zT2+9UqcLOCkn76<&wmSVNx zr&f--zbH0ckIah^X)thd+v7RsR((D_;ptUIhhpG_A6jbusD`TD%ijLw_>nPxI^Vx|e^Sn^x6gln znE3qf__M3>hz8yhB(#tv#OUMYVp8VVZ*(c7bN;DXI6XR=UdS!t)?(DDW<}v*j68Kj zMWy~~;v`R7;yjE|W!%5n5s27yDii+Y2ojcK)wx(Ki{74|Jfsq{MpXYI5$-FHHK|&t zY4tkm$(D~*$G8wYVsVsWtRe&H{arUs>CZ(7rG7OPu|6~Jcf@C3&M|Q8Gk2V3l<5Advw^g^7`u-P|~<6#9JGdU94X=GY(SA@^&~ z{^PHLKRDFY!&cds^3yi|T7P4qFwej%*AhHXMl?VrOiEMgZvtRAcX2SE-6|JUWs#N0`Q6(ppbB8qNE%PD8>4v7}#}!YNryo zVvtDe>|`P3s~|f<{zk~MU7!o%I5TO1odx`yvu(eLHHI^G`qz6RmHoP}^_x{rVTx5t zrH@w3{3{e1Es<_Eqf6)QMA zoKYhYZr0L9BM^T3ps3EkPeS2B6~A8Lh=|FBT7L1MLyeY}gp4On#%v2&(;%pkfDs%@ z-r#}(3=RSq-vfAiKl6JO&UI=&L3E@Ixe>KTRSICUL^yOq=|g_i@uo?>317Rp!2NAD;&c4$c~28|&6z0qS1 z83ZjVI00Z3NqDseK@~8q)+9(UktV5y<)+Dd5^TJaZDc5%r*N#&3bMaY8Df5;+G8jC z$$uvv2w72#2%im~eN6KBu}c{xYNsZHV_ycDdy+)B_scP-a`oEHVyI2QZ+CY#TA*fw zAVSZHMO<%@ zhZ^!Q2}pCsoUI~d19MgZP_fCmR3hw_P%*^W!vGYTL{I;e^Xo{-z}Gsppfks=Un?kA zJGZNjnia(N=)Ru-@qo^?CgCW_!s{D!to!ykM+LWP?L{bj+axd>61S?syg^5~Vm=eG z=_5er3KtJ8*r;B8O(LX-%Qj2TpvVBGwFUaThu^B;h{d1f-$@j}Z=4t?)CwsWgzqIE>Va3FVAY_I zfq~r$M+oqP0jHN=r~%t3i-@AoGc2=-k%U3=K~aJjJZrMI!$mm?U_k6#ZsD&<7Pg>H zLd2=s0ECLG{KQbgpi`=a6hsXFFhSm+!(#_VsY1{OIzg!5(rem7#k3QHd;sI&3W5DITRy`g+zbM#gTnvlhyidm zVt31Nkq2?Yk8w&cKs|~v6tUBO#kf0K`%!{9aBn@}i9$n&bApz_M~hKg(U4_LsoH6i z|1U5q)O+&q!EeOe6nI$QwubY!G1AH%u5DehuWf5C1RjqA2LOi9a>>)JEzBUiXA($t zwBznheiA4Uv1^p1?ZC-dMxh^06=J-nYGJd%>5u_78rZc8$3l~UL%3$=P*TJPZv(TY zph%%g&}tB=bo{3#;*UtS*reQ z16w7+(NMz@D!RwnLcJv6F)(4F?iVk_rbkP2Q3;DAp9{ev*8oZoen}H4sF#3JTv((A zIwNhnObmut_)xMIA9S=s*TJa$SpzImO^P!KJuFlQgnxVx?4JPcH3>!l(dTbY_Y{ZY z219Qvm@nT^WT<^J=)7z2O9E2<8Y7A33uR)^JFl!n4Q#4;8Ect7@kjZ=w#HTeG?D=@ zP@F`-O&(JYeP%%vfO-2>PMN~FNqgh_T0nzWz5MKORt(A7lVyYgb?aT0Db&0@@ACGw>UN%c%!o|Bqic{?=)DUb#lRA zvxJwPBz&kAJS?60M~{aO&g_w}{J!on8Q?%mdV|us)HX203XA)+)^OKi2~Am#7yabPaQNZ3DyOtBl_w}7jBhas+6=-?`=MC1i}}((rb^^L zac-R&EJP^@3!DR0Fm7;s6X<-%v<$`t<%7H?1*b;=|2|n*E2+1`gvADM1=jl5S6C?F zKfRc>Md940g_4B=<#>P3HC zVM)cT(W1aBL5R(9gW$MY7>iNF51bEyGk2(NA2W!mG0>>^Wfth1kGCX%qJB>MldI1= z@?h2a(_R%3qA+ThgkNZyypp&V0M2e3$=NEq%?8J(H0pfIim|gvA>O=Vt$i~*D%Laz1dFA5|_uB2+AMNZ6oZV=Eo}J-v|v@WmhHU^?9)h6)P`qsP+eFk%Kgz zgw?LH69SCQ3dbQaj|9NC5q_+J*Nj4P1xE@n!v>dZ0n2(`3B8Z7M<*t7Qb9_xICIjV zBdS7L&-}7s4_u8n78!V(0aBRuNr#vxs)OYQUBeQm1W75&@98}C{htZU!a+w5kcwDn z(nB{h(GlICL%BstZ|zz)NcBeOjV=s1Kzce2YQ}i!_}stJ1_u89OZ#FtAw%3lhZH?t z)Or%(3GUxWPQYPJ--KIXP zH9N;MBR4-CzIS!Noq8Z*Pd4;fF z=S6u`Ji>kdn9lX4{r005rqbmysn-^kTGep9%r zwfKf=)K`}89rDK> zI=k!fi$#a&6`FR&gdR-?=X9wP1OE~&JQ=G3$>h;T>rb#;#9*YF=V=>d!^4rH{ERbP z9VewavDAL8S6uI|(AbZQ3rk`i)dDU*-kWg4!Ua1k<_b4jQtw={hfn5jpEU3Ig7mnx zy}P~g%mv;D*IG;PY(nR`WVC+E2r+=25`>9yD z^6vUAPV=A4_~bp(Q98D&;AI7YnM|JaC2OuaNQu!Wzo=Q;LrJ(5*~{Stox2wjTgx@c z-fa4FbfzbdSTL|$@%VD+n+@reu=xj%BJm}<(1Fd-=5~rI{*3U$|?VSdOjgx z%fH`W?3liSHgvrG^AsIGo+?tR~%Mig! z#G-&evu;0|mG(!6%a4e)VRrwl2%EEV@NE0i_Kzm(rpyJ4S)i59okza@^Y|vxC0ktNJM>-C)*0cwW@lwQ zd-Uhq6Sua4P9KA!67cgn_VA!q-)G_oRoj=!Rr6)$TWrs_tflqgLY|&`xnTI_pWD0i ztB)-4UA;VR-q*WTZ66!jIMsI+an9`Q^lkM2vJCyQXUC!lbNGa75^7_~cnVM70Z-BB zTs&2R0aQV3!eK=*OxARSG`GRGe|XpY&P)?~k>m0iYY%No9y|5za%o!E?nB1V#_6MU za|w8KO9+$Ak(vQ23m0}~;UzBZdat^0y6vz6Dg-&sq1cwh6|WS(eAVS;rH`&VU48U= zUir@S^1#oocR5mS#iC)Y<41D@86iR}@nJxS z6}3+#ysh2wj{he!k06I=wROVjdJ`$Z#F!cZJ5LcS7!gYzq*cAy`{Ky41sVUO{3@Mr z>f^w%g@07c?F&7tS-TbSYBjNQhKpn(b5RJvPD-zRC8}A8%J1!DuO&F9&gCe)MGsL) zu;@iosVE`;&`87i^1vZsY{~Fgq;K8%(&X`JuZWhH-zT1KIk_rfW9)u@aWVY9NIN?U zg35tqFs~oqLcmDe|E-idp#ZdAsh!b~IrV=bt9(ySK0U6k^<=~7YxfniyQiGm`CUIm zp3wXBX5YiFnnl0AZdiHea^L!=`PW8P4K0ex@HkkUFENC0f2|vGaIOVvdSZo}I`>Gf zd^vjf)65S8@85N_m8`!yczJ>1LF?r!w<=aFT$@sG@xr}hF_Cj7JU5={`b~YB{i$(E zi)_Fz?dj&n>$~I$(ww;6Cjzb_l#ufI)9j0F`9r|AEJC`xcfykw)^~o*Idto^+x-7npo!{0@OWr1ah7zC?rVo~LEWF|Eh$55>8hKSzt+wJzyXmBP-u zzM5qLrwGu?f;S;|za%~IV-z=ne9i7vKSIu5k)v_%&*w!3X~wPnMy0Zv(5!_S?_Rxr z@^Igqb7yw2J*S_>DBf*~bAv}9=O%ICWTV2CV_RZtlyJQHUzth9B3>~@e()V-H_FJ) zSB^fZzP0CE!+87U9na)n{dz9XF&6!Hmn^kEqZsO(GjqHgqg|24c}JyV?tA3^_{F_EQ^eShRw+siWzv|cpm&#duIF_~|FDcZ(7R!_O})D-t2mv{ z$4onus}7IN^Q6q3bL(P~5@wMy>SLm|H|*R#Qtx92x^<%uCXMRBZe$^pSXNGR6Bp0# zl)#v{gyJTKglP+57d?SY78fUOO6MIQdKUtKZ>-Rv4=P8;frFfVNe6r=0_@Vl#)R*! z%0H(*O6a{8gpihby0R|rsmM6~@(1uU-HG!{0iBPdl<4=^k;g2!XxHD62AH_J0;Jg) zbzrsjD;brB#DYZiK?y|nM9AK|l!Q}+RKJ=?T#0{m3IhDd7!tE$takY=6;Q~hknPUa zY~OSXW*78u0IYHefzO1R6y)Z4rFT4k`8jl9CFdo&d7_Az#gs#?Qh(}&XDVh@P`G!$ zUORJ>lvAm?&J~$RAr=~ee>$R}NiC!B5tI^)(-vrGYxS^~<^RxL`S|8(8rm{0EuScW zfy3F2P?kxikanXWE=ML-uCoDGloZMrUK>sBQ+| z0!HAh2O1_HhbHLZ4jF+m9s5y1Y+)&l@I4J@Sj@hTj3GFl_suN2#{Ko%iql!~RQ)Ji zFJl~&F^;RKV^q`wT-q@`U8pBtL>Whnj2{>1$F1}hE1ke%T_$c%M&>dZ`G^HRAY+{5 zQX`Fok%fLyLmQ(fpO7&c5e89Ed`{1(LYOrgUoRXKTL?1;Scxz(Bclqj}<*LvYS!PO(pO+g4Ky})IjX8 zm`boUVHy1^&f2fy7-XQWlKoM`yo%BJ#!+^kh6#TGreM_j$cCvX=s1r-pi0>q=n=|p z*02ioPzAz%D5DpmpiG(ihFCW%^Nh3_?Y`**9BV1CCErTt=t=WX%3&2_yoGko3e8qB zvoY|1iZMn-Z`4DHGUhxCKCdTKR9Y6Y{eN>wEi$SdN^b<9g};LF2s2v)ow3mDxU}Pz z{79S>Z`MvTGRnk643rTjCY>;dw7F%>YfgfW_DeLJ6sfqpUdK2G#su-m!dTZ{%hX zjE*S;ID8p+8T>zB>vhcjriKkGfky~y#ES)R37QzNThEE*0=LC%8!q_3!h)3`8>7E7 z!k~=x7#Ra=m=C!iUrG6h5jhgZTMJmB=SA; zYAT%lD;TC{thIp0xilisdt)ECPszND(}YISc@4!*Pj2Co#~8`yqZyGh$WsY{8YECg zO2Xl}ddf_dZLEbgfU@Uv)4u0NJ>!B=Nni?*|0l?uSCwpzQF6qN@(d&WCQiA^1uiMs z1X;~ag3*oOGXiIe(Vt;-i`Cg4qrb4iavTy{*$qnIs)`MoS$#&3&Sj6A&o*&^27qIW z(cbD|I+yi`3%UzgHVBEWWW2V*EDiI8RbYcNKhFmXEu2TF?tz(DIdgbcxcSeRyW&{- z9Z;#_9R3!&h2CJl@(dbQGbe;vrl&vUQ|-9)Mhwa~GNy4WmudDL(Syt8!->kHF-qoA zJsH!ZH~G|Q2=jm$I$~M36FV?ZynnoE+jt}Wm?b|^MOn%vi!JbReZ#a5@OXT4^;U|| z=#g|D3?#yd1h&>u1$M0?sgfzbaak!#66m?qGMP?qlI=1I}pQVwl=M^!_Sonnd9~7ae#3dr<|)H3-zQo zo}}ZNZRb&nKu@Yim?uy=ExM`^TPM|I%_`$96Eja>jBFVghm11FmBh~saze;|nwbo- z$7C)v35A1I^By4VpmMUa5xVz1#};S3;j;6e0G%k?WaK0Ep)SaSD&mU(KN|n?|nun9rN1=E5%4NJ80vj+U>j~(EL%$C=OvmWK7#-$OoMrWW02nN8 zyNA&(0WLl=;0nsNM|^^ef~#hxV;wz(Ff1w|Lgl!GF=vP&v5cpwD5-slcARH5J!K0=0DIR{j>>sU_VCXXvF7QV2*WT+#2|rBRIy& z3*Y@%ZUMvyIP{M7&N}Ze@3Q?ucv=(3VDy{65q_~B2t-0^8!zN7K zR>+47eL4uw5W+9tJSJe3hBYZu(bdP+q@Z1r>E=1h9*sJDT;<1Tk+MwE_u$ypT?tdU z@Dv#ot6>(Z?oTS1L*&?72jHWKTi2^KHev2>&mMZbGa>CP>_Z6Z76>{?A73#>dR+ zdbcyY-yUBQ`c0EJ?QK&pcp%}u^4`#ioYD9(G6+(gua=CT3XkV>nddGGeNDJ3RfA@f=qJFJs zgX4E6x_TcPl@DNpPZrgYbhEB0p!oxFB?HyXaBLy zRbOLAh)621RP!2=LH;)I1njA+9&XL%o<8Ne;?)Z;>)1duM1Y?SUnbTSxlHr$F+dP8 zDp6R$1uNlf5Fx8HRNK)(edXozrR@nMum>1%b@}F%|E~!t( zc`ciFq)e#$3~oN?Aq1f1#7thpd)q#SC*~*B{S>;o!)6vc(xuRgfA4$M#9Sy?`QGdP zzu$C>*8B*5 z0$w{`cCcOiqOb6Sdn32nP4gn$j{#9p2iyYoa`kmH5*&P!`g>Ae!P{(I5*~Z@!f$FS zeL_dPZ+_y_`4LOHgK}Tec;lg1^oQ-6(n>q^X2h%E^IoYtyWaMHlCqBNcB1y-tzbLM zb6+x2ZM7a@@pvz)$M;L{KbPJ2N0{94g=G%TYff_CA>g(;=dujs*oon8Iz!F7G4)J% zVpBj_Zupt2VAq0|!O@jVe;@dJ?Qn0ytfPyb|FiDnlk=)&N>qVboEdOyyZ zbLi%l-=zeNN$8V;a*>L?%WQ-B4FRu%OQ_P&Z7Qk_sb58Mio!r@!!Z9PG;SCR-%ej1 zt*de@XnV!rd@gvkJ@j}RP&p;7Ut1;DV6Hntg&R7^H4nRWRpKC;ls!Fc2&IPnj=idq z_yVprf(M#G$n`U3-XTr{j@VAeHENv%ONLMLPPKJ(h(r3-(bFGl40MMDSK7ga#@^Sz zCKXzNxFTU&$-!kL{ZgH)d0zxLzOOfIclP5mOZNvl6i{lj9@9M_PPu=XQ#O`r;jgO} zEE6ym;ebwfR#2*SiP~n;Ip@>n$bS^-wZ$&?dh0dVV&1g12<6S@Xl;>CpT(l19qjI) zPfwLecZe$s+-L%~A<6bBd9?N&9t8!R<-A(C8_gwzCf(s*S`g7Gmr-;vj@3hwSmvpM zdiwSQMip&39#BUaw>jsf?KoM`JNBfUHr4WRs#sl7!)c3wE>1FYeO=50OKXxKOtQFT zxyG`09hQZOQYe}?`+#yoqn44)A6E%wYsA9QRW9a|TFOZ3(bVi3I^IVfLXLjm*xe}g z>76!aW--Ms3#IVaU}7!g-EGh=+fTPRu4I_qoZSIU={|~wzOj~5wGFRTLqD`MUNX(H zZwVhWl;!0FVyc$A3HaW00t)*7`gd@0*OpUV9)x`8@9 zO$~>%p?g;tL8lw_r0q>%)X&CQb-|Klb1{@&R=qnk%>?<%i&6rSI`%^ghpRR**JSC6 z0+ve^KXCi67KmAoP~DVT>gggaV0`KDtgQsj;p*%O4Ti8Bv0~p)6Ii z!Z}WDCY#pW3Qd*)xJu;Z^Ku!JyRqZ9`%Ls$4DeKb;MK+;@`^-&lcjJ@X?q{M|HgJA zPvg{34zPYNoS)v9a{k1URkGP*W|}?E*_Cnom#wg+kAg<6!yiSfd^mRfY zS-1XK5Cz8=;j9Rv?jt)Ku*tg3NHW&i5qj8a8FVyISu$A;MneNY{Aavxtl41eR@X7B zKtV3sdT^a6hLtSUb9P^+PR(>J>_SZ<1^I_@z$iG|06|Mha(sBOxmTr8GOz# zNGnuUE%wyXsxv8oJeT8)NSsY(T}YuVx-=dJRv~2$n5I%$D|NoZ&s;0QQCfE-Aj(2u znMUUqs1o;?GBGoQ>&|-?Wi4w;=3g!xpM@f0W#4-M)-vad@2t zFt3^77PqGK?QYC#Ful^*RxX8Vnto;N)x&S%OG2TV_AJCyY->TLd1G2?O%gphwVf*D zqOQ|+>$ZC;fTIP-3d@DPJma5i0(ZxrW+us461GAK+xQs?CM@FP>Z}u%s&t%GF}tHR zhhAGOuPhU zqmv4bOgh_3q4>VKRjBVG8eSMHYnC*bg1U$m9NQC73;Qjl0eReqefm;)*mhIX{%f#- zVWIHN;c6!<%t)&f_G6_U^UtvsBEZARTuPu(QAwoU?fU_0&~XEu+NKp+3ZhhDw%cj- zV&VRRMSX^4%W>)=>uv|_wWkefLYigaA;JhTwF9hk+uZgZ+&*Pbl_M5#W1>5veKYwm zgcU@Q18LfIzomclU}<4r>k@h(P{h`&;IaJn*h>71koMz=i{{Dh{Z_4GGe(lg%#<)7 zoD{oYGXWVUhZ=vrjr(7*ZyQ2wBuY3#7jO2lAb(C#7LIGjv^PzBd^PUe77M_#A_8526U89AKbYaxrM zR275Ugo-**PQi6r9zgt+9XZSiGTClAaos7D$cA}Vy4V-&xU@pcEzs^twRtPuuEVu< zC|KMJDuZ+{!z!yb`d?`S`Lgh$)Q%!9`ZK&{KMgeRCg>tsCIC8iJ36Img?eU^muE;* zkz<_Jzp2Q!9~AZjUoJt-IOsH*TF%ph!g8X=R?Fu$9IgXnGcU!m{AdE$F$i=v5{_=- z_1eQvBS0J!q|#uBX=enZ^CB02bxFvJjIRchhqgMJwH&=JAPAHdho3J;lm35k?*%(_ z34txMR69m@+&xi?#fB!=YlWEhTufx6)jjT~mnJ#ny6cR!zU)K&Q7uopR{3skT00}( zw=Mla)Z(G8RiREf5#_nQH$6Yj*z$A6eLXnaYtOx`_WP+|kIpCKWrWbPmDi-@siY!} z%@12G%Zzrux{=hYon6TQ%|Kb&wxmS+gdVL^jreA4XhLXoQ7G8AK%3MXUN0os9%mAf%ABKR3~5f{^L^#+A!^i^H#iF=FQ zS)9>*Wh4%-j6+57?UiA0Kga?OlFETUKz7Dgg7i725qAn6xSi4oE`AviFQUyJsobRp zS*a+L3UG~)PQyXJ9gh?I z=sp^Hg0&{J!1PQg#T05@kZ7-_>(0cx%YaM7o8EY zr^tMzFY8W~>vn5$$jwdnzPD6e&aC?2HY+jsCYE%6ZSkx>eB%MOIc5sLP?DC{lxBI7 z8Qq|$3FM)m^A8&-jqKi}6^a{_O{hy7n4VeAYmbn3XkBC{|J`(gaQ{!uqAXWYJS}bi zlDr?hFIk>i%CVR^!{imTQf|G%r9{g?i!w1vN)sUZp44;@kx$PB@%+bnCb%RSd6uG=q# zbRiLnywxpvX-d~FL%7LTRlq`$Ity6?lUBi`gcu~kER0tG;G*)^DG)}PCWV~0HYVRL zx1TLu?9;Yvc2upewP-m(^SC7+m3MeLOJRe+MXP7d&5K#D7}K|;J$)i=j$ znYL(!^1tZnLn{t8J)ASWq4VI)=#*pEZ?3#0Ikuv1NA$*-u??Rs@CdMah)A47G89Cj z;S@AEWQwSlOY)cLH8Zg8pCmtmT}db~PuAydCKJxbljg~Z=^X%1+h@6p(bY;!HURtI zbg<;U(foYt@BbGgWmWi0GLAmg^J-W{D#)wY@R%ct$TXbcg@CUs2I~$DA8LxbzTvvZ zvEc)69!}gHzJ6)N-*aOJcu!u2#74{WQ$@5D-*Z#hhI%Fzdc;jD5w1{-A-!vMH%`6Ct!uxEPJ6!Qb z#l_^w>8}r781FKdfIm(>yz$@gwY|}|H(y7#KfAq_`R&-VWcyV=ZmxNmg{)MXUmgN5 zJ4lJ8rR&vL1=ppl)ujJk3Of(v%UuWam?1!XOJ4crJg^M6QEuZzaNcnt(*7Wx3ItKJ zR$AGTx(q9q$bc&+p>I6^l-BR%KTPZZ-$xPChp-p_p3@;~zWf*e@2dMR;-2w;j-(S3 z?2?!MxVy&T)*6BgSk*x!Y60{9K$3#EMVUvQ1nD~UCcPSvwWYA~0CKLf1(C@}Ld>NV zA4D;D1K@!LL$Vi_c5ck<=}>xAf{d;o90uwS`{QZ z1fnYPBq2=#5&^LPzaHV+F}w8W4gb-v*^gembbINSq-E&|Q5LHRG018Oi7^DeP5_O{ zG~4t!WVwnniPWtpy2$^pm;$0)j65|dBc5|1b*DB0Eq<17<=l?ZjTnDhKxDRHw@E^_ z2sa>5t(B0rw&X2SAouF>F5c4z>HCC?4fC= z;+HZN*Ec`=x9R?}=;-u67w0}5wo5MEuxf1qQwE)Z{DFDeP8A+wYO$~w6tR^MR>{;0 zm>MdgURVH{6sRKPxfXjt-!dFkrd~V=n&=`#(_}()6`sk$s(Hvk2Q|S#wbw0orMP(c zAi-C13j2aIPmkaF0kH4LT_zz!OVqpXJFU{=o-cTIFfc*wGZ|)c=R|UJxP?NoWZb9Z zzGmX#>7Ta?cCH8JA*LMw8MY4L5;q%iNt3D+v-!jj;5&8}F9TUhWKaPRJ0>tXn~H62 zMUHwbyGbsK^Zd^`%A*RjiTR)No-Zz&&|&L9C(eJW9|%bJY~ z*hf`1aiHL0Xhp#i5Hom^cYIG(;oUd^h<9fAsxj6YH;!BD43M>V6KZ zbx&N`H77@q1%sj_iz{PyGag|5Q`NJulw*-qiw8hUFIW5i~;N|z>(j&Z?_;EUK5cW_Vv2-$YZnHlifeIZ}NOD zX}_C2YyASc5)ghauK7+(slsQGCS(Q==H%Z;dXeUpTYJ{5g{J5x{LD);{fkaSZ}rd=s>!FBxT(h$YI3jwYVWlji-Y`OI%q>ckorp{%{IK9l>-7ppp`vW z(m!yzA%`?mX7&;^j##|Fe(n67uHg;zN?EiR#ij)dEgI}a@IVeBfMTEBv2YKLfUA%- zX%Pd^L?@n%ftC2yEi)gVO@G!?;7WPVU`^JnzkA+@IY?ma0jI_|~n%bsvMa7kFg` zPW9vR0<-*fw#ET_uH@4EQk43ucSN_XEm+TnGlE%M{QJwc+akL`qc`IoIRv>^eNYaZ zCddE2bxajVP5e4SV!OqO18sJ;bgKj8_^&}MTOI$It$l1&u+7%E0oZ+LxM#6QlKE+X z!5kjEHR~Q`Mj5|Uw8QL|{qNyf6Y|6o6Gousmd6Br7UK4dj3VL(flAG8u1Hnta|>zc zCo;HuZq2&ST?RY7h)cZXMDG|W_InmGYawo<>{O|Pai)yuS0tB}x-qBk8umBr_U9aF z+!GOdq-n<)@gn|ViOE7clTeRb*5R`HZtj`Tj8{nqTYCB&Tegb{>u26gxNLDSuzV5! zNMAU9=E1MLoobq)edO=l(3MwY#IFSW7dW-((u}o@6#-_aZw&O9%_JhqV*0`jzFRmy%eCH%Q^8(z%{^%1r7ID=?A% zKE&LjQD89t(W%Vm%=Lou2+QXt#;^3yI=U=Qh=EKd3G|wx7gCVRdqQ*x5BBQD*p^A07&94YwTBYte zd+1)p0&a1i%FlL_*-0wLgj;cq(SQhlbKaDry~Z`sNq4b0eebV2rYUsznd?GygqfjP zQ&(LZYT|oovoleEC@D7dvE^g?gQ&KE^a_iE7;-p4lkP@lb-1plIu&QQJ8_93XX{gd z`28dd%(xH`FrSq(M-q=K>3}G74q)P%_?sTrsuc(o(O9FH7YmK^s98%TO8 z&ST`PPj((cFG2Uoe*IHSZ+16P#z&0wAbn`XLh%h1b8RL(bG8EOVvQigxeZoeRgUi# z#1;@~csJ#FzRey$3d_TWtUTC+=Wc%7vwl) z8VVx&OSe>7izP(M!kCeia3uXvJIC(4_jl^Z0^sdK%dF`g)_H|EO< zJwv*0grNaD&)k{weGJ5>$~2{RnBCq71B<$gHcZxonvea1XR)Qp(C2I;E#Tdl!4TRR zgnQ(<4n2CTb{bIf?5heFCS}C`2q!rrVDQr|Ih#cF&EqkTJnBafo*bpV)-Mo+3G!$3 zqu?EK5YFaX#Ri2MoUMhe&c-vNCov9<=NeC2KXi`EC$-3X9hoC!nRd`PTs)oY8m-HX z6+@;M`st#Oa#cvuVsbk`u$^yZH z`u5UC=W?;G(~LYFXptjN_8LN2Z_DzWiv`jEMGmeT)fiO*@NzLk@Xw&dV_~xQn;L+0 z78u>pVA+O=^%7VWp-*HRBMW`g!}C^#3c)+_JkIoODZV44m)AtTGyeD2d#U{+);9`Z z+&)1GsepnT%nD-rcNg(ok8yhBE9sZjrK?4CB)_kh-LGMGf7d%*_S0F1|4ln$5hJ9j z-~cYuLp8JPe&y|IoM=K<=o*Ti9GcTaz6BIX5NNPe9!;yC!Umtvx_0YIEBQ!&$&IODGdR--(}NU^D4X&i^>&gwQ!`WuV70UipJ56th%ap2H7 zio6W!vlHH#-M{PtM%i)HSVb_7&-ir+v;T2K>o0I}5LS5ny6}Vt9>mRM2M~Yx!G|u^ zQSVr(Ij%M8jn?tWOTGehH{~?w-3a1czM`zYc|<3&7XM>suldiL%8cb8E<1~e-MMM3 zxG-Sxg-eos?-{ECDh)gnJSXT&oj~bNNJ{4(TRgjgZ4vz~X8T&?;y6cIuirj~_ED zS)pbt2zV&f-HR!zi;yxWFVww(EHc47lo4%EEu4 z8Op`b-~ws;4qKdcab!pNjP2vza-3d+?&wnl+gy$`%p%IH8l&*Yyp^423iY>Wl>RCb%5*0oU4z>9eJ!V zgj{^htN>wV=Fm~pgbEyA+hc_wOxJia{VA1yF!&Rn{S=vIRE5=c3us%wK!^7p~cWLbpF}!Of6}#|huqlhRg#yrPP{!$94s|0YtNFoQf^SX8 z7U@Cy4cayGXmBGsBfEafk;6b*0q#9;eys^pk5O$A^wWzQYHG)t5Qiry1rtgG%VP~N zzS4hI9Kvh~q;NIfIUrGc2rvLxv?-(DDsyhbB4w0UHvXGEBe)VZ3JhTD%f|bV=p)*G zZy_rvjyX3XSe9rMl32n!>^&i$_vrb&bf)n}^MAHAI2_5Px54Btn9>F)w+F(P0U=fJ zgfT{AuZ|r{Am<=JjZMb4L^8f{ni@J5oEZpTtRqnoZiI08z(_PDC-54;90I-x`X1*3 zq{!gdv>}qVju9HXS@}HrrO=v+4~`gndF0uwY%P84siQh6Soz$kb-{-w7{7`+yE!+! z_G$YzI2ikKn+cG=HkgH@I1~+`0t7M8-}EFrJ14C5lGFUe;7S-*hCEi{V>>TVD&bYf z`oe>}c@0N`ANx7e-pZ?|dxwwf{(78;#WUf`)HvpZzG=e3GO?8iC^Rp zlKwopnJ_n@SyB5uwhyJaHroVEtZ85OTjz_o7MPWd8hPPXd;(b4(9j=2M%on=yD@|I z;Va+dM4#p)i)07iX43Z;Du;u?EQe%=mUo9H6n>&yH&G%}@k_RCp2=jMP?VqCqB$OK z=`fjpysltT@-K@-@vYj#)nVBcqC}x0KYK#mzB+cUBG06yv~)6dNRg4JC{$0DZhTR4 z@kP1NY0W->89Fet68EbYnl6WN+Ev))#)b0ReS!T)o+8;!F*8|F zG$E?0JuEEUs-ikbUG3wzkPS#~Q#+}_2C9xqw17&Fn7sK+PutVoRz<{u`$I@sQN z^lWNkk)o|9_1Iu)+pCwyCR&eOJhJ<#^9hrehoRRxw^t3E*C#FRgOw;V^4{!9fRYLO z>imHpJwAc(fyo}b$sXe}fPmoq6p%|lNc=%O3B5l4Gqv-Pb7%F@&d&80j;}Ad=yHsB zsjKH`xp4i(SFc}$JSW5ixQh{{9QCPD?~Cj`Q?2nV=*A&P$y$xr48?zaQdV^2&t{kD z3$cIynVNQaV_HFW-{soZZR)>Iyj_2_`tONASX3F%z6~I;+Pc42*+>F>WjIz1K#B{v z{{~={rrqB1_wCXnx2YR67o9IcGY=;GeV&urRhxFlZ)T$x-14fjWEIXGfM;=Cjeo#^ z2%OW8nbPpBAo#q^8-4YgE{6>d_igyI_ShBZjlAd8oojD~Cvw3+#D>?MJ~TA53g@w1 zb0$yfeWS+f2TH50$vpjLfO_yg`wj~&HM;{v)(K;Zif7g)j^DgL5X<0*9-WFf#@v7O>&}<7(~UqT%FWJ+EjqE(AqnnW zZFIDyxRp=E&Te#-rR9t0!Q{dI_*EB0q#H9Dg5qo&Qnt09aQ$u4cl0Qbh2p$ml3_gK zxXAU?i8rYccrid|dmoFScnQkgJQXX4@sVgS0^{cb*%zlAr~t_eHK$DQUS!PwJ;L-E z@Zv}!vjzEuSjQBrjIfnZvI=fVd<+Y$)&btBD2avv`^fa}ID_MHq^%B}^F(J!S{v}7 z%JLt6&|9IG^Z3g*&z(2kqf7y;mODLMU#fFtG$XAV(q)ocV_ra_*KhWyrvNc1!NX8>)Sopb|;>*)Rs5y$O*0y=J>N? zX3hGo&v;Vh5YtWQxU{4ajLia!C%f%FA+y>OW(U=nPkvs#ylMWPv+`UflnFm61Oi48 zk^;pSpfnvq9fFCjQa9y&k)Fq_Oy-j;r(?;;t16<)huwx_fl4{bAde2;eBzM&;pNpj zV&?LtgNMj1yMZxaRd(OT@$m38a`{hpX5ByGo3YVQW^aA-hS2^HYp8pD@94$g$(UEV=w6z@21VJH^{d?60=}x z7fRgDCIk*p;9G~hiaw|Tnjh>CrTrxgIr3itu2Mi(VBK^C2M9=^=&fe-VYuk7R60u+ zQ1c1E@8&(uw4vWUC8wg5`@S->P_eex#|~NaBawg)@Rj5ICLuywQ*gnh*&VnlGHNUf zkZkXrT?vvxGD{X9(_Xq>Z*f@FaC%DbHwOVsqn2#ejdiM>+o&RP zw~1jJO{^O9kQyfe_GOT1An2rsH!+hw-)u>mgiTykn_s|EoSzJDw_p@GJllrUKSG5& zjUvUyVX46_Ne=f=BmV}vs+-^%$O6FQ*Adx%ghAd+C3~CT!C<_U#kY}a(XRKkC)dc# zUHkso0n7eMSVlb~vwqxg(enajB&ks`$}qb?Z}G(5L1%vxQq1PCGLgbcK-vLQ zs(uS3p9yAZe34$yw8OELXiUG<=@UTuf!J^lbH`?q_*Ob_>W zAG93@BpOdHd^-bR8j?3i`W?3*pT&ZTOjeN=MGIHU_GFnOg48Cew=%b#Y4bAoH*=6^bstw7a z7cg1$!jo`uf4{i|c8}|In)F{NV%#~cnT0r0`br$kkV99c__?@BInK-#@rqgK+gR>4 zHznfp_I^S33AS6Y0vT;E4_f<phc=3u zM;nWlB}Fw`Gz6t6Pdihrbu%MMQcqH%cA2|LvPIJFX+EVd8SG!=y&P z@KpRSj))i{gNQbfZn;y5>{XV=+XGfxI=fXX?+Qi%Wu_H!KmkaStATVWHUnM1Fd0!a zgIcqVKEM)V(%JZ?rb9{vpR<+<)T26j0@om~`GlU{r-hxmQ1MyIZWGy>k$m%lYBR$%4d;Whv zOfh`_^Q`>vvjs`aMLq}Q%!rWiT(cQs=>ja5UO=l1w^R0+S=Gy3Ffdi#TPpD^*WMK> z9zs!3(QHB`Jtt&ssafQK0LUlWSRHVk{P(9(XhBf14$Wg+7AN5>Si>;U3>x=EUR1h@LK^bafREsyF{tJ_t;m1HV^jLS==8`xWFGMZ~rh*c9+ zpab}#0KYMElq>Qp!xGE51<41XQW4Ba7RI2}@g|t)O58bxXvDe$%~qS!kMN;Yx)cKm z%&ZsX*=i-p2hl(5M{KRK6>|1^5&IORSEumvP4PfoPN83c99ezMcy3-dX&&$M-KaH( zHaD|GW+kCeyq)QcEg56PuuXEiy^A(=XI4_U(gnF9#Q|Y{TstP%o*&Xi-GlA=`zkFv zD)^MxA&GQvh+S2p`3$eBM6-xd6pe^`9+O*Wym~60IqoeH5QH09Fu}s7V;UjY;9EwZ zSI|RZjrjORY})kLRn3gSJGg0BOD(BdZu-`c?~<8@y9pYIY9+}rM=rOX+6`^Ilasq@ z1R|^1Q12!JjV&+=`U=pn2B}TgYskcE#pUCCcd!E?&FJvAMdYAGWD3FS6iUR%Pm4nd z)_*EchI|xQh4g~U=H%hT;*yk@=OhA_?M^l>S{MTcUm+t7x(Q^NOv4`3ngmah9l6G~ z0E|JPwZ;fBFax;Hzl@$y1}u$Cd*Zh3;o>zv+cBn?z=1Q!!AK8j z+W~)<$U2SdSdYoUp#@w|*+qJwzxl!PQ2Q<2d3I&~!vzy;}e`j-J}E<+Rcc^ zd6OSli#lrYTgsTyPcdgdOyzMZ4e+gp==D}ZzK5vTFN)l4dtB$fA0icu7Q$ztuLWK$ z-9`afBevDpSgu@7E@2-?pQ}@|i$j5F=OdkNRR^<6R3tmr!wbc*O7_X0-3{a`TJ4NI zPxkP7b!FWDR|Kc^wrpcSYIUufHgD43l%gfhx?fOgTWKH}kYFdFEV{^mf(cQ03$Cna zbB&t)N(bS>PL{6J)muh9BAR7;><-!p8~In@mL?%!0{*$#J@yr55=*tRs)1xD={9l@ zFfwy`s5V1Ez7CiRKn6(WWkFsX7~>5BEG=S#aG#R=1CMdy9uAfC8>b{%(4rYfH6Zc8gH`*>ekSKj_iwQJkDpueUZ_@+rtrxl>Tv*;>@SCB9^xLOKxB z8Dx}jUy~xYwZ4x{0AT50>!)I4&6LDh9G1q~wU_f?nnk1}XwSc_wSMw4`X3ox3^BT_ zpL*(H;?qN*Ri*stM++78>C9glWVdIZj;k1Mp+(`9n=ISDZzV^If29=5@$*4R=%h<(h5lP@>>A+CM$hSP>3{&dE4wtVT!K{n!!(znc&O9Cx3cK<2RkT3;ea zCC6Oesqnu53z7f+8^-yBfdqavM3)&}xW;6YB7jroZ&7S5ZQn;FP^(%~XTLIoV%!e9-yGW6! zvilbVq$^-jv>r6?Tm7+k&D=YtC_->GfK|&?ZTrt$U7qIZRbC~PVF!s)8a?=hkU(v7~1&`CCy=}SXhh3SQkwkcK@9oSf&Y0lj1WA zg$g({0U%+1SAv1i#Q>w^1c!RkqIKUL)WkIUrPaupRG7HM0JS0wekieuPOrhRO1Pog zzzCVL#iQ$#Kw5&F5NY`R!@J)jV4S0n7@$T_lptmfMe=WLzq}6b2<{-#?;5BG`Ux*5 zq)wy6NxtNp=6AgO&Z!qh@2@*ZSC_^4ve3Z0Pi#^76 zQWm;M$Jolhl`S`AtS61;7=r`nkKZ<1YHUu(B`)IM${DrW(leZ;woR9NumkXuONhU# zpVlk@#O~Bxqn0Xvq6{7v`8TBfZP}e$5tmljD0X_KaQu=_u~%FEqj&888}eJ{c)HxN z)gw*v$8D`K-AY^UceBC*!EL{M{*z2}tsL*iuz7a!b!Vw?!k9##Uhg<8P8vN~Z#G3( z1n}3$L2Q`XXn-%RpIjX#SPKh!%LOw$&21xuj)P{Kj76EKty;|^U7~!RVy($A`c-fB zt&g(SLzFHjAAy--E>w~T*b`zK% zSRch^o1F-f3{nKvJDXyyM=2wEH*=4A6Ax3+csjfN^_ZvWYdz6cYgPf`@EKwkEjvsA zWgEVBpgX6n$L6gqqFB9+E5#G!9c(1(UeW)in zM&@%n4T^S$*cHUvO}WeTnVWZuRG`~Sh*P>kp7(E>ss43lBGT8R@1xL*Yw41_Q5 zdH>F`Ise`p7YUOp;T6k>``((hNdYYE^3@d#c(bbHLt_T3)-bC@Bb7x`cFhRKO8{je zY}pc1KRG7(JTe;zdAnqR%O>2)OhSL7*+mu3?wa$3Fo(QdoNID=ZXKspW$6PGd|{OS`-HFSF3zyZhB1LjLc3$cS;e zGu#y44B%wjh-Gt#UzCBEvxM{Elhs)eSBjWB#GCjh0&yVk6W=Us1goX;>PJil>nt%j zq6)MLlP)#YS`Lnwg{jQt2yt(P*Z3b?Ilar;*L- zxHYAm#ulixE>)t1v;fa+WS--%)-@ni2k_EWi#pQ@Nm|@afpv@2GONzACd%~M^a#lZ z_`U0<{bm$w1$UPMJmE33y!E`iI>2AR%M{SLD6Whz$01fVb)XGUPA|fB4l^iIi^D9_(^{Mi zJ759a%Ti8DJjWsaaCHR1&p^r)n8n0%S_Ebi6f`KnY`M+hR{a_eHri$37PiqyN#3+^Y;9w?3eakb_P zJ>TL=4P;159|Ea(EmsW!Y84mr6!lV<0jVW_8iBT-UTl|RU8Mp`QR?N(RzwsmkbB?o z_%8(bfJd~JkE4@Xa$%Y--g@;+x{Sh)`V?{fosc8P9(JC~Qs}z5v1+JU z%JcMQv-zrqI;)`(Og+V>{yFH#Ms*;wz>ec~)v7kWC<%eu0PBtsPAS%TN1eb;3*Iqy z9e(_m>)b{c&2yH#@D>%{7qxrOeX+HR&jp0)?+O5$#2bg)H1o z*tB`bd7i=LfaibCSQieYNl^QD$MDy*^z?+|ifAJkt5Ly}MN*~~r3PZ3G*L{rnK)*^ zvL$KAS^Q}}9p?Kvp~c=(3b66ceRjds2L*E;?)l~XQo6BtjoYGH0%`Eq56*JZ>I!^; zX>Y+NNIOFL_PM}ZQuOGq??L`^G-zo1s^LH^C6&O zWrjL%xfyA$p+e&5qRHALJ#g^C!-Izh92Uc@fN=lzjU>J|fo-e)bBW8t1LE}nlk`!j zoen>^{BBkEho`IGR_-6ls5zM#vnx|!1zu=BaAL~deY4GB`$BvDEXRZeM?M_1jjea= ztjqW?4v#uDP4Rh;95zJEJd0U`qJOIsIvS<2!#VU25?sLw#{+LG_?DSXl=n9^V3 zY$S8B{4AWZ0vD7oUyyC|+hFtcM{R#SZ1j~whCREbh6C?rLh1GRKqLI><7Lq&N}Txr zNr3qaIx~kKjY+<&n5r%vPyGx7`>nK);sE9+aJ)dM6`%Gs22ei)@gcLy|_!%L<= z*3J8E|GMvO!3R&%Dl;l#sWdET7xO3qTmfu+I+|z(QmevD!$v9=z|3liS&}v#JITNR z)l7OY7u)u>B0JQPBw8ZoOOCy>|Adv450WKXQdktTnoLbsrM>QaJ@%>cRR?|SlSc%A zk6CFP_hGzxAEhGLVi#%y-PoDh_fp$G~VZ3mi6fkQQ z#Tmxu!@y;}>^RC2jWTOaQm6Jh(nqLx`RICjM(NOBAep{w<#@>YhjYT6&?TBWj)V_3#&a&OWLBcMTRTjgVPdu`s5DsI z$6VXf7!ht7y%e}1fFP}v;Zq6`HoDloo(-J7E44J+zxba&8y~DbJ^g1J1ps6D!Z}wA z>jWmQ*kqTQ@YAC{)4*tyzu4D#WQ_Q4qXUHAh@qOSoyXxmS%y{CF< zDH1~XX|aPomAw-j2#GYE9KrGea6JZVb-amMaNnk*HBR8BsgRn0;^V;ON9<(P{K;Mb3+$(ssSnz+i0vPGp%x9-}o8A~P z;{dfKT(R||H@6Q9$%dVHK2zqQoG%5SV4+XEsUEeCDg{3OF|v?PhynO`GB-r0?PgdK zC;Bs>0x9TunLMehTgU;WUQ;Z6pmt9_KcI-~1ZZlK4Lv7KSOLU9a1LkkkW|sK75nIA1ZM)CG3k|lomfpd?G*sk?_UktEz*aC-&>p5T4w#1-NN(j z7OKvo?p|+HZ)V+p|Qg2n2i<#4xu*QHWO~gK#{uOip2l%U}X@AbJfhG6Q~w zlk~Hs_&Ep)L@^cYZi;=F{h`G2KgUeANG4jIPnXX9GHJVxT%%Xhozbc1>s(s+2-SsL zHpW<#*VmJar=n7Z>$VAeqLZGFV@O(-k22juay1M|7ayonw33!p1;>g4s4=lwhXB6B zXEnZ>70_)ohpdD=2H|d1rv0!kz-Tu4w1)1{$6B*@DdkgDF6(pI+U7a?!TP!`dG(A>(SkK{uIRYYgrgU?Tb|;HSjMfdl`Ik zlC?sh-0y$dCP(%rBx;4|>9Uil$soZSc38J~j7fGn0&UpUlDw5_kZSjxanVz4GFi@2 zNgR3@7MD%I5D$f4o_$HpjGvCe3q$Y0Zktz%rHrM~Wm$y0#bcPE2!f;8Ov*KYOTJ9c@TtL8#-kpV1xPi2A6I+wDuTlEH zr3GXMyt^F#lRa^|2W3s)p1Y@Zdy;qklGmT_KP&hz@u}u_pMSt5pYBxvaSI>%5efsrY}BQ#4k6bp#G5M7i$bh=UDJYd zmDFYg@!d7X?=-IeKIsXyJbv9N4}W3hLp^(zw{;mp@HqN-LLII4dSY1agB)OP>hI-! z*X2WBM+NxoZuzp|%KT zZ!UXNZ1}g9b82nbhxpqO>oXHMFADx->o!EECmy!>r~it?3XcA`Qc8<3oH89VCw?B~D{CZwkh8%o%GVaWsxX zN{LmfEej09GLMRD%qxqnxwnX}SyE~YsvhamX8Eut681f`k8ee)+SLO3LIY^2GbBl$ zgPF&_9Zhe3dGIOSQF5iQ*Sr$JyRn{9{S1(Eds&r4Y(rU%s(Ctq(EOXqd;JtRA{!vQ z2nAvDWUZ#;O)+JcEzh!guEyh29kpcAUvNhE>ht@0_RW^mx%|IY9M@u#_1(-^Y%L2O z;r_wubt*6bsp97qFC=PG&wH9nmzpf#_lVo21Z-@L^h83mXpzzhRnINQm3h;%N>3se zAHswu#^}Ti(LHtSXF}N8P#V+M++rwfiyc|&mrIgabQp5)+esNQEZnJmXz@hx(SIkL zA9N0WKJHwwFJ>8{*^&(qlbck_*BhW6wfBxDA2Olot@xJ1=+W)wBGbZuWO)leweQ_) znmn5p?q{NKKDcL3Q1IeMgRw+#+mm6MzgF%3IlsY%4@qk43dz2(>4Y4eRn-k}BLg^1 z5|Ds}m#>Uzz#6WI!(9)GD@((j(Gg@>GeTW0u?77kwNGr8>2uHKIC~7mMde-9vvYum zU5AS3@|G%5o_x{lGAY^3Y`No;d&j^2=^j-ue#`f22;5igm~?a6x2d)3*RDS2Zj&8H zR%>o$c-E9C*V%`TM~nE7I=2Z+UNNO=SOcE=_6+H%Au^W}}GuuWXk?`tUs zt!^Hg=iTzKWkuwg=nYR+em>wHs+;}z`~6KHl~lOv@-$ls)9&dm&#o=ke4RjfZ3x29 z@=H?VY&pR!l-Pza(!{+uQ$wzA4X>ECy@5WU|1=9*oJ-vI=-%YM&7I2*U5-AwGH&0h zbAiwQOJ9EU;iisT=Pm|2y!d&@+S6XwWA{l0VV_whIP-JqeS%tDaG|=V{oLFQcwU-1x)(j!9evvj@MnzV_2y zlirhKZ#Jy+PTKeRNKw7bJ0H)3j~Wvt=VwQT^}pKQHvCifntwF@P3Pl)kR{%0OJ-g) z4>0GgJ9ogSgwOD0YLWK{te>(;D}uqT+{ z%n-2oA6DBs0av%>l_ic{HsjT~d82pOToyR(p+(Z{)>aJ$dbDhP6k+nsBXvon%oqhB zIj7tt)gwmbA&Rv+>*Ow-cVfA6c0Cd_H1qXV_0q|l&U2db3j3uYteYmz1*5=&ftlJS zU)fMjeucetfvaN(DRr`FjT}vDd4A%=%xnwG6NZDlfQ8wQcVkRyNoV7!U#15ueNZ&ZbwH>L5L z$|w?Qa3B=VC-J9nQQl7W{9XSH2AVnILbPN^k1G!`pRLE)*V`O3;X%el$v7xROXBKq zM}@dOLZ|XOqM~+OkrqGA#_F=-U5CAW#pN^I-sAR6;VRl)iv~-AAYTs|?lK$a1-QQv z0e(vSBCUw0#TV(Ed&7$ld9wB_D+-Fhd85UI2AsbCw?jgkP7g|~9xNX%9*)^rWa3l- z5q>euitfOTRLvT>x4V3@c!i1RFEZiZ7-(n`{KF*hsL5)vaoJS+PI-^XD^b*6A-^@f zDE5@w-RQtUiGsCS@|TDxRAl2ysi=(+Bp2j|EVSC4Oz34%?}^-J!(g?JaZk=1luJBh zLZ}@a&@tbLEzEWF37GLxPjlbs#8A@S!i*sn-AukQd-?8X`gM7ezcW}-kRAXMw}CS1 zO%^cCz_t;3fE!{4$O6k1NC70g8|*z#58M(n2r}v<08&s;%;%fIs+r-SNguYm4;4by z46Qh`pK(bK)V>7FQ2-BB)3JjAB_l7HStkQFPyo|15np%E8IwU#Z;v{fLA(gt8Mf2` z%SQpMcsiR8i^ZUs4ltJ4VGGL62xzLuVadGR0AQ{JtIL=_uYe`(IL0UtUJfx4kb;1> zd_nUvL3k9zL_rFx%Bcr9eqb+`1su2!TsOsWJ}f)972-sIcK3ln77?==7PaH(TG}|8 zj19osXCY#~iufE5Yk@#9!(I%0InVe@SvBqmOq*mbzFi2?Sydm-@&37LVh)482!zdB zn(D=D?B{HF;32?}TMu8Q-e!Ta0kdCO)IbDTXNyJ55GF7;m_;4d5<2CC zZ9U*dEo~19Vgzxuj2f$?u2g|CC9QiiFWQni0b~@hsGQ~0w-DhEE%rVF=g5zq6H|ti z2k%YM_Qpcx;T@tG4F3LT-FI+Xww{&^ zV0CqJr}l_F3jU#|70GMuI$HN2AOz!Iw9?knTQ^9t{4L zJqKbWK8mIwg&@j1}Pug>U3F}=6Cvh|#eGskQ zqhk)p8RO`}rZVOL!t7-M*AeDptWU*a7#WC(zG*BOZni$64+X3N=KV5e)HYhsz@i6A zDqT+adk*7`nDRf4?mVoCv-=zPJu}&p2?+!U5HKuaSk$nGtxniPL=1=&5j7xaM5F;x z5v`p`*i_W0s8Oj6ii%1#T2yMWod7B-Xk3d*Yf!4V)JCf<^|9rh-}`^yx**Bi%Q@%s zMGb8OCVr0!Y%=kuS;2k7kAGV@k5n*M%6oyM&(!E0Gx(b8J!0nyP5j3g<&sh`2=AV> z^&ZI+YI(oe(SYkm}*SGCFm@<@2{M%MuvH2?}6~`tup6muaz~Q>d zRcNBWqJUR(e!PHl+swZybrE9di1jCn6~trcBf$?UGg#op^Zx`kZQd45pjSu`s^+(= z0FT#m7=!p2@3oB*vw3uq^Vr6_tGYVT%3b^d#A49Bbr*Z&Jr}R@o~h4w&&`uM-*aV)E9K=k~vEb=3+W#rpwwn(g@g5j} zAI{%t11dBByd13ko;N-y2T6vT&SG#!z5BNiJ_T`{kx;4%>S~`f4O2ccF(Dgt%@G>3 zayJacDrtwG*#WBJAEhcC_C2>q9@h%e4Tdu zub^blk4zuTAg+mBK!WSjk!fJ-xfd9n=@x5-sttVZUPO*TZy@OUovEJoSmn<^ zW#H4%=y?f+#pL6@Jg7pAK9!=y*4w{JDeIemTLlRP)F%jfV(j9XdE>V*;=Y}WXgQDM z)|Ja!f|Xu97>e2lTQGju9CTLce!d;~^d+xbz`3QqB~lc(_|1<;DY)5b5$K!2);^tHH;1L0bucf_^GPA#>L<#f? z_ABLMOTp6@-<}Upc}9#7&Svnk8AYc`(*zT441zqIpJWH2CUBw>IN)#;22Yc3+jzT@ z4d|s?+8;eR#$Lz>KlD8cX!qntE#!-86(dcB{H8<^QvW{x*Lx~}QnODd5Q_`?k5az> zPvkcfTh=}4DG7;9Pd9DgKqmT2Ee)G8Qih`r>J>RAW*$a!l`@~H=|~dvvyCyJ<&Iyp z^5RW=6#y0kN;juL>gW4Z;I8S(VG_+<&Zo}g_XNC2j{l5Yd`3C&(@{Fx%6&+po9tjZ zp5-u$zwOx2qr9gmc>^Nhh4K7}0_YyeWvlq-0mw1%i?vxh{^R{S#7lh)MpPVBz&P^? znnroTJflr;w{6|aKTo20^7mO$q|n5-wn$yL+RlEnAhe?GTdoYrI@!Wqoc_WKo`5$QY6E@5}zu`Zi(WddPB zOYGsL%Rh%C8?U~)^jczYa;?5~M+9BDbuixX{TUbU%Y0_b?Q#=1`7^%wc}DS}NYd?e z*4+`~e(fud6LWeyXjRXGiyKkfNYbkhGu>+{E(C8_DQACubkTeNiG7j5AZR6AY2dn~ zEi}VB`-LyabBp)w9oZ+pMjV8F?q5wgKcOFb-c&KZ`^AfziVf?CLyIo6leaO$Gp7U2 zId+}G+J5>75n7U_-nRr+9Qk_TzJTXUUU%wI9)E)o+qr5<`gFEqZX3RDp}U}^v7+u) z`cB4s)ug?B@1BtRmWC7EP<($hTywBYi@C0+N#uP+6u*R&9c^8Bd!a|QZcs@NvD#U z=o6-hR_vHTa-t3dOy4e-$QWN|nOo|h==+(4P|5CPCMKgb)1PQD`<%;Nye&C$Uh%eB z=>Za%s@DxVkXZwtYd2kP^O6cK?^`y0JUY~^r1jV{w~2W{$?l%1CYxwkTfs9HKg$$# zy0_HV-<`2~6x*pe;=P3FF4y+Bx&8)*8IBu{rR+tQ#HQ78jw5Lfyvk7rPtP>zKpVfo z;CxpsH!OAġ-5*^{XiBT4iylr8-^ho{c!`q+jalDqxKT}D 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 B<}3gJ literal 0 HcmV?d00001 From 1e8e96b8a288ce39fa0b2a6d63e2762385c92af1 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 20 Nov 2024 22:11:32 +0300 Subject: [PATCH 172/246] 2.4.19 --- CHANGELOG.md | 4 ++++ libexec/pyenv---version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1377320a..069daa0e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Version History +## Release v2.4.19 +* Add CPython 3.14.0a2 by @nedbat in https://github.com/pyenv/pyenv/pull/3110 +* Add quick start section and gif demo to accompany it. by @madhu-GG in https://github.com/pyenv/pyenv/pull/3044 + ## Release v2.4.18 * Add miniforge3-24.9.2-0 by @goerz in https://github.com/pyenv/pyenv/pull/3106 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index f0cba5f4..3f9f74bd 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.18" +version="2.4.19" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 61c0f25ef5f2cb459ab6fa2a73f138eb6e23c643 Mon Sep 17 00:00:00 2001 From: Noelle Leigh <5957867+noelleleigh@users.noreply.github.com> Date: Sat, 23 Nov 2024 08:35:06 -0500 Subject: [PATCH 173/246] README: Fix Markdown in "Notes about python releases" (#3112) HTML and Markdown need to be separated by an empty line to co-exist, otherwise the Markdown isn't parsed correctly. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 115fe2fb..5a99f1e4 100644 --- a/README.md +++ b/README.md @@ -310,6 +310,7 @@ Running `pyenv install -l` gives the list of all available versions. ----

Notes about python releases + **NOTE:** Most Pyenv-provided Python releases are source releases and are built from source as part of installation (that's why you need Python build dependencies preinstalled). You can pass options to Python's `configure` and compiler flags to customize the build, From 6140619301ec4d413117bd7e29121785e08443e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Vannicatte?= Date: Wed, 27 Nov 2024 21:30:12 +0100 Subject: [PATCH 174/246] README: correct link to shell setup instructions (#3113) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5a99f1e4..8c5336df 100644 --- a/README.md +++ b/README.md @@ -129,7 +129,7 @@ The options from the [Linux section above](#linuxunix) also work but Homebrew is brew install pyenv --head ``` 3. Then follow the rest of the post-installation steps, starting with - [Set up your shell environment for Pyenv](#set-up-your-shell-environment-for-pyenv). + [Set up your shell environment for Pyenv](#b-set-up-your-shell-environment-for-pyenv). 4. OPTIONAL. To fix `brew doctor`'s warning _""config" scripts exist outside your system or Homebrew directories"_ From a7a0354da95a9a1e95211238caf47b2551eaca0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez-Mondrag=C3=B3n?= Date: Tue, 3 Dec 2024 16:07:13 -0600 Subject: [PATCH 175/246] Add CPython 3.9.21, 3.10.16, 3.11.11, 3.12.8 and 3.13.1 --- plugins/python-build/share/python-build/3.10.16 | 9 +++++++++ plugins/python-build/share/python-build/3.11.11 | 10 ++++++++++ plugins/python-build/share/python-build/3.12.8 | 9 +++++++++ plugins/python-build/share/python-build/3.13.1 | 9 +++++++++ plugins/python-build/share/python-build/3.9.21 | 12 ++++++++++++ 5 files changed, 49 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.10.16 create mode 100644 plugins/python-build/share/python-build/3.11.11 create mode 100644 plugins/python-build/share/python-build/3.12.8 create mode 100644 plugins/python-build/share/python-build/3.13.1 create mode 100644 plugins/python-build/share/python-build/3.9.21 diff --git a/plugins/python-build/share/python-build/3.10.16 b/plugins/python-build/share/python-build/3.10.16 new file mode 100644 index 00000000..c5b61f46 --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.16 @@ -0,0 +1,9 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.16" "https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tar.xz#bfb249609990220491a1b92850a07135ed0831e41738cf681d63cf01b2a8fbd1" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.16" "https://www.python.org/ftp/python/3.10.16/Python-3.10.16.tgz#f2e22ed965a93cfeb642378ed6e6cdbc127682664b24123679f3d013fafe9cd0" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.11 b/plugins/python-build/share/python-build/3.11.11 new file mode 100644 index 00000000..e736fe57 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.11 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.2" "https://openssl.org/source/old/3.2/openssl-3.2.2.tar.gz#197149c18d9e9f292c43f0400acaba12e5f52cacfe050f3d199277ea738ec2e7" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.11" "https://www.python.org/ftp/python/3.11.11/Python-3.11.11.tar.xz#2a9920c7a0cd236de33644ed980a13cbbc21058bfdc528febb6081575ed73be3" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.11" "https://www.python.org/ftp/python/3.11.11/Python-3.11.11.tgz#883bddee3c92fcb91cf9c09c5343196953cbb9ced826213545849693970868ed" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.8 b/plugins/python-build/share/python-build/3.12.8 new file mode 100644 index 00000000..005117f6 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.8 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.8" "https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tar.xz#c909157bb25ec114e5869124cc2a9c4a4d4c1e957ca4ff553f1edc692101154e" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.8" "https://www.python.org/ftp/python/3.12.8/Python-3.12.8.tgz#5978435c479a376648cb02854df3b892ace9ed7d32b1fead652712bee9d03a45" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.1 b/plugins/python-build/share/python-build/3.13.1 new file mode 100644 index 00000000..428b61c5 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.1 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.1" "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tar.xz#9cf9427bee9e2242e3877dd0f6b641c1853ca461f39d6503ce260a59c80bf0d9" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.1" "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tgz#1513925a9f255ef0793dbf2f78bb4533c9f184bdd0ad19763fd7f47a400a7c55" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.9.21 b/plugins/python-build/share/python-build/3.9.21 new file mode 100644 index 00000000..4a317c63 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.21 @@ -0,0 +1,12 @@ +prefer_openssl11 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-1.1.1u" "https://www.openssl.org/source/openssl-1.1.1u.tar.gz#e2f8d84b523eecd06c7be7626830370300fbcc15386bf5142d72758f6963ebc6" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.21" "https://www.python.org/ftp/python/3.9.21/Python-3.9.21.tar.xz#3126f59592c9b0d798584755f2bf7b081fa1ca35ce7a6fea980108d752a05bb1" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.21" "https://www.python.org/ftp/python/3.9.21/Python-3.9.21.tgz#667c3ba2ca98d39ead1162f6548c3475768582e2ff89e0821d25eb956ac09944" standard verify_py39 copy_python_gdb ensurepip +fi From 84037dff4ef705aacebe8ce10e9b6558c032baa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez-Mondrag=C3=B3n?= Date: Tue, 3 Dec 2024 16:11:00 -0600 Subject: [PATCH 176/246] Run `macos_build` on Python 3.13 --- .github/workflows/macos_build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index 6459fabc..f533b9ce 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -15,6 +15,7 @@ jobs: - "3.10" - "3.11" - "3.12" + - "3.13" runs-on: macos-14 steps: - uses: actions/checkout@v4 From a79440470e2d6145676d0c63b80e9d44080ff751 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez-Mondrag=C3=B3n?= Date: Tue, 3 Dec 2024 16:17:03 -0600 Subject: [PATCH 177/246] Run `ubuntu_build` on Python 3.13 --- .github/workflows/ubuntu_build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ubuntu_build.yml b/.github/workflows/ubuntu_build.yml index dd389219..c501c1c1 100644 --- a/.github/workflows/ubuntu_build.yml +++ b/.github/workflows/ubuntu_build.yml @@ -15,6 +15,7 @@ jobs: - "3.10" - "3.11" - "3.12" + - "3.13" runs-on: ubuntu-22.04 steps: - uses: actions/checkout@v4 From 81632f0ab44e73b354da327ab8f8bfeb6a98b8a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez-Mondrag=C3=B3n?= Date: Tue, 3 Dec 2024 16:25:19 -0600 Subject: [PATCH 178/246] Remove EOL Python 3.8 from CI --- .github/workflows/macos_build.yml | 1 - .github/workflows/ubuntu_build.yml | 1 - 2 files changed, 2 deletions(-) diff --git a/.github/workflows/macos_build.yml b/.github/workflows/macos_build.yml index f533b9ce..fdd424bb 100644 --- a/.github/workflows/macos_build.yml +++ b/.github/workflows/macos_build.yml @@ -10,7 +10,6 @@ jobs: fail-fast: false matrix: python-version: - - "3.8" - "3.9" - "3.10" - "3.11" diff --git a/.github/workflows/ubuntu_build.yml b/.github/workflows/ubuntu_build.yml index c501c1c1..71c23dff 100644 --- a/.github/workflows/ubuntu_build.yml +++ b/.github/workflows/ubuntu_build.yml @@ -10,7 +10,6 @@ jobs: fail-fast: false matrix: python-version: - - "3.8" - "3.9" - "3.10" - "3.11" From 0f8b2b2b848ea080b0e01a707910c272ec4ce736 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 4 Dec 2024 02:08:51 +0300 Subject: [PATCH 179/246] 2.4.20 --- CHANGELOG.md | 5 +++++ libexec/pyenv---version | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 069daa0e..7be9853f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Version History +## Release v2.4.20 +* README: Fix Markdown in "Notes about python releases" by @noelleleigh in https://github.com/pyenv/pyenv/pull/3112 +* README: correct link to shell setup instructions by @shortcuts in https://github.com/pyenv/pyenv/pull/3113 +* Add CPython 3.9.21, 3.10.16, 3.11.11, 3.12.8 and 3.13.1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3117 + ## Release v2.4.19 * Add CPython 3.14.0a2 by @nedbat in https://github.com/pyenv/pyenv/pull/3110 * Add quick start section and gif demo to accompany it. by @madhu-GG in https://github.com/pyenv/pyenv/pull/3044 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 3f9f74bd..76a26620 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.19" +version="2.4.20" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 3bc0d858cc5311ca0b8b5057fd7013315469baf0 Mon Sep 17 00:00:00 2001 From: Michael Makukha Date: Fri, 6 Dec 2024 00:53:45 +0200 Subject: [PATCH 180/246] Add 3.13.1t (#3120) --- plugins/python-build/share/python-build/3.13.1t | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.13.1t diff --git a/plugins/python-build/share/python-build/3.13.1t b/plugins/python-build/share/python-build/3.13.1t new file mode 100644 index 00000000..005d3c5c --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.1t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.1 From a39449bc50ac1d490913f933a48f80377c5a1d20 Mon Sep 17 00:00:00 2001 From: native-api Date: Fri, 6 Dec 2024 02:55:53 +0300 Subject: [PATCH 181/246] Prefer tcl-tk@8 from Homebrew due to release of Tcl/Tk 9 with which only 3.12+ are compatible (#3118) --- plugins/python-build/bin/python-build | 65 +++++++++++++-------------- plugins/python-build/test/build.bats | 26 +++++------ 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 9aed0957..b7a0698e 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -814,7 +814,7 @@ build_package_standard_build() { if [ "$package_var_name" = "PYTHON" ]; then use_homebrew || true - use_tcltk || true + use_custom_tcltk || use_homebrew_tcltk || true use_homebrew_readline || use_freebsd_pkg || true use_homebrew_ncurses || true if is_mac -ge 1014; then @@ -1671,31 +1671,43 @@ use_xcode_sdk_zlib() { use_homebrew_tcltk() { can_use_homebrew || return 1 - # get the version from the folder that homebrew versions - local tcltk_libdir="$(brew --prefix tcl-tk 2>/dev/null || true)" - if [ -d "$tcltk_libdir" ]; then - echo "python-build: use tcl-tk from homebrew" - if [[ -z "$PYTHON_BUILD_TCLTK_USE_PKGCONFIG" ]]; then - local tcltk_version="$(sh -c '. '"$tcltk_libdir"'/lib/tclConfig.sh; echo $TCL_VERSION')" - package_option python configure --with-tcltk-libs="-L$tcltk_libdir/lib -ltcl$tcltk_version -ltk$tcltk_version" - # In Homebrew Tcl/Tk 8.6.13, headers have been moved to the 'tcl-tk' subdir. - # We're not using tclConfig.sh here 'cuz it produces the version-specific path to /Cellar - # and we'd rather have rpath set to /opt/<...> to allow micro release upgrades without rebuilding - # XXX: do use tclConfig.sh and translate the paths if more path shenanigans appear in later releases - if [ -d "$tcltk_libdir/include/tcl-tk" ]; then - package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include/tcl-tk" - else - package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include" + # Since https://github.com/Homebrew/homebrew-core/commit/f10e88617b41555193c22fdcba6109fe82155ee2 (10.11.2024), + # tcl-tk is 9.0 which is not compatible with CPython as of this writing + # but we'll keep it as backup for cases like non-updated Homebrew + local tcltk + for tcltk in "tcl-tk@8" "tcl-tk"; do + local tcltk_libdir="$(brew --prefix "${tcltk}" 2>/dev/null || true)" + if [ -d "$tcltk_libdir" ]; then + echo "python-build: use tcl-tk from homebrew" + if [[ -z "$PYTHON_BUILD_TCLTK_USE_PKGCONFIG" ]]; then + local tcltk_version="$(sh -c '. '"$tcltk_libdir"'/lib/tclConfig.sh; echo $TCL_VERSION')" + package_option python configure --with-tcltk-libs="-L$tcltk_libdir/lib -ltcl$tcltk_version -ltk$tcltk_version" + # In Homebrew Tcl/Tk 8.6.13, headers have been moved to the 'tcl-tk' subdir. + # We're not using tclConfig.sh here 'cuz it produces the version-specific path to /Cellar + # and we'd rather have rpath set to /opt/<...> to allow micro release upgrades without rebuilding + # XXX: do use tclConfig.sh and translate the paths if more path shenanigans appear in later releases + if [ -d "$tcltk_libdir/include/tcl-tk" ]; then + package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include/tcl-tk" + else + package_option python configure --with-tcltk-includes="-I$tcltk_libdir/include" + fi fi + export PKG_CONFIG_PATH="${tcltk_libdir}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" + return 0 fi - export PKG_CONFIG_PATH="${tcltk_libdir}/lib/pkgconfig${PKG_CONFIG_PATH:+:$PKG_CONFIG_PATH}" - fi + done + return 1 } # FIXME: this function is a workaround for #1125 # once fixed, it should be removed. +# if tcltk_ops_flag is in PYTHON_CONFIGURE_OPTS, use user provided tcltk use_custom_tcltk() { - local tcltk_ops="$1" + local tcltk_ops="$(get_tcltk_flag_from "$PYTHON_CONFIGURE_OPTS")" + + if [[ -z "$tcltk_ops" ]]; then + return 1 + fi local tcltk_ops_flag="--with-tcltk-libs=" # get tcltk libs local tcltk_libs="${tcltk_ops//$tcltk_ops_flag/}" @@ -1738,21 +1750,6 @@ get_tcltk_flag_from() { IFS="$OLDIFS" } -use_tcltk() { - if can_use_homebrew; then - local tcltk_libdir="$(brew --prefix tcl-tk 2>/dev/null || true)" - fi - local tcl_tk_libs="$(get_tcltk_flag_from "$PYTHON_CONFIGURE_OPTS")" - - # if tcltk_ops_flag is in PYTHON_CONFIGURE_OPTS, use user provided tcltk - # otherwise default to homebrew-installed tcl-tk, if installed - if [[ -n "$tcl_tk_libs" ]]; then - use_custom_tcltk "$tcl_tk_libs" - elif [ -d "$tcltk_libdir" ]; then - use_homebrew_tcltk - fi -} - # Since 3.12, CPython can add DWARF debug information in MacOS # using Apple's nonstandard way, `dsymutil', that creates a "dSYM bundle" # that's supposed to be installed alongside executables diff --git a/plugins/python-build/test/build.bats b/plugins/python-build/test/build.bats index 3a1e4e6f..c6984898 100644 --- a/plugins/python-build/test/build.bats +++ b/plugins/python-build/test/build.bats @@ -182,7 +182,7 @@ OUT for i in {1..10}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done stub brew "--prefix libyaml : echo '$brew_libdir'" - for i in {1..5}; do stub brew false; done + for i in {1..6}; do stub brew false; done stub_make_install install_fixture definitions/needs-yaml @@ -208,7 +208,7 @@ OUT mkdir -p "$readline_libdir" for i in {1..8}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done - for i in {1..2}; do stub brew false; done + for i in {1..3}; do stub brew false; done stub brew "--prefix readline : echo '$readline_libdir'" for i in {1..2}; do stub brew false; done stub_make_install @@ -238,7 +238,7 @@ OUT mkdir -p "$ncurses_libdir" for i in {1..9}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done - for i in {1..3}; do stub brew false; done + for i in {1..4}; do stub brew false; done stub brew "--prefix ncurses : echo '$ncurses_libdir'" stub brew false stub_make_install @@ -364,7 +364,7 @@ OUT for i in {1..4}; do stub uname '-s : echo Linux'; done stub brew "--prefix : echo '$BREW_PREFIX'" - for i in {1..4}; do stub brew false; done + for i in {1..5}; do stub brew false; done stub_make_install export PYTHON_BUILD_USE_HOMEBREW=1 @@ -394,7 +394,7 @@ OUT for i in {1..4}; do stub uname '-s : echo Linux'; done stub brew "--prefix : echo '$BREW_PREFIX'" - for i in {1..4}; do stub brew false; done + for i in {1..5}; do stub brew false; done stub_make_install export PYTHON_BUILD_USE_HOMEBREW=1 @@ -453,7 +453,7 @@ OUT for i in {1..8}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done - for i in {1..4}; do stub brew false; done + for i in {1..5}; do stub brew false; done stub_make_install export PYTHON_CONFIGURE_OPTS="CPPFLAGS=-I$readline_libdir/include LDFLAGS=-L$readline_libdir/lib" @@ -482,11 +482,11 @@ OUT mkdir -p "$tcl_tk_libdir/lib" echo "TCL_VERSION='$tcl_tk_version'" >>"$tcl_tk_libdir/lib/tclConfig.sh" - for i in {1..10}; do stub uname '-s : echo Darwin'; done + for i in {1..9}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done stub brew false - for i in {1..2}; do stub brew "--prefix tcl-tk : echo '$tcl_tk_libdir'"; done + stub brew "--prefix tcl-tk@8 : echo '$tcl_tk_libdir'" for i in {1..3}; do stub brew false; done stub_make_install @@ -516,10 +516,10 @@ OUT tcl_tk_version_long="8.6.10" tcl_tk_version="${tcl_tk_version_long%.*}" - for i in {1..9}; do stub uname '-s : echo Darwin'; done + for i in {1..8}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done - for i in {1..5}; do stub brew false; done + for i in {1..4}; do stub brew false; done stub_make_install export PYTHON_CONFIGURE_OPTS="--with-tcltk-libs='-L${TMP}/custom-tcl-tk/lib -ltcl$tcl_tk_version -ltk$tcl_tk_version'" @@ -544,14 +544,14 @@ OUT @test "tcl-tk is linked from Homebrew via pkgconfig only when envvar is set" { cached_tarball "Python-3.6.2" - for i in {1..10}; do stub uname '-s : echo Darwin'; done + for i in {1..9}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done tcl_tk_libdir="$TMP/homebrew-tcl-tk" mkdir -p "$tcl_tk_libdir/lib" stub brew false - for i in {1..2}; do stub brew "--prefix tcl-tk : echo '${tcl_tk_libdir}'"; done + stub brew "--prefix tcl-tk@8 : echo '${tcl_tk_libdir}'" for i in {1..3}; do stub brew false; done stub_make_install @@ -739,7 +739,7 @@ OUT for i in {1..10}; do stub uname '-s : echo Darwin'; done for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done - for i in {1..5}; do stub brew false; done + for i in {1..6}; do stub brew false; done stub_make_install run_inline_definition < Date: Fri, 6 Dec 2024 02:57:27 +0300 Subject: [PATCH 182/246] 2.4.21 --- CHANGELOG.md | 4 ++++ libexec/pyenv---version | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7be9853f..236bec2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Version History +## Release v2.4.21 +* Add CPython 3.13.1t by @makukha in https://github.com/pyenv/pyenv/pull/3120 +* Prefer tcl-tk@8 from Homebrew due to release of Tcl/Tk 9 with which only 3.12+ are compatible by @native-api in https://github.com/pyenv/pyenv/pull/3118 + ## Release v2.4.20 * README: Fix Markdown in "Notes about python releases" by @noelleleigh in https://github.com/pyenv/pyenv/pull/3112 * README: correct link to shell setup instructions by @shortcuts in https://github.com/pyenv/pyenv/pull/3113 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 76a26620..e6c0cb8b 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.20" +version="2.4.21" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 4c90a3147fa382235caaa8beb7c3da0f6d231a39 Mon Sep 17 00:00:00 2001 From: native-api Date: Sat, 7 Dec 2024 13:54:33 +0300 Subject: [PATCH 183/246] Speed up building bundled OpenSSL (#3124) * Skip building bundled OpneSSL unnecessary parts * Remove bundled OpneSSL build hack: no longer needed --- plugins/python-build/bin/python-build | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index b7a0698e..09878df1 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -1594,11 +1594,7 @@ build_package_mac_openssl() { [[ "$1" != openssl-1.0.* ]] || nokerberos=1 # Compile a shared lib with zlib dynamically linked. - package_option openssl configure --openssldir="$OPENSSLDIR" zlib-dynamic no-ssl3 shared ${nokerberos:+no-ssl2 no-krb5} - - # Default MAKE_OPTS are -j 2 which can confuse the build. Thankfully, make - # gives precedence to the last -j option, so we can override that. - package_option openssl make -j 1 + package_option openssl configure --openssldir="$OPENSSLDIR" zlib-dynamic no-ssl3 shared ${nokerberos:+no-ssl2 no-krb5} no-docs no-apps no-tests build_package_standard "$@" From 25e70b2c8002278fb4be72c73c3d1a0a9f39545e Mon Sep 17 00:00:00 2001 From: native-api Date: Sat, 7 Dec 2024 13:58:35 +0300 Subject: [PATCH 184/246] CI: + build with bundled MacOS dependencies (#3123) --- .github/workflows/modified_scripts_build.yml | 61 +++++++++++++++++++ .../scripts/brew-uninstall-cascade.sh | 11 ++++ 2 files changed, 72 insertions(+) create mode 100755 .github/workflows/scripts/brew-uninstall-cascade.sh diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml index 17717274..2d6ae87c 100644 --- a/.github/workflows/modified_scripts_build.yml +++ b/.github/workflows/modified_scripts_build.yml @@ -82,6 +82,67 @@ jobs: pyenv global system rm -f "$(pyenv root)"/shims/* + macos_build_bundled_dependencies: + needs: discover_modified_scripts + if: needs.discover_modified_scripts.outputs.versions != '[""]' + strategy: + fail-fast: false + matrix: + python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} + os: ["macos-13", "macos-14"] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - run: | + #envvars + export PYENV_ROOT="$GITHUB_WORKSPACE" + echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV + echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH + - run: | + #prerequisites + brew install sqlite3 xz zlib + "$GITHUB_WORKSPACE/.github/workflows/scripts/brew-uninstall-cascade.sh" openssl@3 openssl@1.1 readline + if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then + export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 + echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV + pyenv install $PYENV_BOOTSTRAP_VERSION + fi + - run: | + #build + pyenv --debug install ${{ matrix.python-version }} + pyenv global ${{ matrix.python-version }} + # Micropython doesn't support --version + - run: | + #print version + if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then + python -c 'import sys; print(sys.version)' + else + python --version + python -m pip --version + fi + # Micropython doesn't support sys.executable, os.path, older versions even os + - env: + EXPECTED_PYTHON: ${{ matrix.python-version }} + run: | + #check + if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then + [[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1 + python -c 'import sys; assert sys.implementation.name == "micropython"' + else + python -c 'if True: + import os, sys, os.path + correct_dir = os.path.join( + os.environ["PYENV_ROOT"], + "versions", + os.environ["EXPECTED_PYTHON"], + "bin") + assert os.path.dirname(sys.executable) == correct_dir' + fi + # bundled executables in some Anaconda releases cause the post-run step to hang in MacOS + - run: | + pyenv global system + rm -f "$(pyenv root)"/shims/* + ubuntu_build: needs: discover_modified_scripts if: needs.discover_modified_scripts.outputs.versions != '[""]' diff --git a/.github/workflows/scripts/brew-uninstall-cascade.sh b/.github/workflows/scripts/brew-uninstall-cascade.sh new file mode 100755 index 00000000..2a6ba338 --- /dev/null +++ b/.github/workflows/scripts/brew-uninstall-cascade.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +declare -a packages rdepends +packages=("$@") + +# have to try one by one, otherwise `brew uses` would only print +# packages that require them all rather than any of them +for package in "${packages[@]}"; do + rdepends+=($(brew uses --installed --include-build --include-test --include-optional --recursive "$package")) +done +brew uninstall "${packages[@]}" "${rdepends[@]}" \ No newline at end of file From cc40a3f965bafd0cf5bb0d80df2171ce703e822f Mon Sep 17 00:00:00 2001 From: native-api Date: Sat, 7 Dec 2024 14:19:50 +0300 Subject: [PATCH 185/246] CL: + test modified scripts with tar.gz source (#3125) --- .github/workflows/modified_scripts_build.yml | 59 ++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml index 2d6ae87c..e49e9754 100644 --- a/.github/workflows/modified_scripts_build.yml +++ b/.github/workflows/modified_scripts_build.yml @@ -201,3 +201,62 @@ jobs: "bin") assert os.path.dirname(sys.executable) == correct_dir' fi + ubuntu_build_tar_gz: + needs: discover_modified_scripts + if: needs.discover_modified_scripts.outputs.versions != '[""]' + strategy: + fail-fast: false + matrix: + python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} + os: ["ubuntu-20.04", "ubuntu-22.04"] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + - run: | + #envvars + export PYENV_ROOT="$GITHUB_WORKSPACE" + echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV + echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH + echo "_PYTHON_BUILD_FORCE_SKIP_XZ=1" >> $GITHUB_PATH + - run: | + #prerequisites + sudo apt-get update -q; sudo apt-get install -yq make build-essential \ + libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev \ + curl llvm libncurses5-dev libncursesw5-dev \ + xz-utils tk-dev libffi-dev liblzma-dev + if [[ "${{ matrix.python-version }}" =~ pypy.*-(src|dev) ]]; then + export PYENV_BOOTSTRAP_VERSION=pypy2.7-7 + echo "PYENV_BOOTSTRAP_VERSION=$PYENV_BOOTSTRAP_VERSION" >> $GITHUB_ENV + pyenv install $PYENV_BOOTSTRAP_VERSION + fi + - run: | + #build + pyenv install -v ${{ matrix.python-version }} + pyenv global ${{ matrix.python-version }} + # Micropython doesn't support --version + - run: | + #print version + if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then + python -c 'import sys; print(sys.version)' + else + python --version + python -m pip --version + fi + # Micropython doesn't support sys.executable, os.path, older versions even os + - env: + EXPECTED_PYTHON: ${{ matrix.python-version }} + run: | + #check + if [[ "${{ matrix.python-version }}" == "micropython-"* ]]; then + [[ $(pyenv which python) == "${{ env.PYENV_ROOT }}/versions/${{ matrix.python-version }}/bin/python" ]] || exit 1 + python -c 'import sys; assert sys.implementation.name == "micropython"' + else + python -c 'if True: + import os, sys, os.path + correct_dir = os.path.join( + os.environ["PYENV_ROOT"], + "versions", + os.environ["EXPECTED_PYTHON"], + "bin") + assert os.path.dirname(sys.executable) == correct_dir' + fi From 3bdb9bd1e707da2db07a7ffe83313b243d93fbd1 Mon Sep 17 00:00:00 2001 From: Daniel Lamblin Date: Sat, 7 Dec 2024 06:20:33 -0500 Subject: [PATCH 186/246] Fix 404 for bundled openssl-3.4.0 release in 3.13.1 (#3122) --- plugins/python-build/share/python-build/3.13.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/share/python-build/3.13.1 b/plugins/python-build/share/python-build/3.13.1 index 428b61c5..cfeff70f 100644 --- a/plugins/python-build/share/python-build/3.13.1 +++ b/plugins/python-build/share/python-build/3.13.1 @@ -1,6 +1,6 @@ prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl +install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then install_package "Python-3.13.1" "https://www.python.org/ftp/python/3.13.1/Python-3.13.1.tar.xz#9cf9427bee9e2242e3877dd0f6b641c1853ca461f39d6503ce260a59c80bf0d9" standard verify_py313 copy_python_gdb ensurepip From cb831690985b35ba30abe5c8275ac6b45e9ca384 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sat, 7 Dec 2024 14:27:29 +0300 Subject: [PATCH 187/246] fix CL: + test modified scripts with tar.gz source missed some of the changes --- plugins/python-build/bin/python-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 09878df1..16fe6285 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -558,7 +558,7 @@ download_tarball() { } has_tar_xz_support() { - tar Jcf - /dev/null 1>/dev/null 2>&1 + [[ -z $_PYTHON_BUILD_FORCE_SKIP_XZ ]] && tar Jcf - /dev/null 1>/dev/null 2>&1 } fetch_git() { From d04a081dcb18863ca6179070d7b7afe73559581b Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sat, 7 Dec 2024 14:29:09 +0300 Subject: [PATCH 188/246] 2.4.22 --- CHANGELOG.md | 6 ++++++ libexec/pyenv---version | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 236bec2c..2a34c3e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Version History +## Release v2.4.22 +* Speed up building bundled OpenSSL by @native-api in https://github.com/pyenv/pyenv/pull/3124 +* CI: add building modified scripts with bundled MacOS dependencies by @native-api in https://github.com/pyenv/pyenv/pull/3123 +* CL: + test modified scripts with tar.gz source by @native-api in https://github.com/pyenv/pyenv/pull/3125 +* Fix 404 for openssl-3.4.0 release in build 3.13.1 by @dlamblin in https://github.com/pyenv/pyenv/pull/3122 + ## Release v2.4.21 * Add CPython 3.13.1t by @makukha in https://github.com/pyenv/pyenv/pull/3120 * Prefer tcl-tk@8 from Homebrew due to release of Tcl/Tk 9 with which only 3.12+ are compatible by @native-api in https://github.com/pyenv/pyenv/pull/3118 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index e6c0cb8b..1680dac4 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.21" +version="2.4.22" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From a2ad48aa40436adb5475138244a06e8de1d6071b Mon Sep 17 00:00:00 2001 From: Oluf Lorenzen Date: Thu, 12 Dec 2024 04:58:02 +0100 Subject: [PATCH 189/246] README: explain using multiple versions (#3126) Co-authored-by: native-api --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 8c5336df..555eef42 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,7 @@ This project was forked from [rbenv](https://github.com/rbenv/rbenv) and * [Install additional Python versions](#install-additional-python-versions) * [Prefix auto-resolution to the latest version](#prefix-auto-resolution-to-the-latest-version) * [Switch between Python versions](#switch-between-python-versions) + * [Making multiple versions available](#making-multiple-versions-available) * [Uninstall Python versions](#uninstall-python-versions) * [Other operations](#other-operations) * [Upgrading](#upgrading) @@ -389,6 +390,21 @@ for more details on how the selection works and more information on its usage. ---- +#### Making multiple versions available + +You can select multiple Python versions at the same time by specifying multiple arguments. +E.g. if you wish to use the latest installed CPython 3.11 and 3.12: + +~~~bash +pyenv global 3.11 3.12 +~~~ + +Whenever you run a command provided by a Python installation, these versions will be searched for it in the specified order. +Versions selected with `pyenv shell` are searched first, then `pyenv local`, then `pyenv global`. +[Due to the shims' fall-through behavior]((#understanding-python-version-selection)), `system` is always implicitly searched afterwards. + +---- + ### Uninstall Python versions As time goes on, you will accumulate Python versions in your From fc0e27c24bb6e3853e9b7da8f1ff59025edf1e70 Mon Sep 17 00:00:00 2001 From: native-api Date: Fri, 13 Dec 2024 23:06:03 +0300 Subject: [PATCH 190/246] Support PACKAGE_CPPFLAGS and PACKAGE_LDFLAGS (#3130) add test to test all the flag types --- plugins/python-build/README.md | 8 +- plugins/python-build/bin/python-build | 12 ++- plugins/python-build/test/build.bats | 133 ++++++++++++++------------ 3 files changed, 87 insertions(+), 66 deletions(-) diff --git a/plugins/python-build/README.md b/plugins/python-build/README.md index b717512f..e6b7b4f8 100644 --- a/plugins/python-build/README.md +++ b/plugins/python-build/README.md @@ -169,16 +169,14 @@ You can set certain environment variables to control the build process. * `PYTHON_BUILD_DEFINITIONS` can be a list of colon-separated paths that get additionally searched when looking up build definitions. * `CC` sets the path to the C compiler. -* `PYTHON_CFLAGS` lets you pass additional options to the default `CFLAGS`. Use - this to override, for instance, the `-O3` option. * `CONFIGURE_OPTS` lets you pass additional options to `./configure`. * `MAKE` lets you override the command to use for `make`. Useful for specifying GNU make (`gmake`) on some systems. * `MAKE_OPTS` (or `MAKEOPTS`) lets you pass additional options to `make`. * `MAKE_INSTALL_OPTS` lets you pass additional options to `make install`. -* `PYTHON_CONFIGURE_OPTS` and `PYTHON_MAKE_OPTS` and `PYTHON_MAKE_INSTALL_OPTS` allow - you to specify configure and make options for building CPython. These variables - will be passed to Python only, not any dependent packages (e.g. libyaml). +* `_CFLAGS`, `_CPPFLAGS`, `_LDFLAGS` let you pass additional options to `CFLAGS`/`CPPFLAGS`/`LDFLAGS` specifically for building `` (Python itself or a dependency library) from source as part of the build script. `` should be a capitalized name of the package without version (technically, capitalized first argument to `install_package` without version). E.g. for CPython, it's "`PYTHON`", for Readline, "`READLINE`", for PyPy (only applies when building it from source), "`PYPY`". Check the source of the build script you're using if unsure. +* `_CONFIGURE_OPTS`, `_MAKE_OPTS`, `_MAKE_INSTALL_OPTS`, `_MAKE_INSTALL_TARGET` allow + you to specify configure and make options for building `` (same as above). "Make install target" would replace "`install`" in the `make install` invocation. ### Applying patches to Python before compiling diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 16fe6285..34fd0d27 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -811,6 +811,8 @@ build_package_standard_build() { local PACKAGE_MAKE_OPTS="${package_var_name}_MAKE_OPTS" local PACKAGE_MAKE_OPTS_ARRAY="${package_var_name}_MAKE_OPTS_ARRAY[@]" local PACKAGE_CFLAGS="${package_var_name}_CFLAGS" + local PACKAGE_CPPFLAGS="${package_var_name}_CPPFLAGS" + local PACKAGE_LDFLAGS="${package_var_name}_LDFLAGS" if [ "$package_var_name" = "PYTHON" ]; then use_homebrew || true @@ -826,8 +828,14 @@ build_package_standard_build() { use_free_threading || true fi - ( if [ "${CFLAGS+defined}" ] || [ "${!PACKAGE_CFLAGS+defined}" ]; then - export CFLAGS="$CFLAGS ${!PACKAGE_CFLAGS}" + ( if [[ -n "${!PACKAGE_CFLAGS}" ]]; then + export CFLAGS="${CFLAGS:+$CFLAGS }${!PACKAGE_CFLAGS}" + fi + if [[ -n "${!PACKAGE_CPPFLAGS}" ]]; then + export CPPFLAGS="${CPPFLAGS:+$CPPFLAGS }${!PACKAGE_CPPFLAGS}" + fi + if [[ -n "${!PACKAGE_LDFLAGS}" ]]; then + export LDFLAGS="${LDFLAGS:+$LDFLAGS }${!PACKAGE_LDFLAGS}" fi if [ -z "$CC" ] && is_mac -ge 1010; then export CC=clang diff --git a/plugins/python-build/test/build.bats b/plugins/python-build/test/build.bats index c6984898..8e3ce566 100644 --- a/plugins/python-build/test/build.bats +++ b/plugins/python-build/test/build.bats @@ -30,12 +30,12 @@ cached_tarball() { tarball() { local name="$1" local path="$PWD/$name" - local configure="$path/configure" + local configure="$path/${2:-configure}" shift 1 executable "$configure" <> build.log +echo "$name: CFLAGS=\\"\$CFLAGS\\" CPPFLAGS=\\"\$CPPFLAGS\\" LDFLAGS=\\"\$LDFLAGS\\" PKG_CONFIG_PATH=\\"\$PKG_CONFIG_PATH\\"" >> build.log echo "$name: \$@" \${PYTHONOPT:+PYTHONOPT=\$PYTHONOPT} >> build.log OUT @@ -50,7 +50,7 @@ OUT stub_make_install() { stub "$MAKE" \ " : echo \"$MAKE \$@\" >> build.log" \ - "install : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" + "${1:-install} : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" } assert_build_log() { @@ -74,17 +74,60 @@ assert_build_log() { unstub make assert_build_log < Date: Sun, 15 Dec 2024 17:22:51 +0300 Subject: [PATCH 191/246] Adjust suggested shell startup code to support Pyenv with Pyenv-Win in WSL (#3132) There's a complaint that this results in duplicate PATH entries in nested shells, will deal with that separately --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 555eef42..6b51437a 100644 --- a/README.md +++ b/README.md @@ -190,7 +190,7 @@ See [Advanced configuration](#advanced-configuration) for details and more confi ```bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc - echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init -)"' >> ~/.bashrc ``` 3. Then, if you have `~/.profile`, `~/.bash_profile` or `~/.bash_login`, add the commands there as well. @@ -199,7 +199,7 @@ See [Advanced configuration](#advanced-configuration) for details and more confi * to add to `~/.profile`: ``` bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile - echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile + echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile echo 'eval "$(pyenv init -)"' >> ~/.profile ``` * to add to `~/.bash_profile`: From aef6a2a6d04c078d97b3e559b0f821a22066de7e Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 15 Dec 2024 21:20:49 +0300 Subject: [PATCH 192/246] Remove incorrect statement about resolution behavior `shell` does not fall through to `local`, and `local to `global`. --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 6b51437a..5eebb3c4 100644 --- a/README.md +++ b/README.md @@ -400,7 +400,6 @@ pyenv global 3.11 3.12 ~~~ Whenever you run a command provided by a Python installation, these versions will be searched for it in the specified order. -Versions selected with `pyenv shell` are searched first, then `pyenv local`, then `pyenv global`. [Due to the shims' fall-through behavior]((#understanding-python-version-selection)), `system` is always implicitly searched afterwards. ---- From dc873cf5681761ae2950955b8a541514077fb2ca Mon Sep 17 00:00:00 2001 From: native-api Date: Mon, 16 Dec 2024 02:32:45 +0300 Subject: [PATCH 193/246] Support missing versions being present and set in a local .python-version (#3134) Requested in https://github.com/pyenv/pyenv/issues/2680 for deployments with a stock `.pyenv-version` that can use any of a number of Python versions and for compatibility with `uv`. * Support `pyenv local --force` * Support `pyenv-version-file-write --force` * Support `pyenv version-name --force` * Ignore missing versions when searching for executables * Display "commmand not found" even when there are nonexistent versions * exec.bats: replace `python` and `rspec` with something that doesn't exist globally, either in Ubuntu Github CI, `python` exists globally --- COMMANDS.md | 4 ++++ libexec/pyenv-exec | 4 ++-- libexec/pyenv-local | 19 ++++++++++++++++-- libexec/pyenv-version-file-write | 20 +++++++++++++++++-- libexec/pyenv-version-name | 33 ++++++++++++++++++++++++++------ libexec/pyenv-which | 1 - test/exec.bats | 14 ++++++++++---- test/local.bats | 12 ++++++++++++ test/version-file-write.bats | 9 ++++++++- test/version-name.bats | 5 +++++ test/which.bats | 18 ++++++++++++++++- 11 files changed, 120 insertions(+), 19 deletions(-) diff --git a/COMMANDS.md b/COMMANDS.md index 203250d4..1d634471 100644 --- a/COMMANDS.md +++ b/COMMANDS.md @@ -91,6 +91,10 @@ or, if you prefer 3.3.3 over 2.7.6, Python 3.3.3 +You can use the `-f/--force` flag to force setting versions even if some aren't installed. +This is mainly useful in special cases like provisioning scripts. + + ## `pyenv global` Sets the global version of Python to be used in all shells by writing diff --git a/libexec/pyenv-exec b/libexec/pyenv-exec index 251a4f7c..6ed5ac20 100755 --- a/libexec/pyenv-exec +++ b/libexec/pyenv-exec @@ -21,7 +21,7 @@ if [ "$1" = "--complete" ]; then exec pyenv-shims --short fi -PYENV_VERSION="$(pyenv-version-name)" +PYENV_VERSION="$(pyenv-version-name -f)" PYENV_COMMAND="$1" if [ -z "$PYENV_COMMAND" ]; then @@ -29,9 +29,9 @@ if [ -z "$PYENV_COMMAND" ]; then exit 1 fi -export PYENV_VERSION PYENV_COMMAND_PATH="$(pyenv-which "$PYENV_COMMAND")" PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}" +export PYENV_VERSION OLDIFS="$IFS" IFS=$'\n' scripts=(`pyenv-hooks exec`) diff --git a/libexec/pyenv-local b/libexec/pyenv-local index c0389281..a44576a6 100755 --- a/libexec/pyenv-local +++ b/libexec/pyenv-local @@ -2,9 +2,11 @@ # # Summary: Set or show the local application-specific Python version(s) # -# Usage: pyenv local <..> +# Usage: pyenv local [-f|--force] [ [...]] # pyenv local --unset # +# -f/--force Do not verify that the versions being set exist +# # Sets the local application-specific Python version(s) by writing the # version name to a file named `.python-version'. # @@ -36,12 +38,25 @@ if [ "$1" = "--complete" ]; then exec pyenv-versions --bare fi +while [[ $# -gt 0 ]] +do + case "$1" in + -f|--force) + FORCE=1 + shift + ;; + *) + break + ;; + esac +done + versions=("$@") if [ "$versions" = "--unset" ]; then rm -f .python-version elif [ -n "$versions" ]; then - pyenv-version-file-write .python-version "${versions[@]}" + pyenv-version-file-write ${FORCE:+-f }.python-version "${versions[@]}" else if version_file="$(pyenv-version-file "$PWD")"; then IFS=: versions=($(pyenv-version-file-read "$version_file")) diff --git a/libexec/pyenv-version-file-write b/libexec/pyenv-version-file-write index 7095140f..db9e0f3b 100755 --- a/libexec/pyenv-version-file-write +++ b/libexec/pyenv-version-file-write @@ -1,9 +1,25 @@ #!/usr/bin/env bash -# Usage: pyenv version-file-write +# Usage: pyenv version-file-write [-f|--force] [...] +# +# -f/--force Don't verify that the versions exist set -e [ -n "$PYENV_DEBUG" ] && set -x +while [[ $# -gt 0 ]] +do + case "$1" in + -f|--force) + FORCE=1 + shift + ;; + *) + break + ;; + esac +done + + PYENV_VERSION_FILE="$1" shift || true versions=("$@") @@ -14,7 +30,7 @@ if [ -z "$versions" ] || [ -z "$PYENV_VERSION_FILE" ]; then fi # Make sure the specified version is installed. -pyenv-prefix "${versions[@]}" >/dev/null +[[ -z $FORCE ]] && pyenv-prefix "${versions[@]}" >/dev/null # Write the version out to disk. # Create an empty file. Using "rm" might cause a permission error. diff --git a/libexec/pyenv-version-name b/libexec/pyenv-version-name index b3866dbd..f7c57efb 100755 --- a/libexec/pyenv-version-name +++ b/libexec/pyenv-version-name @@ -1,8 +1,25 @@ #!/usr/bin/env bash # Summary: Show the current Python version +# +# -f/--force (Internal) If a version doesn't exist, print it as is rather than produce an error + set -e [ -n "$PYENV_DEBUG" ] && set -x +while [[ $# -gt 0 ]] +do + case "$1" in + -f|--force) + FORCE=1 + shift + ;; + *) + break + ;; + esac +done + + if [ -z "$PYENV_VERSION" ]; then PYENV_VERSION_FILE="$(pyenv-version-file)" PYENV_VERSION="$(pyenv-version-file-read "$PYENV_VERSION_FILE" || true)" @@ -33,16 +50,20 @@ OLDIFS="$IFS" # Remove the explicit 'python-' prefix from versions like 'python-3.12'. normalised_version="${version#python-}" if version_exists "${version}" || [ "$version" = "system" ]; then - versions=("${versions[@]}" "${version}") + versions+=("${version}") elif version_exists "${normalised_version}"; then - versions=("${versions[@]}" "${normalised_version}") + versions+=("${normalised_version}") elif resolved_version="$(pyenv-latest -b "${version}")"; then - versions=("${versions[@]}" "${resolved_version}") + versions+=("${resolved_version}") elif resolved_version="$(pyenv-latest -b "${normalised_version}")"; then - versions=("${versions[@]}" "${resolved_version}") + versions+=("${resolved_version}") else - echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2 - any_not_installed=1 + if [[ -n $FORCE ]]; then + versions+=("${normalised_version}") + else + echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2 + any_not_installed=1 + fi fi done } diff --git a/libexec/pyenv-which b/libexec/pyenv-which index 6f12761e..4f012596 100755 --- a/libexec/pyenv-which +++ b/libexec/pyenv-which @@ -96,7 +96,6 @@ else for version in "${nonexistent_versions[@]}"; do echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2 done - exit 1 fi echo "pyenv: $PYENV_COMMAND: command not found" >&2 diff --git a/test/exec.bats b/test/exec.bats index 56a0f61e..b643d31e 100644 --- a/test/exec.bats +++ b/test/exec.bats @@ -16,16 +16,22 @@ create_executable() { @test "fails with invalid version" { export PYENV_VERSION="3.4" - run pyenv-exec python -V - assert_failure "pyenv: version \`3.4' is not installed (set by PYENV_VERSION environment variable)" + run pyenv-exec nonexistent + assert_failure < .python-version - run pyenv-exec rspec - assert_failure "pyenv: version \`2.7' is not installed (set by $PWD/.python-version)" + run pyenv-exec nonexistent + assert_failure < .python-version mkdir -p "${PYENV_ROOT}/versions/1.2.3" diff --git a/test/version-file-write.bats b/test/version-file-write.bats index aa7100d6..1b62e977 100644 --- a/test/version-file-write.bats +++ b/test/version-file-write.bats @@ -9,7 +9,7 @@ setup() { @test "invocation without 2 arguments prints usage" { run pyenv-version-file-write - assert_failure "Usage: pyenv version-file-write " + assert_failure "Usage: pyenv version-file-write [-f|--force] [...]" run pyenv-version-file-write "one" "" assert_failure } @@ -21,6 +21,13 @@ setup() { assert [ ! -e ".python-version" ] } +@test "setting nonexistent version succeeds with force" { + assert [ ! -e ".python-version" ] + run pyenv-version-file-write --force ".python-version" "2.7.6" + assert_success + assert [ -e ".python-version" ] +} + @test "writes value to arbitrary file" { mkdir -p "${PYENV_ROOT}/versions/2.7.6" assert [ ! -e "my-version" ] diff --git a/test/version-name.bats b/test/version-name.bats index 720f6c86..285794e4 100644 --- a/test/version-name.bats +++ b/test/version-name.bats @@ -73,6 +73,11 @@ SH assert_failure "pyenv: version \`1.2' is not installed (set by PYENV_VERSION environment variable)" } +@test "missing version with --force" { + PYENV_VERSION=1.2 run pyenv-version-name -f + assert_success "1.2" +} + @test "one missing version (second missing)" { create_version "3.5.1" PYENV_VERSION="3.5.1:1.2" run pyenv-version-name diff --git a/test/which.bats b/test/which.bats index e6c4ee69..cdcd24e3 100644 --- a/test/which.bats +++ b/test/which.bats @@ -71,7 +71,16 @@ create_executable() { @test "version not installed" { create_executable "3.4" "py.test" PYENV_VERSION=3.3 run pyenv-which py.test - assert_failure "pyenv: version \`3.3' is not installed (set by PYENV_VERSION environment variable)" + assert_failure < Date: Mon, 16 Dec 2024 21:36:14 +0300 Subject: [PATCH 194/246] Tolerate nonexistent versions from `pyenv-version-name` in `pyenv-which` Addendum to #3134 as per https://github.com/pyenv/pyenv/pull/3134#issuecomment-2545710044 --- libexec/pyenv-which | 2 +- test/which.bats | 15 +++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/libexec/pyenv-which b/libexec/pyenv-which index 4f012596..9ff3ddae 100755 --- a/libexec/pyenv-which +++ b/libexec/pyenv-which @@ -59,7 +59,7 @@ if [ -z "$PYENV_COMMAND" ]; then fi OLDIFS="$IFS" -IFS=: versions=(${PYENV_VERSION:-$(pyenv-version-name)}) +IFS=: versions=(${PYENV_VERSION:-$(pyenv-version-name -f)}) IFS="$OLDIFS" declare -a nonexistent_versions diff --git a/test/which.bats b/test/which.bats index cdcd24e3..6582fddc 100644 --- a/test/which.bats +++ b/test/which.bats @@ -153,6 +153,21 @@ SH assert_success "${PYENV_ROOT}/versions/3.4/bin/python" } +@test "tolerates nonexistent versions from pyenv-version-name" { + mkdir -p "$PYENV_ROOT" + cat > "${PYENV_ROOT}/version" < Date: Wed, 18 Dec 2024 02:11:11 -0500 Subject: [PATCH 195/246] Add CPython 3.14.0a3 (#3135) --- plugins/python-build/share/python-build/3.14.0a2t | 2 -- .../python-build/share/python-build/{3.14.0a2 => 3.14.0a3} | 4 ++-- plugins/python-build/share/python-build/3.14.0a3t | 2 ++ 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.14.0a2t rename plugins/python-build/share/python-build/{3.14.0a2 => 3.14.0a3} (59%) create mode 100644 plugins/python-build/share/python-build/3.14.0a3t diff --git a/plugins/python-build/share/python-build/3.14.0a2t b/plugins/python-build/share/python-build/3.14.0a2t deleted file mode 100644 index c8665017..00000000 --- a/plugins/python-build/share/python-build/3.14.0a2t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a2 diff --git a/plugins/python-build/share/python-build/3.14.0a2 b/plugins/python-build/share/python-build/3.14.0a3 similarity index 59% rename from plugins/python-build/share/python-build/3.14.0a2 rename to plugins/python-build/share/python-build/3.14.0a3 index 4f47a14a..0cf90212 100644 --- a/plugins/python-build/share/python-build/3.14.0a2 +++ b/plugins/python-build/share/python-build/3.14.0a3 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.14.0a2" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a2.tar.xz#2ff9e10147342b3efd69f5cd9cc06ec46250f2a046587599d18e2cac69c05920" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a3" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a3.tar.xz#94349df207456a575a8867c20b4ca434f870e1920dcdcc8fdf797e1af49abe90" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.14.0a2" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a2.tgz#b038eab7823e8a1c0500e3a26c95265656c2b8dd0bfa098aa341e9812be8f89c" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a3" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a3.tgz#6ecc4203d8de18c7295c4cdd012e4a4acff83261f8a99bdf15318af9bb1cc811" standard verify_py313 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.14.0a3t b/plugins/python-build/share/python-build/3.14.0a3t new file mode 100644 index 00000000..c9751142 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0a3t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a3 From a1edb81e8e578ff41fc69ba420d8890dc3a4f931 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 18 Dec 2024 10:13:13 +0300 Subject: [PATCH 196/246] 2.4.23 --- CHANGELOG.md | 7 +++++++ libexec/pyenv---version | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2a34c3e8..c2c28969 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,12 @@ # Version History +## Release v2.4.23 +* README: explain using multiple versions by @Finkregh in https://github.com/pyenv/pyenv/pull/3126 +* Support PACKAGE_CPPFLAGS and PACKAGE_LDFLAGS by @native-api in https://github.com/pyenv/pyenv/pull/3130 +* Adjust suggested shell startup code to support Pyenv with Pyenv-Win in WSL by @native-api in https://github.com/pyenv/pyenv/pull/3132 +* Support nonexistent versions being present and set in a local .python-version by @native-api in https://github.com/pyenv/pyenv/pull/3134 +* Add CPython 3.14.0a3 by @nedbat in https://github.com/pyenv/pyenv/pull/3135 + ## Release v2.4.22 * Speed up building bundled OpenSSL by @native-api in https://github.com/pyenv/pyenv/pull/3124 * CI: add building modified scripts with bundled MacOS dependencies by @native-api in https://github.com/pyenv/pyenv/pull/3123 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 1680dac4..5b0626ad 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.22" +version="2.4.23" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 38421ba6aa809cba8913447297f005f22f5f1fe2 Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Sat, 21 Dec 2024 21:48:25 +0800 Subject: [PATCH 197/246] Add miniconda3-24.11.1-0 (#3138) Co-authored-by: binbjz --- .../python-build/miniconda3-3.10-24.11.1-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-24.11.1-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-24.11.1-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-24.11.1-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.11.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.11.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.11.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.11.1-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.11.1-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.11.1-0 new file mode 100644 index 00000000..3e4721bc --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-Linux-aarch64.sh#70fa20d714ba54114c41990a7222a49bd3c833a0f602bd0e0df507bb2f787035" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-Linux-s390x.sh#c5021ecb894cc7b1bb2d62f2156bdaf3e642235b501998bcc730024b07515c74" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-Linux-x86_64.sh#7a3cdbb78a642b2b6dd0687c9e09824e53330368ab57406e27d88e25c4fe4e40" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-MacOSX-arm64.sh#73d7eb2569e976c6da1946723a3b8bebf0f2aaccef80b28f8eef69fd835572b1" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.11.1-0-MacOSX-x86_64.sh#2f8be5e7beeda8d161be2254d1d1d7e786ca8d11602bd1b7dde1134fcad365fa" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.11.1-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.11.1-0 new file mode 100644 index 00000000..8139f67d --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-aarch64.sh#a8846ade7a5ddd9b6a6546590054d70d1c2cbe4fbe8c79fb70227e8fd93ef9f8" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-s390x.sh#bb499b18dbcbb2d89b22f91fe26fe661f5ed1f1944fdc743560d69cd52a2468f" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-Linux-x86_64.sh#807774bae6cd87132094458217ebf713df436f64779faf9bb4c3d4b6615c1e3a" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-MacOSX-arm64.sh#862af4d7cb257219c6b280848049e09e1aff27acd06d5422359f2249f938e282" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.11.1-0-MacOSX-x86_64.sh#388f669ab95d659b4c97353f756ce93ed2000ec0114edaec9688f8541fa4bcab" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.11.1-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.11.1-0 new file mode 100644 index 00000000..f3c8bd11 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-Linux-aarch64.sh#9180a2f1fab799fd76e9ef914643269dcf5bad9d455623b905b87f5d39ae140f" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-Linux-s390x.sh#105bce6b0137f574147b8fdfd5e3a7d6c92f3ea9fbf3e0de61331ea43586e9af" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-Linux-x86_64.sh#636b209b00b6673471f846581829d4b96b9c3378679925a59a584257c3fef5a3" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-MacOSX-arm64.sh#9d5c5782d24a09075e45f131693d24907d8c45a4e6205c51d4d3a81b72dc5ad7" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.11.1-0-MacOSX-x86_64.sh#71419eaf7f0bc016c41e8e27815609e76f2d6bcfc39426c19ca5e5cf7a2ea36f" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.11.1-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.11.1-0 new file mode 100644 index 00000000..2214c1fc --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.11.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.11.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-Linux-aarch64.sh#35411dc715549d0a95f4814c4f318a3d0addfafc3a25fa7e89e2ba47e8d87b4d" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.11.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-Linux-s390x.sh#c130a7064c5c513c42280ec41a5f8c93aaab522ecd6bd0f2138c8c9f78d4f522" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.11.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-Linux-x86_64.sh#3ea8373098d72140e08aac9217822b047ec094eb457e7f73945af7c6f68bf6f5" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.11.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-MacOSX-arm64.sh#a8a07c4255882de2f132ed2d4cfaa3bdf89370de71ba8cd3914e013f5bffcc68" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.11.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.11.1-0-MacOSX-x86_64.sh#5ca59fa5a4835587ba6ea73169a7e55862771cf9b0618d0549b7b484fe1a2e67" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From c6973391f3c62e537a574517d5e8f098317aa5d6 Mon Sep 17 00:00:00 2001 From: Christian Fredrik Johnsen Date: Sun, 22 Dec 2024 13:23:51 +0100 Subject: [PATCH 198/246] pyenv-init | performance improvements (#3136) * perf: replace a series of if statements with a case block. Add error handling for case where unknown option is provided. Same setup as rbenv-init for reading arguments. * perf, docs: Recommend users to specify the shell for `pyenv init -` Speeds up the startup by about 40% (in local testing, from ~50ms to ~30ms). Reflect this in `pyenv init` hint text. * style: remove unnecessary `root` variable in pyenv-init * style: remove unnecessary variable declarations at the top of file in pyenv-init. * perf: replace `cat <<` calls with `echo` The builtin `echo` is about 100x faster. In tests, saves about 2-3ms. * docs: document the `pyenv init - ` performance boost in the Advanced Configuration section. * style: test_helper.bash: avoid unnecessary ".." in produced PATH * docs: fix a false statement about completions location in the Advanced Configuration section. --- README.md | 28 ++++++----- libexec/pyenv-init | 111 ++++++++++++++++++------------------------ test/init.bats | 11 ++--- test/test_helper.bash | 2 +- 4 files changed, 69 insertions(+), 83 deletions(-) diff --git a/README.md b/README.md index 5eebb3c4..2c3e0763 100644 --- a/README.md +++ b/README.md @@ -191,27 +191,27 @@ See [Advanced configuration](#advanced-configuration) for details and more confi ```bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc - echo 'eval "$(pyenv init -)"' >> ~/.bashrc + echo 'eval "$(pyenv init - bash)"' >> ~/.bashrc ``` - 3. Then, if you have `~/.profile`, `~/.bash_profile` or `~/.bash_login`, add the commands there as well. + 2. Then, if you have `~/.profile`, `~/.bash_profile` or `~/.bash_login`, add the commands there as well. If you have none of these, create a `~/.profile` and add the commands there. * to add to `~/.profile`: ``` bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile - echo 'eval "$(pyenv init -)"' >> ~/.profile + echo 'eval "$(pyenv init - bash)"' >> ~/.profile ``` * to add to `~/.bash_profile`: ```bash echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile - echo 'eval "$(pyenv init -)"' >> ~/.bash_profile + echo 'eval "$(pyenv init - bash)"' >> ~/.bash_profile ``` **Bash warning**: There are some systems where the `BASH_ENV` variable is configured to point to `.bashrc`. On such systems, you should almost certainly put the - `eval "$(pyenv init -)"` line into `.bash_profile`, and **not** into `.bashrc`. Otherwise, you + `eval "$(pyenv init - bash)"` line into `.bash_profile`, and **not** into `.bashrc`. Otherwise, you may observe strange behaviour, such as `pyenv` getting into an infinite loop. See [#264](https://github.com/pyenv/pyenv/issues/264) for details. @@ -224,7 +224,7 @@ See [Advanced configuration](#advanced-configuration) for details and more confi ```zsh echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc - echo 'eval "$(pyenv init -)"' >> ~/.zshrc + echo 'eval "$(pyenv init - zsh)"' >> ~/.zshrc ``` If you wish to get Pyenv in noninteractive login shells as well, also add the commands to `~/.zprofile` or `~/.zlogin`. @@ -248,7 +248,7 @@ See [Advanced configuration](#advanced-configuration) for details and more confi 3. Now, add this to `~/.config/fish/config.fish`: ~~~ fish - pyenv init - | source + pyenv init - fish | source ~~~
@@ -656,23 +656,25 @@ for the environment variables that control Pyenv's behavior. extra commands into your shell. Coming from RVM, some of you might be opposed to this idea. Here's what `eval "$(pyenv init -)"` actually does: +1. **Finds current shell.** + `pyenv init` figures out what shell you are using, as the exact commands of `eval "$(pyenv init -)"` vary depending on shell. Specifying which shell you are using (e.g. `eval "$(pyenv init - bash)"`) is preferred, because it reduces launch time significantly. -1. **Sets up the shims path.** This is what allows Pyenv to intercept +2. **Sets up the shims path.** This is what allows Pyenv to intercept and redirect invocations of `python`, `pip` etc. transparently. It prepends `$(pyenv root)/shims` to your `$PATH`. It also deletes any other instances of `$(pyenv root)/shims` on `PATH` which allows to invoke `eval "$(pyenv init -)"` multiple times without getting duplicate `PATH` entries. -2. **Installs autocompletion.** This is entirely optional but pretty - useful. Sourcing `$(pyenv root)/completions/pyenv.bash` will set that +3. **Installs autocompletion.** This is entirely optional but pretty + useful. Sourcing `/completions/pyenv.bash` will set that up. There are also completions for Zsh and Fish. -3. **Rehashes shims.** From time to time you'll need to rebuild your +4. **Rehashes shims.** From time to time you'll need to rebuild your shim files. Doing this on init makes sure everything is up to date. You can always run `pyenv rehash` manually. -4. **Installs `pyenv` into the current shell as a shell function.** +5. **Installs `pyenv` into the current shell as a shell function.** This bit is also optional, but allows pyenv and plugins to change variables in your current shell. This is required for some commands like `pyenv shell` to work. @@ -681,7 +683,7 @@ opposed to this idea. Here's what `eval "$(pyenv init -)"` actually does: for some reason you need `pyenv` to be a real script rather than a shell function, you can safely skip it. -`eval "$(pyenv init --path)"` only does items 1 and 3. +`eval "$(pyenv init --path)"` only does items 2 and 4. To see exactly what happens under the hood for yourself, run `pyenv init -` or `pyenv init --path`. diff --git a/libexec/pyenv-init b/libexec/pyenv-init index 492360e6..19d3ce1a 100755 --- a/libexec/pyenv-init +++ b/libexec/pyenv-init @@ -20,37 +20,32 @@ if [ "$1" = "--complete" ]; then fi mode="help" -no_rehash="" -no_push_path="" -for args in "$@" -do - if [ "$args" = "-" ]; then - mode="print" - shift - fi - if [ "$args" = "--path" ]; then - mode="path" - shift - fi - - if [ "$args" = "--detect-shell" ]; then - mode="detect-shell" - shift - fi - - if [ "$args" = "--no-push-path" ]; then - no_push_path=1 - shift - fi - - if [ "$args" = "--no-rehash" ]; then - no_rehash=1 - shift - fi +while [ "$#" -gt 0 ]; do + case "$1" in + -) + mode="print" + ;; + --path) + mode="path" + ;; + --detect-shell) + mode="detect-shell" + ;; + --no-push-path) + no_push_path=1 + ;; + --no-rehash) + no_rehash=1 + ;; + *) + shell="$1" + ;; + esac + shift done -shell="$1" +# If shell is not provided, detect it. if [ -z "$shell" ]; then shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)" shell="${shell%% *}" @@ -60,8 +55,6 @@ if [ -z "$shell" ]; then shell="${shell%%-*}" fi -root="${0%/*}/.." - function main() { case "$mode" in "help") @@ -150,7 +143,7 @@ function help_() { echo "# Load pyenv automatically by appending" echo "# the following to ~/.config/fish/config.fish:" echo - echo 'pyenv init - | source' + echo 'pyenv init - fish | source' echo ;; * ) @@ -166,7 +159,7 @@ function help_() { echo echo 'export PYENV_ROOT="$HOME/.pyenv"' echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' - echo 'eval "$(pyenv init -)"' + echo 'eval "$(pyenv init -'$shell')"' ;; esac echo @@ -244,7 +237,7 @@ function print_env() { } function print_completion() { - completion="${root}/completions/pyenv.${shell}" + completion="${0%/*/*}/completions/pyenv.${shell}" if [ -r "$completion" ]; then echo "source '$completion'" fi @@ -260,52 +253,44 @@ function print_shell_function() { commands=(`pyenv-commands --sh`) case "$shell" in fish ) - cat </dev/null" } - @test "setup shell completions" { - root="$(cd $BATS_TEST_DIRNAME/.. && pwd)" + exec_root="$(cd $BATS_TEST_DIRNAME/.. && pwd)" run pyenv-init - bash assert_success - assert_line "source '${root}/test/../libexec/../completions/pyenv.bash'" + assert_line "source '${exec_root}/completions/pyenv.bash'" } @test "detect parent shell" { @@ -63,16 +62,16 @@ OUT } @test "setup shell completions (fish)" { - root="$(cd $BATS_TEST_DIRNAME/.. && pwd)" + exec_root="$(cd $BATS_TEST_DIRNAME/.. && pwd)" run pyenv-init - fish assert_success - assert_line "source '${root}/test/../libexec/../completions/pyenv.fish'" + assert_line "source '${exec_root}/completions/pyenv.fish'" } @test "fish instructions" { run pyenv-init fish assert [ "$status" -eq 1 ] - assert_line 'pyenv init - | source' + assert_line 'pyenv init - fish | source' } @test "shell detection for installer" { diff --git a/test/test_helper.bash b/test/test_helper.bash index 4e32df30..51dcd83d 100644 --- a/test/test_helper.bash +++ b/test/test_helper.bash @@ -21,7 +21,7 @@ if [ -z "$PYENV_TEST_DIR" ]; then PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin PATH="${PYENV_TEST_DIR}/bin:$PATH" - PATH="${BATS_TEST_DIRNAME}/../libexec:$PATH" + PATH="${BATS_TEST_DIRNAME%/*}/libexec:$PATH" PATH="${BATS_TEST_DIRNAME}/libexec:$PATH" PATH="${PYENV_ROOT}/shims:$PATH" export PATH From 25c966eb4fd946b0a31eb92575ced3038ab0f385 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 22 Dec 2024 15:59:52 +0300 Subject: [PATCH 199/246] add_miniconda.py: future-proof, update defaults, change -v * future-proof PyVersion * fix handling "-latest" * Update default versions * change -v argument to bool --- plugins/python-build/scripts/add_miniconda.py | 75 ++++++++++++------- 1 file changed, 46 insertions(+), 29 deletions(-) diff --git a/plugins/python-build/scripts/add_miniconda.py b/plugins/python-build/scripts/add_miniconda.py index 3ecb80d6..32b191f8 100755 --- a/plugins/python-build/scripts/add_miniconda.py +++ b/plugins/python-build/scripts/add_miniconda.py @@ -11,15 +11,18 @@ Also ignores sub-patch releases if that major.minor.patch already exists, but otherwise, takes the latest sub-patch release for given OS/arch. Assumes all miniconda3 releases < 4.7 default to python 3.6, and anything else 3.7. """ +import logging +import re +import string +import sys import textwrap from argparse import ArgumentParser from collections import defaultdict +from dataclasses import dataclass from enum import Enum from functools import total_ordering from pathlib import Path from typing import NamedTuple, List, Optional, DefaultDict, Dict -import logging -import string import requests_html @@ -90,7 +93,7 @@ class Flavor(StrEnum): ANACONDA = "anaconda" MINICONDA = "miniconda" - + class TFlavor(StrEnum): ANACONDA = "Anaconda" MINICONDA = "Miniconda" @@ -102,21 +105,37 @@ class Suffix(StrEnum): NONE = "" -class PyVersion(StrEnum): - PY27 = "py27" - PY36 = "py36" - PY37 = "py37" - PY38 = "py38" - PY39 = "py39" - PY310 = "py310" - PY311 = "py311" +PyVersion = None +class PyVersionMeta(type): + def __getattr__(self, name): + """Generate PyVersion.PYXXX on demand to future-proof it""" + if PyVersion is not None: + return PyVersion(name.lower()) + return super(PyVersionMeta,self).__getattr__(self, name) + + +@dataclass(frozen=True) +class PyVersion(metaclass=PyVersionMeta): + major: str + minor: str + + def __init__(self, value): + (major, minor) = re.match(r"py(\d)(\d+)", value).groups() + object.__setattr__(self, "major", major) + object.__setattr__(self, "minor", minor) + + @property + def value(self): + return f"py{self.major}{self.minor}" def version(self): - first, *others = self.value[2:] - return f"{first}.{''.join(others)}" + return f"{self.major}.{self.minor}" def version_info(self): - return tuple(int(n) for n in self.version().split(".")) + return (self.major, self.minor) + + def __str__(self): + return self.value @total_ordering @@ -190,10 +209,15 @@ class CondaVersion(NamedTuple): # https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-python.html if v < (4, 7): return PyVersion.PY36 - else: + if v < (4, 8): return PyVersion.PY37 + else: + # since 4.8, Miniconda specifies versions explicitly in the file name + return None if self.flavor == "anaconda": # https://docs.anaconda.com/free/anaconda/reference/release-notes/ + if v >= (2024,6): + return PyVersion.PY312 if v >= (2023,7): return PyVersion.PY311 if v >= (2023,3): @@ -247,7 +271,7 @@ class CondaSpec(NamedTuple): md5, repo, ) - if py_version is None: + if py_version is None and py_ver is None and ver != "latest": spec = spec.with_py_version(spec.version.default_py_version()) return spec @@ -296,8 +320,8 @@ def get_existing_condas(name): if v.version_str != "latest": logger.debug("Found existing %(name)s version %(v)s", locals()) yield v - except ValueError: - logger.error("Unable to parse existing version %s", entry_name) + except ValueError as e: + logger.error("Unable to parse existing version %s: %s", entry_name, e) def get_available_condas(name, repo): @@ -348,19 +372,12 @@ if __name__ == "__main__": help="Do not write scripts, just report them to stdout", ) parser.add_argument( - "-v", "--verbose", action="count", default=0, + "-v", "--verbose", action="store_true", default=0, help="Increase verbosity of logging", ) parsed = parser.parse_args() - log_level = { - 0: logging.WARNING, - 1: logging.INFO, - 2: logging.DEBUG, - }.get(parsed.verbose, logging.DEBUG) - logging.basicConfig(level=log_level) - if parsed.verbose < 3: - logging.getLogger("requests").setLevel(logging.WARNING) + logging.basicConfig(level=logging.DEBUG if parsed.verbose else logging.INFO) existing_versions = set() available_specs = set() @@ -377,7 +394,7 @@ if __name__ == "__main__": for s in sorted(available_specs, key=key_fn): key = s.version vv = key.version_str.info() - + reason = None if key in existing_versions: reason = "already exists" @@ -385,7 +402,7 @@ if __name__ == "__main__": reason = "too old" elif len(key.version_str.info()) >= 4 and "-" not in key.version_str: reason = "ignoring hotfix releases" - + if reason: logger.debug("Ignoring version %(s)s (%(reason)s)", locals()) continue From ac2f882aab521583417e1fc665da8eaf1c97782b Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 22 Dec 2024 16:19:59 +0300 Subject: [PATCH 200/246] Fix scripts not getting a Python version for `verify_pyXXX` --- plugins/python-build/scripts/add_miniconda.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/python-build/scripts/add_miniconda.py b/plugins/python-build/scripts/add_miniconda.py index 32b191f8..db2acc6b 100755 --- a/plugins/python-build/scripts/add_miniconda.py +++ b/plugins/python-build/scripts/add_miniconda.py @@ -213,7 +213,7 @@ class CondaVersion(NamedTuple): return PyVersion.PY37 else: # since 4.8, Miniconda specifies versions explicitly in the file name - return None + raise ValueError("Miniconda 4.8+ is supposed to specify a Python version explicitly") if self.flavor == "anaconda": # https://docs.anaconda.com/free/anaconda/reference/release-notes/ if v >= (2024,6): @@ -270,6 +270,7 @@ class CondaSpec(NamedTuple): SupportedArch(arch), md5, repo, + py_ver ) if py_version is None and py_ver is None and ver != "latest": spec = spec.with_py_version(spec.version.default_py_version()) From 51937ccc1974af1caca3774b55f5214ffe6e6796 Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 22 Dec 2024 17:04:32 +0300 Subject: [PATCH 201/246] Add miniconda3-24.3.0-0 (#3139) --- .../python-build/miniconda3-3.10-24.3.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-24.3.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-24.3.0-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-24.3.0-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-24.3.0-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-24.3.0-0 b/plugins/python-build/share/python-build/miniconda3-3.10-24.3.0-0 new file mode 100644 index 00000000..746f696a --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-aarch64.sh#cacbd0c4b829dae73ddbcee6b30674dc7aa20bf6dea720929fb01d4b6279f743" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-s390x.sh#fb0f113b0ad2eb9a05b017f49d4a27960ff9ec3d8ec0b580b79efb8c84d15d8e" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-Linux-x86_64.sh#def595b1b182749df0974cddb5c8befe70664ace16403d7a7bf54467be5ea48b" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-arm64.sh#ceae63e7c99b4ff33ddb1a9973956d829d4a00d39f1f7c6e2056e0e076059535" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py310_24.3.0-0-MacOSX-x86_64.sh#094c5a94818caf41deba41411876c3cffa918efdf8ada40dc32bcc535d181c78" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-24.3.0-0 b/plugins/python-build/share/python-build/miniconda3-3.11-24.3.0-0 new file mode 100644 index 00000000..973b9402 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-aarch64.sh#49082882752167cdea60e1aeedac7b73136bdfdd63b9bb3aca3c038901544458" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-s390x.sh#8e52dd1300c9462367d303a596a931e6ef8db422c7c79194efa6fdb152c92b61" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-Linux-x86_64.sh#4da8dde69eca0d9bc31420349a204851bfa2a1c87aeb87fe0c05517797edaac4" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-arm64.sh#b7663626fedf8395d3fed78383b08060a13bd6747003bdb2a39220407f55cf65" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py311_24.3.0-0-MacOSX-x86_64.sh#fdd6294aaa0472f7ddeac89deacceec1469e76bd2a16ac11f37b4ab584fe5089" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-24.3.0-0 b/plugins/python-build/share/python-build/miniconda3-3.12-24.3.0-0 new file mode 100644 index 00000000..95880cec --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-aarch64.sh#05f70cbc89b6caf84e22db836f7696a16b617992eb23d6102acf7651eb132365" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-s390x.sh#b601cb8e3ea65a4ed1aecd96d4f3d14aca5b590b2e1ab0ec5c04c825f5c5e439" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-Linux-x86_64.sh#96a44849ff17e960eeb8877ecd9055246381c4d4f2d031263b63fa7e2e930af1" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-arm64.sh#72d4e9198a6884c0bd86cce2b4a3e8abb05415776e3b142c4b1de625bbaf4c50" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py312_24.3.0-0-MacOSX-x86_64.sh#fd71a4bf03fbb21d4b4d25245f17bef6308dfec478e901a60594dfa02e4605eb" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-24.3.0-0 b/plugins/python-build/share/python-build/miniconda3-3.9-24.3.0-0 new file mode 100644 index 00000000..8e28547a --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_24.3.0-0-Linux-aarch64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-aarch64.sh#860f532a33501cf0eccc2677048e21db4a12151938d181821af3e5d30e2dc390" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_24.3.0-0-Linux-s390x" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-s390x.sh#1570e27adba2dcc24b182c21cd4e793ab5719aa5b1f7f8e29c16ec74d6d9a16f" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_24.3.0-0-Linux-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-Linux-x86_64.sh#1c3d44e987dc56c7d8954419fa1a078be5ddbc293d8cb98b184a23f9a270faad" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_24.3.0-0-MacOSX-arm64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-arm64.sh#f091e4e2d7c2521d40c8c2e561c344a401cf9900e4efa122bf1c93fd6ae5cc9c" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_24.3.0-0-MacOSX-x86_64" "https://repo.anaconda.com/miniconda/Miniconda3-py39_24.3.0-0-MacOSX-x86_64.sh#ed7cfddd313f3ec568f95abae38b337ebf339cddd378ee2f91c86e5da53374e5" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From e0504fc2f88febdc45fdfb82851f672f87e7e797 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 22 Dec 2024 20:43:04 +0300 Subject: [PATCH 202/246] add_miniforge.py: Support different Python version lines, improvements * report more progress * don't download SHA files for unsupported architectures --- plugins/python-build/scripts/add_miniforge.py | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/plugins/python-build/scripts/add_miniforge.py b/plugins/python-build/scripts/add_miniforge.py index bd2c91cf..54f06e08 100755 --- a/plugins/python-build/scripts/add_miniforge.py +++ b/plugins/python-build/scripts/add_miniforge.py @@ -11,7 +11,6 @@ logger = logging.getLogger(__name__) logging.basicConfig(level=os.environ.get('LOGLEVEL', 'INFO')) MINIFORGE_REPO = 'conda-forge/miniforge' -PYTHON_VERSION = '310' DISTRIBUTIONS = ['miniforge', 'mambaforge'] install_script_fmt = """ @@ -38,7 +37,7 @@ here = Path(__file__).resolve() out_dir: Path = here.parent.parent / "share" / "python-build" def download_sha(url): - logger.debug('Downloading SHA file %(url)s', locals()) + logger.info('Downloading SHA file %(url)s', locals()) tup = tuple(reversed(requests.get(url).text.replace('./', '').rstrip().split())) logger.debug('Got %(tup)s', locals()) return tup @@ -56,7 +55,7 @@ def create_spec(filename, sha, url): 'filename': filename, 'sha': sha, 'url': url, - 'py_version': PYTHON_VERSION, + 'py_version': py_version(version), 'flavor': flavor, 'os': os, 'arch': arch, @@ -67,13 +66,29 @@ def create_spec(filename, sha, url): return spec +def py_version(release): + """Suffix for `verify_pyXXX` to call in the generated build script""" + release_line = tuple(int(part) for part in release.split(".")[:2]) + # current version: mentioned under https://github.com/conda-forge/miniforge?tab=readme-ov-file#miniforge3 + # transition points: + # https://github.com/conda-forge/miniforge/blame/main/Miniforge3/construct.yaml + # look for "- python " in non-pypy branch and which tag the commit is first in + if release_line >= (24,5): + # yes, they jumped from 3.10 directly to 3.12 + # https://github.com/conda-forge/miniforge/commit/bddad0baf22b37cfe079e47fd1680fdfb2183590 + return "312" + if release_line >= (4,14): + return "310" + raise ValueError("Bundled Python version unknown for release `%s'"%release) + def supported(filename): return ('pypy' not in filename) and ('Windows' not in filename) def add_version(release): tag_name = release['tag_name'] download_urls = { f['name']: f['browser_download_url'] for f in release['assets'] } - shas = dict([download_sha(url) for (name, url) in download_urls.items() if name.endswith('.sha256') and tag_name in name]) + # can assume that sha files are named similar to release files so can also check supported(on their names) + shas = dict([download_sha(url) for (name, url) in download_urls.items() if name.endswith('.sha256') and supported(os.path.basename(name)) and tag_name in name]) specs = [create_spec(filename, sha, download_urls[filename]) for (filename, sha) in shas.items() if supported(filename)] for distribution in DISTRIBUTIONS: From 5d80be09cb62f269d40cbfd36c7e64bd63168ec5 Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 22 Dec 2024 22:19:24 +0300 Subject: [PATCH 203/246] CI: only run macos_build_bundled_dependencies and ubuntu_build_tar_gz for CPython (#3141) Only CPython scripts use bundled dependencies for MacOS and two alternative tarballs --- .github/workflows/modified_scripts_build.yml | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml index e49e9754..1bef9cbd 100644 --- a/.github/workflows/modified_scripts_build.yml +++ b/.github/workflows/modified_scripts_build.yml @@ -19,9 +19,16 @@ jobs: echo "versions<<$EOF" >> $GITHUB_ENV; echo "$versions" >> $GITHUB_ENV; echo "$EOF" >> $GITHUB_ENV; + + versions_cpython_only=$(grep -Ee '^[[:digit:]]' <<<"$version") + EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64); + echo "versions_cpython_only<<$EOF" >> $GITHUB_ENV; + echo $versions_cpython_only >> $GITHUB_ENV; + echo "$EOF" >> $GITHUB_ENV; - id: modified-versions run: | echo "versions=`echo "${{ env.versions }}" | jq -R . | jq -sc .`" >> $GITHUB_OUTPUT + echo "versions_cpython_only=`echo "${{ env.versions_cpython_only }}" | jq -R . | jq -sc .`" >> $GITHUB_OUTPUT macos_build: needs: discover_modified_scripts if: needs.discover_modified_scripts.outputs.versions != '[""]' @@ -84,11 +91,11 @@ jobs: macos_build_bundled_dependencies: needs: discover_modified_scripts - if: needs.discover_modified_scripts.outputs.versions != '[""]' + if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]' strategy: fail-fast: false matrix: - python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} + python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}} os: ["macos-13", "macos-14"] runs-on: ${{ matrix.os }} steps: @@ -203,11 +210,11 @@ jobs: fi ubuntu_build_tar_gz: needs: discover_modified_scripts - if: needs.discover_modified_scripts.outputs.versions != '[""]' + if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]' strategy: fail-fast: false matrix: - python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} + python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}} os: ["ubuntu-20.04", "ubuntu-22.04"] runs-on: ${{ matrix.os }} steps: From 04b440df0bd51156f00675d82c4e97bd3115959f Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 22 Dec 2024 23:06:33 +0300 Subject: [PATCH 204/246] Add miniforge3 and mambaforge3 24.1.2-0, 24.3.0-0, 24.5.0-0, 24.7.1-0, 24.7.1-1, 24.7.1-2, 24.9.0-0, 24.9.2-0, 24.11.0-0, 24.11.0-1 (#3142) --- .../share/python-build/mambaforge-24.1.2-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-24.11.0-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-24.11.0-1 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-24.3.0-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-24.5.0-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-24.7.1-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-24.7.1-1 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-24.7.1-2 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-24.9.0-0 | 25 +++++++++++++++++++ .../share/python-build/mambaforge-24.9.2-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.1.2-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.11.0-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.11.0-1 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.5.0-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.7.1-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.7.1-1 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.7.1-2 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.9.0-0 | 25 +++++++++++++++++++ 18 files changed, 450 insertions(+) create mode 100644 plugins/python-build/share/python-build/mambaforge-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.11.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.11.0-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.3.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.7.1-1 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.7.1-2 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.9.0-0 create mode 100644 plugins/python-build/share/python-build/mambaforge-24.9.2-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.1.2-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.0-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.5.0-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.7.1-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.7.1-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.7.1-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.9.0-0 diff --git a/plugins/python-build/share/python-build/mambaforge-24.1.2-0 b/plugins/python-build/share/python-build/mambaforge-24.1.2-0 new file mode 100644 index 00000000..902f0c1c --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.1.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-Linux-aarch64.sh#937b2dab9a988d83a4a9e574148d1410204bdb3d137905083570e5a1a0a995e4" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.1.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-Linux-ppc64le.sh#68b28e441171cef9e4da81a1a99264a4b41c4bf99f8c132af9ec38c67fd41694" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.1.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-Linux-x86_64.sh#b172a8d2ff1c452768dd1beffb8d61880dde89f14e855de7e2459963af33828c" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.1.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-MacOSX-arm64.sh#b828ec3189393501d859b001f0dcfdf953140bb9506875ae997eb7ff641f6d19" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.1.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Mambaforge-24.1.2-0-MacOSX-x86_64.sh#3d3f50d7fa16b65ec507c062e6a337ba9c812650c796eb06495930b8cdd5d471" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.11.0-0 b/plugins/python-build/share/python-build/mambaforge-24.11.0-0 new file mode 100644 index 00000000..c490e0ae --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-Linux-aarch64.sh#5816a4a11f08b0caba33c38365f65d81f3659fd73da498a87ab4510a58a9abd5" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-Linux-ppc64le.sh#1d530dd326f9b8e29a8005cba28a239f00c7979337d642cc89531b4755fb69b7" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-Linux-x86_64.sh#ae30935839c9e88458ce0605a251fa3f1ade623e3b9709f859460545577779f1" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-MacOSX-arm64.sh#5535232048d9e2430f165153636bbf781f21128132908e9db455130198c79dc5" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Mambaforge-24.11.0-0-MacOSX-x86_64.sh#f3849b245e724c0d3efde9deb125041b6a78aff69867691e1f7ecff79c40cbd1" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.11.0-1 b/plugins/python-build/share/python-build/mambaforge-24.11.0-1 new file mode 100644 index 00000000..baf39c16 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-Linux-aarch64.sh#7a02a83679a04e164a7ed5a95fe18688032012a4619a2dba6051dada20a437c3" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-Linux-ppc64le.sh#7f985f2dba06a62dcebeaf832ac926ba85707552134b5be310e9a28e869550e1" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-Linux-x86_64.sh#fad8afeb7a0247e8e8fd7a82e9306c694421d2e9b6b341752c73737fbebe4d73" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-MacOSX-arm64.sh#30d47bb61b337d2a2e166cc56923267089a6be526faf9677666af178a0059f0d" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Mambaforge-24.11.0-1-MacOSX-x86_64.sh#2303dcacb52860660e3f290d06e9313acb9e8826bfa6c1ca10972fedc9e3b388" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.3.0-0 b/plugins/python-build/share/python-build/mambaforge-24.3.0-0 new file mode 100644 index 00000000..b9d1a020 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.3.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.3.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-Linux-aarch64.sh#7f2a0282819f1a12bb44628a836b96fe9dfb21a5920fb8331325c47f91bf9a81" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.3.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-Linux-ppc64le.sh#4550d7cb6ea9bb145ae2aae7b02734a642ef24bda0abfc9b1b6d8d6abf0b7749" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.3.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-Linux-x86_64.sh#0be3654cc3b9c43d3aeeeca5efe6d2f31e9f7711702f3818529b367b3db677fb" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.3.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-MacOSX-arm64.sh#de7c7f229d05104de802f1f729a595736b08139c4ae59ba8ba0049050d63c98f" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.3.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.3.0-0/Mambaforge-24.3.0-0-MacOSX-x86_64.sh#5455900cf1298f21333b7c0d1ec159952e1ef5426563cc97eb7e42053d608afc" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.5.0-0 b/plugins/python-build/share/python-build/mambaforge-24.5.0-0 new file mode 100644 index 00000000..c220cb15 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.5.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-Linux-aarch64.sh#a19c4d40dc4aa9084d729f3fbed36fd7a741bb8a0ef4f7df4bc92c5157817ba8" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.5.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-Linux-ppc64le.sh#db6432e76bac0547d65f06e1e0559a0d12147e9020e0cce99c8b07a9c8f2824d" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.5.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-Linux-x86_64.sh#afee51df9c542d2e1bef249ad167197ba90fd4386fd32a63383dc95efba4bdfe" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.5.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-MacOSX-arm64.sh#88514feaad5bf03605242bd4e767829ad9695587ef51621329343d9960771d2b" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.5.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Mambaforge-24.5.0-0-MacOSX-x86_64.sh#1dfb244bce67bc6d9c0900cce2bf9d9feaf66ba60e811b7c98c6e580394d0ccc" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.7.1-0 b/plugins/python-build/share/python-build/mambaforge-24.7.1-0 new file mode 100644 index 00000000..10b1acc1 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.7.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-Linux-aarch64.sh#09221afebba644eabccb5a83a92ba7e1bf88ff17171f80f77f95aa81cad225cc" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.7.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-Linux-ppc64le.sh#1ba05b444bea703097054a25aee2ebb7b04236632791f08f28db82491e005b52" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.7.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-Linux-x86_64.sh#e72ecc1f1b170ee804da298e54ed616ce82543ce84a8b83f63cb0ada2e4bfa50" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.7.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-MacOSX-arm64.sh#204be9ff318a5b23f9466f8bbbf18f7e180c6ed393ffc2a9859d8ab06c474248" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.7.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Mambaforge-24.7.1-0-MacOSX-x86_64.sh#668e69e89e41c5e9bae4431cf4040346eb6e484831577a28795c44039f70798d" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.7.1-1 b/plugins/python-build/share/python-build/mambaforge-24.7.1-1 new file mode 100644 index 00000000..05e22e41 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.7.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.7.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-Linux-aarch64.sh#34ea804e678d71c747d5a7fc99f97ffea395252c8acaf0c66e6dc6812585573b" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.7.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-Linux-ppc64le.sh#3ee3e1d127adeea1950ed1b73ccbc7e4d9f2a25e98f5a18c09e8a3bb8a905d05" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.7.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-Linux-x86_64.sh#7b47af948c8a5d786bc7036eb918ba1254273a820bacd83596316919cd097a14" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.7.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-MacOSX-arm64.sh#5994a2ad9cd40b2c79cc67173b9be42ec04b7b5d65ad17443bd67d68740bc403" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.7.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Mambaforge-24.7.1-1-MacOSX-x86_64.sh#4fc2637e40282562a1139827cf36e98a71dfdd9b3306967210f9d02badf65447" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.7.1-2 b/plugins/python-build/share/python-build/mambaforge-24.7.1-2 new file mode 100644 index 00000000..e5ccb946 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.7.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.7.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-Linux-aarch64.sh#fd99046ef2394198c56df8988f50bbd18967edbc36d7fb29a4814f46ee5ab210" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.7.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-Linux-ppc64le.sh#3a09b99214c47d744c1e80a52de3e26b4a0420463cb50bade04b454af8ace591" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.7.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-Linux-x86_64.sh#4ce9db89d22e3ebd4e5c5d0b745613e25dcef79fba4d67760b09d76f15020d4c" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.7.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-MacOSX-arm64.sh#5920c685a6bedb7d71fe0caafd5fafdb41a664ff6f41ee637fd683e283e4d771" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.7.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Mambaforge-24.7.1-2-MacOSX-x86_64.sh#ec0ec07816a97080443472e052a6777c1e3870a83cadba1254bfa3bc60f65a6c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.9.0-0 b/plugins/python-build/share/python-build/mambaforge-24.9.0-0 new file mode 100644 index 00000000..d93ef1c8 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.9.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-Linux-aarch64.sh#2d83f58793e9e303746747a683833aec5b9178fb1a313a3f9a56df2d319e23a5" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-Linux-ppc64le.sh#cc083e40b1891611b26b0f63b5df3422cb4f8e1a29204f55caea514ead528eb2" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-Linux-x86_64.sh#77fb505f6266ffa1b5d59604cf6ba25948627e908928cbff148813957b1c28af" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-MacOSX-arm64.sh#ceb3dac98c1618f652aed493dc9488155ac7ca2c8abaccd18b93e58034a462c6" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Mambaforge-24.9.0-0-MacOSX-x86_64.sh#046d8eedabafc798c88f3764e71b6ca22728ccbf04806b68450421cb6ebdaae6" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/mambaforge-24.9.2-0 b/plugins/python-build/share/python-build/mambaforge-24.9.2-0 new file mode 100644 index 00000000..25c39a99 --- /dev/null +++ b/plugins/python-build/share/python-build/mambaforge-24.9.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Mambaforge-24.9.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-Linux-aarch64.sh#f142244dd08dc1a7dbb95a48f22e2c0cba01602bc0b6b0425520460d278c2f4d" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Mambaforge-24.9.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-Linux-ppc64le.sh#0c442d49787dea24847690e85744566cc901641b2c0ffd3f4e6579c9c4306a94" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Mambaforge-24.9.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-Linux-x86_64.sh#9e122fbb925a96011b876fcf118d70c55cbe982b6ee001fe23aa8a2600d649d1" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Mambaforge-24.9.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-MacOSX-arm64.sh#85f1c04493513a4552a14ed32b785c0b5484ecfafa827ef413605fd20e5d5cea" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Mambaforge-24.9.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.2-0/Mambaforge-24.9.2-0-MacOSX-x86_64.sh#f845ed82244fe553dc4d1b3a7c134e3c0ede26a84d2d279cfa93bdcb0fc739b0" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Mambaforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.1.2-0 b/plugins/python-build/share/python-build/miniforge3-24.1.2-0 new file mode 100644 index 00000000..30594ac5 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.1.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.1.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-Linux-aarch64.sh#f881e2fa24aa898c25fac3250ccb213e8b892fdd95851f000dce93c419e8f89a" "miniconda" verify_py310 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.1.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-Linux-ppc64le.sh#858b9acbcca1e3f67298a56095f547f2c540d79e1020918cf0d8d6a8af407542" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.1.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-Linux-x86_64.sh#dbadb808edf4da00af35d888d3eeebbfdce71972b60bf4b16dbacaee2ab57f28" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.1.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-MacOSX-arm64.sh#b372d2189e5752e92a4b4bbc4a91b8a08a4f0612d39c0762111c8dd60914b1c7" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.1.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.1.2-0/Miniforge3-24.1.2-0-MacOSX-x86_64.sh#e447e7e0173e94ea8725a4c6675c29bcd3082f8fff7948b47e05af72b12d1261" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.0-0 b/plugins/python-build/share/python-build/miniforge3-24.11.0-0 new file mode 100644 index 00000000..fe4c137d --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-Linux-aarch64.sh#47cfd3caf3a0a6f56ebbfc7da775306fe076b8e49b14d3fd88b5463ab324c185" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-Linux-ppc64le.sh#877e3992041e36f49ce16681e5b24e23617ad044d1a077cf21b5cce90896e244" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-Linux-x86_64.sh#5fa69e4294be07229a94a1c1e8073fbf63894c757c2136f98c87b48f9d458793" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-MacOSX-arm64.sh#3c7c115de0ed6103b7d2e5c1fe969c2c9fd3aec4a454c1d5aa9b5721414413e0" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-0/Miniforge3-24.11.0-0-MacOSX-x86_64.sh#1f0527ec14784de0766d8405a674868e51afb869ea16c915fb2672256209ecfd" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.0-1 b/plugins/python-build/share/python-build/miniforge3-24.11.0-1 new file mode 100644 index 00000000..89dfd50b --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.0-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.0-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-Linux-aarch64.sh#21e5af2d961a19535e1ba8d67d8ce46c522b6e616dea826c6987ff4db8499b73" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.0-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-Linux-ppc64le.sh#20847d0978fbf301da2f9d66ae47dc9da8c080cc1e3f70acb2264e3b6ff99ceb" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.0-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-Linux-x86_64.sh#936836bb2dd546a7ab5999bed2a2d1ce8416c5359e28199df8b384529a85dcac" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.0-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-MacOSX-arm64.sh#6c2ff0b7cf1b6300a3dc6125da8e78407d3ffd3a7359742957fcca0cd7cd7604" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.0-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.0-1/Miniforge3-24.11.0-1-MacOSX-x86_64.sh#5f42fb48c528b2f60a659d0cc19adb74a4098d8a1519ac7fe0724273eae050c5" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.5.0-0 b/plugins/python-build/share/python-build/miniforge3-24.5.0-0 new file mode 100644 index 00000000..7056c6e3 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.5.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.5.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-Linux-aarch64.sh#848f2d6917c473b1091e31a51241a7626d4dac4b90809a9b2ed937e0cea18d87" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.5.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-Linux-ppc64le.sh#1a947af7d68e8a06c2057c9a01ec03a5f7e26133fe42ad531f0a4b898b91dc86" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.5.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-Linux-x86_64.sh#a754b435830e1c038dada434873ad69a99970a4ea17a68d3bbcade0a37c8c8fb" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.5.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-MacOSX-arm64.sh#9c423bb8c9b80709f9682eac9d2a8f5cdecb54601fd4ec1ec6bb98349cf54a92" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.5.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.5.0-0/Miniforge3-24.5.0-0-MacOSX-x86_64.sh#31ad3bbd4114021cdd1bf14a641bcf0f38b4dc71f0931be2720528c2555a587e" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.7.1-0 b/plugins/python-build/share/python-build/miniforge3-24.7.1-0 new file mode 100644 index 00000000..6bd85743 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.7.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.7.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-Linux-aarch64.sh#7a3372268b45679584043b4ba1e0318ee5027384a8d330f2d991b14d815d6a6d" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.7.1-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-Linux-ppc64le.sh#af1015e0531f4ff5e19001c476b720609609401d9cb80fc8a02c5e5d50e02ed5" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.7.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-Linux-x86_64.sh#b64f77042cf8eafd31ced64f9253a74fb85db63545fe167ba5756aea0e8125be" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.7.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-MacOSX-arm64.sh#2de2a2a31964be19ae157b5f93429cb50f8bf3983c580c8b14acefaf3d7e7c5b" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.7.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-0/Miniforge3-24.7.1-0-MacOSX-x86_64.sh#03b73291d46199a40cb694a400010de9d737e6397d3eed676f28828fe2df5025" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.7.1-1 b/plugins/python-build/share/python-build/miniforge3-24.7.1-1 new file mode 100644 index 00000000..58f6294c --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.7.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.7.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-Linux-aarch64.sh#9ed15a4d030928c6e537cb673538803ca5f07adb89957b9cfc24ebdc00ba4bf9" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.7.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-Linux-ppc64le.sh#9b05977d9fdadcc9cd9aeb9199a302139b9a77f708e39e83bfc0b1a1f4a7d4b8" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.7.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-Linux-x86_64.sh#6ae27b78c8cd5ce19987970dc734648ca0bf7ce7a7b3c0e41ab514cfe92add1d" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.7.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-MacOSX-arm64.sh#4effe540ea3abe9b2b5c1dad897f6186f343c4d6c8c234f8a5a4cb544ed14ec9" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.7.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-1/Miniforge3-24.7.1-1-MacOSX-x86_64.sh#8c880fdb3cb80e1a2ebbfd82cc84b2ab7409aa515843423e8aaa77cd08149053" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.7.1-2 b/plugins/python-build/share/python-build/miniforge3-24.7.1-2 new file mode 100644 index 00000000..c3b46604 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.7.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.7.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-Linux-aarch64.sh#7bf60bce50f57af7ea4500b45eeb401d9350011ab34c9c45f736647d8dba9021" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.7.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-Linux-ppc64le.sh#bb5d14dac73b85da8fbe386cdd3c94022a468563a0c55e6b20a58d82b55a9737" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.7.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-Linux-x86_64.sh#636f7faca2d51ee42b4640ce160c751a46d57621ef4bf14378704c87c5db4fe3" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.7.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-MacOSX-arm64.sh#cafa7cc6d7baef6ea292880ae46c6c9d28bc1156394a418ceada30118d8b6b9a" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.7.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.7.1-2/Miniforge3-24.7.1-2-MacOSX-x86_64.sh#ec6150160703ee622e6520863f68c5130473b69558aed822c4e369e90ef42aad" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.9.0-0 b/plugins/python-build/share/python-build/miniforge3-24.9.0-0 new file mode 100644 index 00000000..561e9afd --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.9.0-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.9.0-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-Linux-aarch64.sh#7fae81c0df8545175a647e09b1372dcbf32a1b7fcc194d0d5ffc9a13be4e4269" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.9.0-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-Linux-ppc64le.sh#d442c75fd69359dd8ef444e3ba16a83d88ff437c92669661e2450b0d81575305" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.9.0-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-Linux-x86_64.sh#a75b489adb52effd81d15f0e700c0803992fe6a2357e8eb80685a529df7daa48" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.9.0-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-MacOSX-arm64.sh#ac903e9babc2067add5a6619a1e37bbd4ddb9177ba633ecfa63c8e68df6e1fca" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.9.0-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.9.0-0/Miniforge3-24.9.0-0-MacOSX-x86_64.sh#0b32751fe373819f813490b640c7e83baecf208727fae34a7495d3127f983663" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 2acb2296e505067cf944ab6cd464118c68b01f40 Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 22 Dec 2024 23:10:42 +0300 Subject: [PATCH 205/246] Exclude broken miniforge3/mambaforge3 22.11.0-0, 22.11.0-1, 22.11.0-2 from generation [no ci] (#3143) --- plugins/python-build/scripts/add_miniforge.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/python-build/scripts/add_miniforge.py b/plugins/python-build/scripts/add_miniforge.py index 54f06e08..5612584a 100755 --- a/plugins/python-build/scripts/add_miniforge.py +++ b/plugins/python-build/scripts/add_miniforge.py @@ -13,6 +13,13 @@ logging.basicConfig(level=os.environ.get('LOGLEVEL', 'INFO')) MINIFORGE_REPO = 'conda-forge/miniforge' DISTRIBUTIONS = ['miniforge', 'mambaforge'] +SKIPPED_RELEASES = [ + '4.13.0-0', #has no Mambaforge. We already generated scripts for Miniforge + '22.11.1-0', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403) + '22.11.1-1', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403) + '22.11.1-2', #MacOS packages are broken (have broken dep tarballs, downloading them fails with 403) +] + install_script_fmt = """ case "$(anaconda_architecture 2>/dev/null || true)" in {install_lines} @@ -119,7 +126,7 @@ for release in requests.get(f'https://api.github.com/repos/{MINIFORGE_REPO}/rele # Build scripts for miniforge3-4.13.0-0 have already been generated. # Assuming this was a fluke, we don't yet need to implement proactively checking all releases for contents # or ignoring a release if _any_ of the flavors is already present in Pyenv. - if version == '4.13.0-0': + if version in SKIPPED_RELEASES: continue if any(not list(out_dir.glob(f'{distribution}*-{version}')) for distribution in DISTRIBUTIONS): From 2aff0df76deacd9b6c49de8870f0255d24d3b31b Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 22 Dec 2024 23:22:20 +0300 Subject: [PATCH 206/246] 2.5.0 --- CHANGELOG.md | 8 ++++++++ libexec/pyenv---version | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c2c28969..89e8786e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Version History +## Release v2.5.0 +* `pyenv init -` performance improvements; recommend using `pyenv init - ` by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3136 +* Add miniconda3-24.11.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3138 +* Add miniconda3-24.3.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3139 +* CI: only run macos_build_bundled_dependencies and ubuntu_build_tar_gz for CPython by @native-api in https://github.com/pyenv/pyenv/pull/3141 +* Add miniforge3 and mambaforge3 24.1.2-0, 24.3.0-0, 24.5.0-0, 24.7.1-0, 24.7.1-1, 24.7.1-2, 24.9.0-0, 24.9.2-0, 24.11.0-0, 24.11.0-1 by @native-api in https://github.com/pyenv/pyenv/pull/3142 +* Skip broken miniforge3/mambaforge3 22.11.0-0, 22.11.0-1, 22.11.0-2 in the generation script by @native-api in https://github.com/pyenv/pyenv/pull/3143 + ## Release v2.4.23 * README: explain using multiple versions by @Finkregh in https://github.com/pyenv/pyenv/pull/3126 * Support PACKAGE_CPPFLAGS and PACKAGE_LDFLAGS by @native-api in https://github.com/pyenv/pyenv/pull/3130 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 5b0626ad..5a79601f 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.4.23" +version="2.5.0" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 330e3fc130cd464a012a0b06d8c1ea41447956eb Mon Sep 17 00:00:00 2001 From: native-api Date: Sun, 22 Dec 2024 23:38:58 +0300 Subject: [PATCH 207/246] CI: use Ubuntu 24.04; use ubuntu-latest for the ubuntu_build check (#3144) Now that ubuntu-24 is out of beta at Github Since for ubuntu_build, we only use one OS version and the changes between versions are not as drastic as with MacOS, it seems safe to have it upgrade automatically. --- .github/workflows/modified_scripts_build.yml | 4 ++-- .github/workflows/pyenv_tests.yml | 1 + .github/workflows/ubuntu_build.yml | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml index 1bef9cbd..a9cd75a8 100644 --- a/.github/workflows/modified_scripts_build.yml +++ b/.github/workflows/modified_scripts_build.yml @@ -157,7 +157,7 @@ jobs: fail-fast: false matrix: python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} - os: ["ubuntu-20.04", "ubuntu-22.04"] + os: ["ubuntu-20.04", "ubuntu-22.04", "ubuntu-24.04"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 @@ -215,7 +215,7 @@ jobs: fail-fast: false matrix: python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}} - os: ["ubuntu-20.04", "ubuntu-22.04"] + os: ["ubuntu-20.04", "ubuntu-22.04", "ubuntu-24.04"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/pyenv_tests.yml b/.github/workflows/pyenv_tests.yml index aa8f4959..8cead600 100644 --- a/.github/workflows/pyenv_tests.yml +++ b/.github/workflows/pyenv_tests.yml @@ -10,6 +10,7 @@ jobs: fail-fast: false matrix: os: + - ubuntu-24.04 - ubuntu-22.04 - ubuntu-20.04 - macos-14 diff --git a/.github/workflows/ubuntu_build.yml b/.github/workflows/ubuntu_build.yml index 71c23dff..b8b08e2b 100644 --- a/.github/workflows/ubuntu_build.yml +++ b/.github/workflows/ubuntu_build.yml @@ -15,7 +15,7 @@ jobs: - "3.11" - "3.12" - "3.13" - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # Normally, we would use the superbly maintained... From 4c6b0e9c3b33c0315becb94272841468f71a8f37 Mon Sep 17 00:00:00 2001 From: Christian Fredrik Johnsen Date: Mon, 23 Dec 2024 18:58:54 +0100 Subject: [PATCH 208/246] Fix: mistake in configuration hints in `pyenv init` and manpage. (#3145) --- libexec/pyenv-init | 2 +- man/man1/pyenv.1 | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libexec/pyenv-init b/libexec/pyenv-init index 19d3ce1a..3892ec65 100755 --- a/libexec/pyenv-init +++ b/libexec/pyenv-init @@ -159,7 +159,7 @@ function help_() { echo echo 'export PYENV_ROOT="$HOME/.pyenv"' echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' - echo 'eval "$(pyenv init -'$shell')"' + echo 'eval "$(pyenv init - '$shell')"' ;; esac echo diff --git a/man/man1/pyenv.1 b/man/man1/pyenv.1 index c3d2de1b..106c2574 100644 --- a/man/man1/pyenv.1 +++ b/man/man1/pyenv.1 @@ -14,7 +14,7 @@ pyenv lets you easily switch between multiple versions of Python\. It's simple, .RS 15 .nf if command -v pyenv 1>/dev/null 2>&1; then\n - eval "$(pyenv init -)" \n + eval "$(pyenv init - bash)" \n fi .fi .RE From 850a74c5cd2cac8990008864b94254d6acfcd6c6 Mon Sep 17 00:00:00 2001 From: Jay Bazuzi Date: Sat, 4 Jan 2025 08:43:09 -0800 Subject: [PATCH 209/246] README: Add recommended curl arguments to suggested installer invocation (#3155) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2c3e0763..134341ea 100644 --- a/README.md +++ b/README.md @@ -87,7 +87,7 @@ The Homebrew option from the [MacOS section below](#macos) would also work if yo ##### 1. Automatic installer (Recommended) ```bash -curl https://pyenv.run | bash +curl -fsSL https://pyenv.run | bash ``` For more details visit our other project: From 01732990788b575d665e9f3f257dc32d0031a04c Mon Sep 17 00:00:00 2001 From: native-api Date: Wed, 8 Jan 2025 23:51:11 +0300 Subject: [PATCH 210/246] Add miniforge3-24.11.2-0, miniforge3-24.11.2-1 (#3163) --- .../share/python-build/miniforge3-24.11.2-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.11.2-1 | 25 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.2-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.2-1 diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.2-0 b/plugins/python-build/share/python-build/miniforge3-24.11.2-0 new file mode 100644 index 00000000..4f2acc06 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.2-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.2-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-Linux-aarch64.sh#4f182710a6394f81eda2a6f8578c63d4b52842ad8a9c6b54c7a4cf43513cf118" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.2-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-Linux-ppc64le.sh#6fb5e999d256eeb79c0ce793145966b995b22ff1001ec0fd662be2ba4a4fb538" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.2-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-Linux-x86_64.sh#e6ac45dc94bbc93a31802ed8b74f41b653a132e9f5d4d6b028ae00c5a9c563ba" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.2-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-MacOSX-arm64.sh#f62f38d92e4ae015d82d1aa4aad392747f4e1a61d75deece3a68bdaf472e3ca7" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.2-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-0/Miniforge3-24.11.2-0-MacOSX-x86_64.sh#9dd0058e927986bc53d0685f6ac995267f7d8edbd178b4a47692bf08bfd7b11c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.2-1 b/plugins/python-build/share/python-build/miniforge3-24.11.2-1 new file mode 100644 index 00000000..a355820a --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.2-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.2-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-Linux-aarch64.sh#ef4e191fc6843f343d51b31310d36eacbc1de2899ea233190ff63188ffe30894" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.2-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-Linux-ppc64le.sh#ddda150ca836abaa03e718945687614f9b8fd9694dffd7f3d73d416ba2027e0d" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.2-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-Linux-x86_64.sh#c79c7326a846d6df9ec824e19ccc99454d8f5009e37888df301b23eef11280ca" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.2-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-MacOSX-arm64.sh#8bde418e8f5030b887535940cad3b531adf128a38b99e58ba6a26e68e9d5ad06" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.2-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.2-1/Miniforge3-24.11.2-1-MacOSX-x86_64.sh#50a00997a0f08737d076e93f964dffcb51bc4792fd9371344fd244ab97bcf61c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From e98a0b489f62f22204cbd13fdac03aca79d98623 Mon Sep 17 00:00:00 2001 From: native-api Date: Thu, 9 Jan 2025 02:16:06 +0300 Subject: [PATCH 211/246] Fix "Unsupported options" error building bundled OpenSSL <3.2.0 (#3164) --- plugins/python-build/bin/python-build | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 34fd0d27..f39225f6 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -1600,9 +1600,13 @@ build_package_mac_openssl() { local nokerberos [[ "$1" != openssl-1.0.* ]] || nokerberos=1 + + # switches introduced in OpenSSL 3.2 + local extra_no_features + [[ $(openssl_version $1) -ge 30200 ]] && extra_no_features=1 # Compile a shared lib with zlib dynamically linked. - package_option openssl configure --openssldir="$OPENSSLDIR" zlib-dynamic no-ssl3 shared ${nokerberos:+no-ssl2 no-krb5} no-docs no-apps no-tests + package_option openssl configure --openssldir="$OPENSSLDIR" zlib-dynamic no-ssl3 shared ${nokerberos:+no-ssl2 no-krb5} ${extra_no_features:+no-docs no-apps} no-tests build_package_standard "$@" @@ -1612,6 +1616,16 @@ build_package_mac_openssl() { security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain >> "$pem_file" } +# openssl-1.0.1k -> 10001 +# openssl-3.2.1 -> 30201 +openssl_version() { + local -a ver + IFS=- ver=( ${1:?} ) + IFS=. ver=( ${ver[0]} ) + [[ ${ver[2]} =~ '^([[:digit:]]+)[[:alpha:]]$' ]] && ver[2]="${BASH_REMATCH[1]}" + echo $(( ${ver[0]}*10000 + ${ver[1]}*100 + ${ver[2]} )) +} + # Post-install check that the openssl extension was built. build_package_verify_openssl() { "$RUBY_BIN" -e ' From c9514d8e8ec7db4b24085d697081fc8e243d5e53 Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Sun, 19 Jan 2025 08:22:10 -0500 Subject: [PATCH 212/246] Add CPython 3.14.0a4 (#3168) --- plugins/python-build/share/python-build/3.14.0a3t | 2 -- .../python-build/share/python-build/{3.14.0a3 => 3.14.0a4} | 4 ++-- plugins/python-build/share/python-build/3.14.0a4t | 2 ++ 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.14.0a3t rename plugins/python-build/share/python-build/{3.14.0a3 => 3.14.0a4} (59%) create mode 100644 plugins/python-build/share/python-build/3.14.0a4t diff --git a/plugins/python-build/share/python-build/3.14.0a3t b/plugins/python-build/share/python-build/3.14.0a3t deleted file mode 100644 index c9751142..00000000 --- a/plugins/python-build/share/python-build/3.14.0a3t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a3 diff --git a/plugins/python-build/share/python-build/3.14.0a3 b/plugins/python-build/share/python-build/3.14.0a4 similarity index 59% rename from plugins/python-build/share/python-build/3.14.0a3 rename to plugins/python-build/share/python-build/3.14.0a4 index 0cf90212..93f0fd90 100644 --- a/plugins/python-build/share/python-build/3.14.0a3 +++ b/plugins/python-build/share/python-build/3.14.0a4 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.14.0a3" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a3.tar.xz#94349df207456a575a8867c20b4ca434f870e1920dcdcc8fdf797e1af49abe90" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a4" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a4.tar.xz#c24f07881873c1d460228795ca6ca8c99130e30c773c91463d30d7ea8ff0e70b" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.14.0a3" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a3.tgz#6ecc4203d8de18c7295c4cdd012e4a4acff83261f8a99bdf15318af9bb1cc811" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a4" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a4.tgz#cc9dcee27cc27fc6ef4ff47eb93abf48f158396a70aa67f1504893232911b4e2" standard verify_py313 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.14.0a4t b/plugins/python-build/share/python-build/3.14.0a4t new file mode 100644 index 00000000..235535ac --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0a4t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a4 From 734d6323d8fda6998b0dcd87e8871c8bec189b72 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sun, 19 Jan 2025 17:47:51 +0300 Subject: [PATCH 213/246] 2.5.1 --- CHANGELOG.md | 8 ++++++++ libexec/pyenv---version | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89e8786e..766b346f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Version History +## Release v2.5.1 +* CI: use Ubuntu 24.04; use ubuntu-latest for the ubuntu_build check by @native-api in https://github.com/pyenv/pyenv/pull/3144 +* Fix: mistake in configuration hints in `pyenv init` and manpage by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3145 +* README: Add recommended curl arguments to suggested installer invocation by @JayBazuzi in https://github.com/pyenv/pyenv/pull/3155 +* Add miniforge3-24.11.2-0, miniforge3-24.11.2-1 by @native-api in https://github.com/pyenv/pyenv/pull/3163 +* Fix "Unsupported options" error building bundled OpenSSL <3.2.0 by @native-api in https://github.com/pyenv/pyenv/pull/3164 +* Add CPython 3.14.0a4 by @nedbat in https://github.com/pyenv/pyenv/pull/3168 + ## Release v2.5.0 * `pyenv init -` performance improvements; recommend using `pyenv init - ` by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3136 * Add miniconda3-24.11.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3138 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 5a79601f..77a57795 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.5.0" +version="2.5.1" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 8d93ccae3939cccef5d78bf41ab90e9799e2eaaa Mon Sep 17 00:00:00 2001 From: threadflow <1308665+threadflow@users.noreply.github.com> Date: Sun, 2 Feb 2025 09:50:48 +0800 Subject: [PATCH 214/246] Fix OpenSSL version parsing in python-build script (#3181) --- plugins/python-build/bin/python-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index f39225f6..57635209 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -1621,7 +1621,7 @@ build_package_mac_openssl() { openssl_version() { local -a ver IFS=- ver=( ${1:?} ) - IFS=. ver=( ${ver[0]} ) + IFS=. ver=( ${ver[1]} ) [[ ${ver[2]} =~ '^([[:digit:]]+)[[:alpha:]]$' ]] && ver[2]="${BASH_REMATCH[1]}" echo $(( ${ver[0]}*10000 + ${ver[1]}*100 + ${ver[2]} )) } From 823dd3cef9d53621a5bdbf68f83713e1b15bfc80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20=C5=A0im=C3=A1=C4=8Dek?= Date: Sun, 2 Feb 2025 16:57:19 +0100 Subject: [PATCH 215/246] Add GraalPy 24.1.2 (#3176) --- .../share/python-build/graalpy-24.1.2 | 64 +++++++++++++++++++ .../python-build/graalpy-community-24.1.2 | 54 ++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-24.1.2 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.1.2 diff --git a/plugins/python-build/share/python-build/graalpy-24.1.2 b/plugins/python-build/share/python-build/graalpy-24.1.2 new file mode 100644 index 00000000..21655a67 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.1.2 @@ -0,0 +1,64 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.2' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="859292dddb7deb47280e445afa61aa58326900e15fbf0d3fa8044f1a1ce23594" + ;; +"linux-aarch64" ) + checksum="5ad46ba7ef58f2b3871cb99aa244ef9bf6e6e4206770e027603e3c323ba3e67b" + ;; +"macos-amd64" ) + checksum="e2eed01618ae788b24e01ab423ff27382e15faa1ecb7c8eb7e9809b022c74fe8" + ;; +"macos-aarch64" ) + checksum="daa1fa51129f1bc4e5f0f2251ce7d0e039019eb9569579bb41aaa905407fa6a3" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.1.2 b/plugins/python-build/share/python-build/graalpy-community-24.1.2 new file mode 100644 index 00000000..fccdffc1 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.1.2 @@ -0,0 +1,54 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.1.2' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="d1bf37fb9edf8065e6dab4f351d2006acaff2b2e692cfaea07199380c892ee0c" + ;; +"linux-aarch64" ) + checksum="2568d5f7f3b9d8827de33eb864783c1fed4bc3e729a6fd14e072311c5105346f" + ;; +"macos-amd64" ) + checksum="29f9f19604bf2f7d255add89fa5639d6aab6877799414cb820398fed8ef3d5bb" + ;; +"macos-aarch64" ) + checksum="dcc4fa73cdb866e88c51219ddf9b9689b62633fc8304649372fe8ada4e03957d" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip From 8775ffe76cc965e345fb3a82162050814e96d911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Wed, 5 Feb 2025 10:52:09 -0600 Subject: [PATCH 216/246] Add CPython 3.12.9 and 3.13.2 (#3183) --- plugins/python-build/share/python-build/3.12.9 | 9 +++++++++ plugins/python-build/share/python-build/3.13.2 | 9 +++++++++ plugins/python-build/share/python-build/3.13.2t | 2 ++ 3 files changed, 20 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.12.9 create mode 100644 plugins/python-build/share/python-build/3.13.2 create mode 100644 plugins/python-build/share/python-build/3.13.2t diff --git a/plugins/python-build/share/python-build/3.12.9 b/plugins/python-build/share/python-build/3.12.9 new file mode 100644 index 00000000..58c77022 --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.9 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.9" "https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tar.xz#7220835d9f90b37c006e9842a8dff4580aaca4318674f947302b8d28f3f81112" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.9" "https://www.python.org/ftp/python/3.12.9/Python-3.12.9.tgz#45313e4c5f0e8acdec9580161d565cf5fea578e3eabf25df7cc6355bf4afa1ee" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.2 b/plugins/python-build/share/python-build/3.13.2 new file mode 100644 index 00000000..1df925ce --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.2 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.4.0" "https://github.com/openssl/openssl/releases/download/openssl-3.4.0/openssl-3.4.0.tar.gz#e15dda82fe2fe8139dc2ac21a36d4ca01d5313c75f99f46c4e8a27709b7294bf" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.2" "https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tar.xz#d984bcc57cd67caab26f7def42e523b1c015bbc5dc07836cf4f0b63fa159eb56" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.2" "https://www.python.org/ftp/python/3.13.2/Python-3.13.2.tgz#b8d79530e3b7c96a5cb2d40d431ddb512af4a563e863728d8713039aa50203f9" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.2t b/plugins/python-build/share/python-build/3.13.2t new file mode 100644 index 00000000..af5456b7 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.2t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.2 From b3dad5887e1daef68a73360546082ad4eb4b82b8 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 5 Feb 2025 19:54:06 +0300 Subject: [PATCH 217/246] 2.5.2 --- CHANGELOG.md | 5 +++++ libexec/pyenv---version | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 766b346f..89fd87eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Version History +## Release v2.5.2 +* Fix OpenSSL version parsing in python-build script by @threadflow in https://github.com/pyenv/pyenv/pull/3181 +* Add GraalPy 24.1.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3176 +* Add CPython 3.12.9 and 3.13.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3183 + ## Release v2.5.1 * CI: use Ubuntu 24.04; use ubuntu-latest for the ubuntu_build check by @native-api in https://github.com/pyenv/pyenv/pull/3144 * Fix: mistake in configuration hints in `pyenv init` and manpage by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3145 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 77a57795..8b22b6bd 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.5.1" +version="2.5.2" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From d327702c4de949136e1d351bf3027513de90d1e9 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 5 Feb 2025 20:57:20 +0300 Subject: [PATCH 218/246] Fix OpenSSL 1.x version parsing --- plugins/python-build/bin/python-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 57635209..de698ce4 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -1622,7 +1622,7 @@ openssl_version() { local -a ver IFS=- ver=( ${1:?} ) IFS=. ver=( ${ver[1]} ) - [[ ${ver[2]} =~ '^([[:digit:]]+)[[:alpha:]]$' ]] && ver[2]="${BASH_REMATCH[1]}" + [[ ${ver[2]} =~ ^([[:digit:]]+)[[:alpha:]]$ ]] && ver[2]="${BASH_REMATCH[1]}" echo $(( ${ver[0]}*10000 + ${ver[1]}*100 + ${ver[2]} )) } From 1c7fe36c5528333a4bf14098edd4f6f535d1cee7 Mon Sep 17 00:00:00 2001 From: dand-oss Date: Sat, 8 Feb 2025 09:46:04 +0800 Subject: [PATCH 219/246] Add PyPy v7.3.18 (#3184) Co-authored-by: Dan Dees --- .../share/python-build/pypy2.7-7.3.18 | 77 +++++++++++++++++++ .../share/python-build/pypy2.7-7.3.18-src | 14 ++++ .../share/python-build/pypy3.10-7.3.18 | 77 +++++++++++++++++++ .../share/python-build/pypy3.10-7.3.18-src | 14 ++++ .../share/python-build/pypy3.11-7.3.18 | 77 +++++++++++++++++++ .../share/python-build/pypy3.11-7.3.18-src | 14 ++++ 6 files changed, 273 insertions(+) create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.18 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.18-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.18 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.18-src create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.18 create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.18-src diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.18 b/plugins/python-build/share/python-build/pypy2.7-7.3.18 new file mode 100644 index 00000000..c95bee62 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.18 @@ -0,0 +1,77 @@ +VERSION='7.3.18' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=d647cad5be915df65f44277fd051c8d52e708d22838b5cb21b2de033530acc80 +linux32_hash=54990fb1ae2266c260a7ce694b84ab91a8d0d298da440cd5695ac671dc5615e2 +linux64_hash=1da34354e5fa59400609e94c00ba6feccf5aa575abb26fb6caf9c2ac16100ff4 +osarm64_hash=48927b1931a4feadea945f7c988c429b42e9fb6567af3810ab86ad95efbe98bc +osx64_hash=db9d2bcc8dbe089b34a19083a11116697e8679acc2c47a2862264429810f666e + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.18-src b/plugins/python-build/share/python-build/pypy2.7-7.3.18-src new file mode 100644 index 00000000..792a48f5 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.18-src @@ -0,0 +1,14 @@ +VERSION='7.3.18' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=737435ddfc5afa5b97a7209c87d70d5f1062426c053b9bb8b99a0347cb4891fa + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.18 b/plugins/python-build/share/python-build/pypy3.10-7.3.18 new file mode 100644 index 00000000..81805cbd --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.18 @@ -0,0 +1,77 @@ +VERSION='7.3.18' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=e843aecd48eb06b625af67891b99e3440313cfb64c6851fc37df1e5572c8ef9e +linux32_hash=34ef09a481254aad0f22bf09fd7c99efb65ffef4f79f5b4222505f55f8d9c22e +linux64_hash=834ccd4544bb47112a66977add7e47f30619f74061ae990876bcba95d98c27c5 +osarm64_hash=1d47da22bc9f7b5329f97c9c7b3ee0b051252ff1e82ca76999ad2d44758be41f +osx64_hash=b7031cbf815b7ba26ed2503b76ee3e73d7322b55f3671219019e8385042e212f + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.18-src b/plugins/python-build/share/python-build/pypy3.10-7.3.18-src new file mode 100644 index 00000000..3b041ee1 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.18-src @@ -0,0 +1,14 @@ +VERSION='7.3.18' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=08eb70e866987e4abe88ae9f54a98f919df92b595f7cdf4041703e8802b11552 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.18 b/plugins/python-build/share/python-build/pypy3.11-7.3.18 new file mode 100644 index 00000000..cd4daa8c --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.18 @@ -0,0 +1,77 @@ +VERSION='7.3.18' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +aarch64_hash=95bc3021cb9be2aa766ecb776c215e97ae8c0dda99dd48840b40b5b87d90bc45 +linux32_hash=70357a69cdbf4ce449b5743901fcd36208e0a89eadcfb4d2ebdc9b4711a0612c +linux64_hash=df5fa534800ff09d990e50ca4fdb02d8a06b9ed948dbcb3a09bea0739ef42de7 +osarm64_hash=cc4d6dd621dffd474eb9a2d01e5844d1b6a6f88b404aac2c48a9c267b5370df4 +osx64_hash=4f2274ffb4b787fd5b5f15cd61f7fef5a3710bf0ecbd4293bf0251035b468865 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.18-src b/plugins/python-build/share/python-build/pypy3.11-7.3.18-src new file mode 100644 index 00000000..970fe1cb --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.18-src @@ -0,0 +1,14 @@ +VERSION='7.3.18' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +hash=fbc82b8ff67b942e6fce49980dc0f0f83193b005173f9bddd39d6396fb6b939d + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' From fee60576804ce2b384256e0a99be29f346ec015a Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Tue, 11 Feb 2025 02:41:22 +0800 Subject: [PATCH 220/246] Add Miniconda3 25.1.1 0 (#3190) * Add miniconda3-25.1.1-0 Co-authored-by: binbjz Co-authored-by: binbjz --- .../python-build/miniconda3-3.10-25.1.1-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-25.1.1-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-25.1.1-0 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-25.1.1-0 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-0 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-0 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-0 b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-0 new file mode 100644 index 00000000..edb1093d --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.1.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-Linux-aarch64.sh#d8a975d2194aab5ace390c273c5328be89342b956711c1648d02c87e4c4ffeb1" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_25.1.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-Linux-s390x.sh#087d1cb3708da2a07def69e925731a87b500a9b5befec5e7666422480a5edc67" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.1.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-Linux-x86_64.sh#2346f43213d3e96abca95d0a7df2575d52c66030f2feb90d3d58ed3eabe76aa3" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.1.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-MacOSX-arm64.sh#e52fabc1c331e79cb4a348eea0ac9fc75742609ed5a41370a1e8790a97c13449" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.1.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-0-MacOSX-x86_64.sh#3d9720b16428a924b09f460f942be1f841c28d9ceeff9149051a8f4241745839" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-0 b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-0 new file mode 100644 index 00000000..2234a3da --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.1.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-Linux-aarch64.sh#737f02e2e6c192afbef000f6dba79f4dbbe852193c6890243516ea50d916d31c" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_25.1.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-Linux-s390x.sh#6244e894c56afc095eba0d2c2e88125af1a6a661187b136b8d1abc1392cca8eb" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.1.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-Linux-x86_64.sh#9bc631a7edfc015bbf944d5f48c3852e7c0c83aeae0359b75bee9f402942413a" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.1.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-MacOSX-arm64.sh#0189917c28f8c3a8e9f113532225d4878e6f018d215739ccff92f99750fe7083" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.1.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-0-MacOSX-x86_64.sh#af0d2916b3e3aad814f246a85c48ec9658e2b5f4d1cc7f09246d197fa18169c8" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-0 b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-0 new file mode 100644 index 00000000..caf2cff2 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.1.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-Linux-aarch64.sh#ae9d3ea83df97e78fd51c452d0bc75005a28d504c22db6f1000822293f916b54" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_25.1.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-Linux-s390x.sh#fa0b443ea73c71abd29eb51212c7b032d5089cbb2761aa07f91668b903a2a575" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.1.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-Linux-x86_64.sh#832de27a5a35b7963f0d83466abada3eb138e51985255f190e0dc350427a9dd1" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.1.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-MacOSX-arm64.sh#24821d2c87598ae0f8e697e612cdf41d0dbc9ae563cae8aacd878d50d1a86e1e" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.1.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-0-MacOSX-x86_64.sh#65f91c564abced759ce7fca099239b7ed4ae9835cb4b64a11923cd3b5f57f5f1" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-0 b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-0 new file mode 100644 index 00000000..3b3b24d8 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.1.1-0-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-Linux-aarch64.sh#6813ed27242f8c6a000fcdc0b2bb93253411a22ef110eec915b7d1a4aab3587b" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_25.1.1-0-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-Linux-s390x.sh#8220e1e67cc73a51d90108f5bdf5451aefae0b00d400958ae7d42e21d9a32999" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.1.1-0-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-Linux-x86_64.sh#13a5870ab5b5c75f23a54eac2ba8dbff38bd4bd33d52aecbc6154ca0ff488e10" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.1.1-0-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-MacOSX-arm64.sh#6d60e9a8e0f531e09791f033529a6142ceb39ec7d23f8fc8231d287e39cdb30d" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.1.1-0-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-0-MacOSX-x86_64.sh#3752cbfae31526e53cae1b2976e183787fc98782c63bbd048853ed8860616051" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 519f90a67accd1820fc274f92d8800c0834cc5fe Mon Sep 17 00:00:00 2001 From: native-api Date: Wed, 12 Feb 2025 21:49:27 +0300 Subject: [PATCH 221/246] Add miniforge3-25.1.1-0, miniforge3-24.11.3-0 (#3191) --- .../share/python-build/miniforge3-24.11.3-0 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-25.1.1-0 | 22 ++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.3-0 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.1.1-0 diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.3-0 b/plugins/python-build/share/python-build/miniforge3-24.11.3-0 new file mode 100644 index 00000000..e312c88e --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.3-0 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.3-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-Linux-aarch64.sh#d3f2b771857009ec804faeeef191352186194cb5737a831e55c6347a5f47cb8f" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.3-0-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-Linux-ppc64le.sh#8f8a2eadc773e4c9a3d4587a08b24646e0b2374e0ea0ac538a499303c2527fd2" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.3-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-Linux-x86_64.sh#2e1ad2188fe69fcdd522c2b20c08c800a5c7411b775eca768318b1540ed32e53" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.3-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-MacOSX-arm64.sh#dbead9822b1932ecc1b3238311a843400462b38e302bbd067ef373aa39dedd4f" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.3-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-0/Miniforge3-24.11.3-0-MacOSX-x86_64.sh#1f8e16f2f8e7538c2ef1d08cbb8f2feadc75907e31dbcde75a10ca788fc03abb" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.1.1-0 b/plugins/python-build/share/python-build/miniforge3-25.1.1-0 new file mode 100644 index 00000000..a982bd3c --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.1.1-0 @@ -0,0 +1,22 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.1.1-0-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-Linux-aarch64.sh#4183d312c6a42edd5bc06be21e92b0d8b9afb720efc37df44f3e5002b35f9d2e" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.1.1-0-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-Linux-x86_64.sh#a37495662f55746d92344b309b8b594d6b1a83d7acdd742adaca93ed2e10d32b" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.1.1-0-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-MacOSX-arm64.sh#0f82fec65b7900cbffbda22a1d7a64c278569be241f6f2b87eded9a0f4c54008" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.1.1-0-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-0/Miniforge3-25.1.1-0-MacOSX-x86_64.sh#6b0e0e1901d121292edc52acc948d92a473218c1c4d621df9403805fc19f0dff" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From ddeb3facf05c0a6cdd8728ef7d32f5b5e99e022f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 12 Feb 2025 22:53:37 +0300 Subject: [PATCH 222/246] CI: remove ubuntu-20.04; move tar_gz to -latest ubuntu-20.04 is being retired by Github tar_gz is mainly to verify URLs, OS version doesn't matter --- .github/workflows/modified_scripts_build.yml | 4 ++-- .github/workflows/pyenv_tests.yml | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/modified_scripts_build.yml b/.github/workflows/modified_scripts_build.yml index a9cd75a8..b9e24c71 100644 --- a/.github/workflows/modified_scripts_build.yml +++ b/.github/workflows/modified_scripts_build.yml @@ -157,7 +157,7 @@ jobs: fail-fast: false matrix: python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions)}} - os: ["ubuntu-20.04", "ubuntu-22.04", "ubuntu-24.04"] + os: ["ubuntu-22.04", "ubuntu-24.04"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 @@ -215,7 +215,7 @@ jobs: fail-fast: false matrix: python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}} - os: ["ubuntu-20.04", "ubuntu-22.04", "ubuntu-24.04"] + os: ["ubuntu-latest"] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/pyenv_tests.yml b/.github/workflows/pyenv_tests.yml index 8cead600..dab75608 100644 --- a/.github/workflows/pyenv_tests.yml +++ b/.github/workflows/pyenv_tests.yml @@ -12,7 +12,6 @@ jobs: os: - ubuntu-24.04 - ubuntu-22.04 - - ubuntu-20.04 - macos-14 - macos-13 runs-on: ${{ matrix.os }} From f37a5a80d34ad849395e790c6223bf9659e862dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Wed, 12 Feb 2025 14:02:24 -0600 Subject: [PATCH 223/246] Add CPython 3.14.0a5 (#3194) --- plugins/python-build/share/python-build/3.14.0a4 | 9 --------- plugins/python-build/share/python-build/3.14.0a4t | 2 -- plugins/python-build/share/python-build/3.14.0a5 | 9 +++++++++ plugins/python-build/share/python-build/3.14.0a5t | 2 ++ 4 files changed, 11 insertions(+), 11 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.14.0a4 delete mode 100644 plugins/python-build/share/python-build/3.14.0a4t create mode 100644 plugins/python-build/share/python-build/3.14.0a5 create mode 100644 plugins/python-build/share/python-build/3.14.0a5t diff --git a/plugins/python-build/share/python-build/3.14.0a4 b/plugins/python-build/share/python-build/3.14.0a4 deleted file mode 100644 index 93f0fd90..00000000 --- a/plugins/python-build/share/python-build/3.14.0a4 +++ /dev/null @@ -1,9 +0,0 @@ -prefer_openssl3 -export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 -install_package "openssl-3.3.2" "https://github.com/openssl/openssl/releases/download/openssl-3.3.2/openssl-3.3.2.tar.gz#2e8a40b01979afe8be0bbfb3de5dc1c6709fedb46d6c89c10da114ab5fc3d281" mac_openssl --if has_broken_mac_openssl -install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline -if has_tar_xz_support; then - install_package "Python-3.14.0a4" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a4.tar.xz#c24f07881873c1d460228795ca6ca8c99130e30c773c91463d30d7ea8ff0e70b" standard verify_py313 copy_python_gdb ensurepip -else - install_package "Python-3.14.0a4" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a4.tgz#cc9dcee27cc27fc6ef4ff47eb93abf48f158396a70aa67f1504893232911b4e2" standard verify_py313 copy_python_gdb ensurepip -fi diff --git a/plugins/python-build/share/python-build/3.14.0a4t b/plugins/python-build/share/python-build/3.14.0a4t deleted file mode 100644 index 235535ac..00000000 --- a/plugins/python-build/share/python-build/3.14.0a4t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a4 diff --git a/plugins/python-build/share/python-build/3.14.0a5 b/plugins/python-build/share/python-build/3.14.0a5 new file mode 100644 index 00000000..1765811d --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0a5 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.14.0a5" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a5.tar.xz#e42d91d6dd3016bfc2f6f96c1129b40ca6d8f6e1bf3b30a11de146d930f43b32" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.14.0a5" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a5.tgz#bfbb9b63e072b21c44ae20da14dd8ef14fa8c0cb632d93924d5defd5db2eded3" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.14.0a5t b/plugins/python-build/share/python-build/3.14.0a5t new file mode 100644 index 00000000..d84606a4 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0a5t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a5 From a7de2004eb4f62654134808fe6cc8af081704241 Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Thu, 13 Feb 2025 04:03:05 +0800 Subject: [PATCH 224/246] Add Miniconda3 25.1.1-1 (#3192) Co-authored-by: binbjz Co-authored-by: binbjz --- .../python-build/miniconda3-3.10-25.1.1-1 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-25.1.1-1 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-25.1.1-1 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-25.1.1-1 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-1 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-1 new file mode 100644 index 00000000..5b280376 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.1.1-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-Linux-aarch64.sh#"a72a3247d4c5843bf9ba3e902218ada02e2b75b16260541befd7ac0961077fa9 "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_25.1.1-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-Linux-s390x.sh#072b62a97432048e5ad1e9a987c6739de719192f6c19c79b06d1e05424cd4c35" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.1.1-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-Linux-x86_64.sh#585972959914f1f9be463284d477717eb10f7306bda63f2ec3c4c86047b9dd72" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.1.1-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-MacOSX-arm64.sh#0be344f9eb9e7cf7c2d45598922674e599739c9a9f6c5ee1436238005da9dd03" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.1.1-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-1-MacOSX-x86_64.sh#497d6deb3932f8f0257a3db515419e871a0f1ecb155e0fd80d13ca7bbccbecac" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-1 new file mode 100644 index 00000000..0ca2864e --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.1.1-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-aarch64.sh#288aa5b21b97db7f09bf6da03323b3a3b97d461a4c5bf666be58312eb6b6e311" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_25.1.1-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-s390x.sh#e0c755e9e2e26f75cccda56fe978e7a964ed559f474486421a0022b7351bc108" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.1.1-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-Linux-x86_64.sh#03a253f7ca5cf1fdfca2aedced769d8479cb559b7c92e70f24c176fd9d23bc8e" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.1.1-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-MacOSX-arm64.sh#871ca583ee0be45d5fa36eba4143a6701e775c500c7b30ac519ef1a0205d78c3" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.1.1-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-1-MacOSX-x86_64.sh#deb025449147280611e6ca8bf89291cddb6eab06e2bff0114ac05f6f67b5ca89" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-1 new file mode 100644 index 00000000..d644f645 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.1.1-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-Linux-aarch64.sh#c8a2112c5ed07196a0e7cf0682ff39c9a28eac5862df49659af7d4f6906efa70" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_25.1.1-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-Linux-s390x.sh#f644f5c18985078e6cd1af9c517f9634dbb3199a86f75eb90a9fb303289ebf0b" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.1.1-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-Linux-x86_64.sh#2cc524b9b47b268e1a3ecca1f7f3c1bb4142f42a10001c88fb69c6664ca8a9a6" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.1.1-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-MacOSX-arm64.sh#c8f316330308f712b94dd7ac2a6048f87d6b364c3354f4e619ed4aef6d99dfad" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.1.1-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-1-MacOSX-x86_64.sh#29fce1ea800ff167e2f44d5a0dbd33124384b33520fd481378908e94de68b1a1" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-1 b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-1 new file mode 100644 index 00000000..4a692027 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.1.1-1-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-Linux-aarch64.sh#ae55c260fd250154627f74d0ede010c99c20741698d7d687b2dfca0aa14ce2d5" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_25.1.1-1-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-Linux-s390x.sh#6957a17c17e86fe43ba3c2e18dcfc1415710410c4a36f7a1c46fbc64aab4fb27" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.1.1-1-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-Linux-x86_64.sh#c5ec876718798ccd6ce93ce38eb3253ef103244ea6efaa8c978df19047ba916a" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.1.1-1-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-MacOSX-arm64.sh#d717fb09b137a048d9b2f6ee9d3e7ef63ab841e35d80cb37f40d20ac949915c2" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.1.1-1-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-1-MacOSX-x86_64.sh#a01dd65f2463bdec15abc1f796847912c67caaf78ea1c67f038ec02aa8c3adaf" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 496dcfc3848f0c6b20f8980f5e0bfd45d86a0df5 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Wed, 12 Feb 2025 20:56:34 -0800 Subject: [PATCH 225/246] Update hashes for Python 3.14.0a5 tarballs (#3196) Source tarballs were changed to fix a human error: https://discuss.python.org/t/python-3-14-0-alpha-5/80364/3 --- plugins/python-build/share/python-build/3.14.0a5 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/python-build/share/python-build/3.14.0a5 b/plugins/python-build/share/python-build/3.14.0a5 index 1765811d..14b1a1de 100644 --- a/plugins/python-build/share/python-build/3.14.0a5 +++ b/plugins/python-build/share/python-build/3.14.0a5 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.14.0a5" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a5.tar.xz#e42d91d6dd3016bfc2f6f96c1129b40ca6d8f6e1bf3b30a11de146d930f43b32" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a5" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a5.tar.xz#74e83f26de1e4fb9eef1b56492cff92508834bb71ac13f5c580438ce9f093682" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.14.0a5" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a5.tgz#bfbb9b63e072b21c44ae20da14dd8ef14fa8c0cb632d93924d5defd5db2eded3" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a5" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a5.tgz#fba0418c29c6ff0c1e7b3c6872a8a611aab472373adbdb831b99456f87549800" standard verify_py313 copy_python_gdb ensurepip fi From 09fbed1d4f937b6db0bffec24bc67ad9ad08ed41 Mon Sep 17 00:00:00 2001 From: Christian Fredrik Johnsen Date: Mon, 23 Dec 2024 14:47:36 +0300 Subject: [PATCH 226/246] fix: pyenv-rehash | do NOT create conda_exclusion_list if conda is not installed. I was doing some debugging with PYENV_DEBUG=1 and noticed that a lot of work was being done in conda.bash, even though I had not installed any conda versions like `mambaforge`. The solution is pretty simple, put all the code inside an if-block. This aligns with what @varikin found in his pull request #3037 Additionally, I have refactored the code slightly for readability (created function `build_conda_exclusion_list`), and added comments which should make it easier to understand what's going on. This commit simplifies debugging and should reduce the execution time of ```bash eval "$(pyenv init -)" ``` slightly. --- pyenv.d/rehash/conda.bash | 100 ++++++++++++++++++++++---------------- 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/pyenv.d/rehash/conda.bash b/pyenv.d/rehash/conda.bash index 884cd4f2..6f65d2b4 100644 --- a/pyenv.d/rehash/conda.bash +++ b/pyenv.d/rehash/conda.bash @@ -11,48 +11,64 @@ conda_exists() { [ -n "${condas}" ] } -shims=() -shopt -s nullglob -for shim in $(cat "${BASH_SOURCE%/*}/conda.d/"*".list" | sort | uniq | sed -e 's/#.*$//' | sed -e '/^[[:space:]]*$/d'); do - if [ -n "${shim##*/}" ]; then - shims[${#shims[*]}]="${shim})return 0;;" - fi -done -shopt -u nullglob -eval "conda_shim(){ case \"\${1##*/}\" in ${shims[@]} *)return 1;;esac;}" - -# override `make_shims` to avoid conflict between pyenv-virtualenv's `envs.bash` -# https://github.com/pyenv/pyenv-virtualenv/blob/v20160716/etc/pyenv.d/rehash/envs.bash -make_shims() { - local file shim - for file do - shim="${file##*/}" - if ! conda_shim "${shim}" 1>&2; then - register_shim "$shim" - fi - done -} - -deregister_conda_shims() { - # adapted for Bash 4.x's associative array (#1749) - if declare -p registered_shims 2> /dev/null | grep -Eq '^(declare|typeset) -A'; then - for shim in ${!registered_shims[*]}; do - if conda_shim "${shim}" 1>&2; then - unset registered_shims[${shim}] - fi - done - else - local shim - local shims=() - for shim in ${registered_shims}; do - if ! conda_shim "${shim}" 1>&2; then - shims[${#shims[*]}]="${shim}" - fi - done - registered_shims=" ${shims[@]} " - fi -} - if conda_exists; then + + # Reads the list of `blacklisted` conda binaries + # from `conda.d/default.list` and creates a function + # `conda_shim` to skip creating shims for those binaries. + build_conda_exclusion_list() { + shims=() + shopt -s nullglob + for shim in $(cat "${BASH_SOURCE%/*}/conda.d/"*".list" | sort -u | sed -e 's/#.*$//' | sed -e '/^[[:space:]]*$/d'); do + if [ -n "${shim##*/}" ]; then + shims[${#shims[*]}]="${shim})return 0;;" + fi + done + shopt -u nullglob + eval \ +"conda_shim() { + case \"\${1##*/}\" in + ${shims[@]} + *) return 1;; + esac +}" + } + + # override `make_shims` to avoid conflict between pyenv-virtualenv's `envs.bash` + # https://github.com/pyenv/pyenv-virtualenv/blob/v20160716/etc/pyenv.d/rehash/envs.bash + # The only difference between this `make_shims` and the `make_shims` defined + # in `libexec/pyenv-rehash` is that this one calls `conda_shim` to check + # if shim is blacklisted. If blacklisted -> skip creating shim. + make_shims() { + local file shim + for file do + shim="${file##*/}" + if ! conda_shim "${shim}" 1>&2; then + register_shim "$shim" + fi + done + } + + deregister_conda_shims() { + # adapted for Bash 4.x's associative array (#1749) + if declare -p registered_shims 2> /dev/null | grep -Eq '^(declare|typeset) -A'; then + for shim in ${!registered_shims[*]}; do + if conda_shim "${shim}" 1>&2; then + unset registered_shims[${shim}] + fi + done + else + local shim + local shims=() + for shim in ${registered_shims}; do + if ! conda_shim "${shim}" 1>&2; then + shims[${#shims[*]}]="${shim}" + fi + done + registered_shims=" ${shims[@]} " + fi + } + + build_conda_exclusion_list deregister_conda_shims fi From ab2a5ad0301309bab86575e13c38977650df7751 Mon Sep 17 00:00:00 2001 From: Christian Fredrik Johnsen Date: Wed, 25 Dec 2024 12:21:50 +0100 Subject: [PATCH 227/246] style: place `greadlink` in coreutils section Applies to the conda blacklist in `pyenv.d/rehash/conda.d/default.list` No practical difference, but it looks misplaced when it sits at the end of the file. --- pyenv.d/rehash/conda.d/default.list | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyenv.d/rehash/conda.d/default.list b/pyenv.d/rehash/conda.d/default.list index f70b953b..3c906b4e 100644 --- a/pyenv.d/rehash/conda.d/default.list +++ b/pyenv.d/rehash/conda.d/default.list @@ -117,6 +117,7 @@ factor false fmt fold +greadlink groups head hostid @@ -191,5 +192,4 @@ wc who whoami yes -# --- end exclusions from coreutils -greadlink \ No newline at end of file +# --- end exclusions from coreutils \ No newline at end of file From 8e5379ebe34b49b134ee7ab2165f419eb1f77050 Mon Sep 17 00:00:00 2001 From: Christian Fredrik Johnsen Date: Wed, 25 Dec 2024 12:37:34 +0100 Subject: [PATCH 228/246] perf: faster execution of build_conda_exclusion_list 1) Got rid of useless call to `cat`, much better to simply use sed with file as argument. 2) Got rid of `sort -u`. There is no need to sort the list. Additionally, the list `pyenv.d/rehash/conda.d/default.list` only has unique entries, and even if you have duplicate entries, the function will still work. --> No need for sort nor unique. 3) Further improvement is simple, save a cached cleaned-list-v1.0 in `conda.d` and simple read from that file instead of doing `sed`, which must be a more expensive operation than simply reading from file. --- pyenv.d/rehash/conda.bash | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pyenv.d/rehash/conda.bash b/pyenv.d/rehash/conda.bash index 6f65d2b4..ab17ca13 100644 --- a/pyenv.d/rehash/conda.bash +++ b/pyenv.d/rehash/conda.bash @@ -18,13 +18,11 @@ if conda_exists; then # `conda_shim` to skip creating shims for those binaries. build_conda_exclusion_list() { shims=() - shopt -s nullglob - for shim in $(cat "${BASH_SOURCE%/*}/conda.d/"*".list" | sort -u | sed -e 's/#.*$//' | sed -e '/^[[:space:]]*$/d'); do + for shim in $(sed 's/#.*$//; /^[[:space:]]*$/d' "${BASH_SOURCE%/*}/conda.d/default.list"); do if [ -n "${shim##*/}" ]; then shims[${#shims[*]}]="${shim})return 0;;" fi done - shopt -u nullglob eval \ "conda_shim() { case \"\${1##*/}\" in From 5051a42b2ccb7e2ef82787f75a0c6d90294d2f6c Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Thu, 13 Feb 2025 09:17:25 +0300 Subject: [PATCH 229/246] 2.5.3 --- CHANGELOG.md | 9 +++++++++ libexec/pyenv---version | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 89fd87eb..2132befe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Version History +## Release v2.5.3 +* Add PyPy v7.3.18 by @dand-oss in https://github.com/pyenv/pyenv/pull/3184 +* Add Miniconda3 25.1.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3190 +* Add miniforge3-25.1.1-0, miniforge3-24.11.3-0 by @native-api in https://github.com/pyenv/pyenv/pull/3191 +* Add CPython 3.14.0a5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3194 +* Add Miniconda3 25.1.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3192 +* Update hashes for Python 3.14.0a5 tarballs by @jsirois in https://github.com/pyenv/pyenv/pull/3196 +* rehash: Do not execute conda-specific code if conda is not installed by @ChristianFredrikJohnsen in https://github.com/pyenv/pyenv/pull/3151 + ## Release v2.5.2 * Fix OpenSSL version parsing in python-build script by @threadflow in https://github.com/pyenv/pyenv/pull/3181 * Add GraalPy 24.1.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3176 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 8b22b6bd..26e7396a 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.5.2" +version="2.5.3" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 47eef10ce172125f2c8761f08f1efa2385042897 Mon Sep 17 00:00:00 2001 From: binbjz <8213913+binbjz@users.noreply.github.com> Date: Fri, 14 Feb 2025 14:48:24 +0800 Subject: [PATCH 230/246] Add anaconda3-2025.1.1-2 (#3198) Co-authored-by: binbjz --- .../python-build/miniconda3-3.10-25.1.1-2 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.11-25.1.1-2 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.12-25.1.1-2 | 25 +++++++++++++++++++ .../python-build/miniconda3-3.9-25.1.1-2 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-2 create mode 100644 plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-2 diff --git a/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-2 b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-2 new file mode 100644 index 00000000..74a81436 --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.10-25.1.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py310_25.1.1-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-aarch64.sh#5f61143e93d9d48a82aa99a1d7b1c77561f599b9a67ab954862e6e8d6a25c0cc" "miniconda" verify_py310 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py310_25.1.1-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-s390x.sh#89d689248a6855da3e6087cfeebaad6886e4ef46b4e96671bf251bb9aa6b1499" "miniconda" verify_py310 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py310_25.1.1-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-Linux-x86_64.sh#7f298109ab95b5436632973a04189a125282cc948f1dd1b03fa9cb6c71443915" "miniconda" verify_py310 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py310_25.1.1-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-MacOSX-arm64.sh#119e3196d9e67f8eb0f88d4a3188849b5b8bf14a8dd87873c0bff7ce016eea52" "miniconda" verify_py310 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py310_25.1.1-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py310_25.1.1-2-MacOSX-x86_64.sh#543d635dcd34256ac87ffe7a242259cf8f639d51a503da4e4eb3e29ecf406302" "miniconda" verify_py310 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-2 b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-2 new file mode 100644 index 00000000..88a9c78a --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.11-25.1.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py311_25.1.1-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-Linux-aarch64.sh#8a1d4407fce7ec552ac6ed655ce93d83549e02b819cacefbb7f640f9051e638b" "miniconda" verify_py311 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py311_25.1.1-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-Linux-s390x.sh#0b4d5a3f16dcb2d230ba5dfdfdb848c854006aab6dd1bd3dbf29fcddf04b07a4" "miniconda" verify_py311 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py311_25.1.1-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-Linux-x86_64.sh#d8c1645776c0758214e4191c605abe5878002051316bd423f2b14b22d6cb4251" "miniconda" verify_py311 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py311_25.1.1-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-MacOSX-arm64.sh#140b80b4d285bbbcc8616891876ec3613e46acbedb02321b9ddc03ff0784c584" "miniconda" verify_py311 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py311_25.1.1-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py311_25.1.1-2-MacOSX-x86_64.sh#41c4ed1ce9f44049346a7efd8311919f82a8115637eced8796b5d18599f50cae" "miniconda" verify_py311 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-2 b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-2 new file mode 100644 index 00000000..d712136f --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.12-25.1.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py312_25.1.1-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-Linux-aarch64.sh#6d05b9f9b7f327b90797a4cf56d68c81578bab2f63257a3e7a8b72cb0f0e4b5d" "miniconda" verify_py312 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py312_25.1.1-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-Linux-s390x.sh#55c681937c27e13a8ed818d1fec182e623e0308fffc1b10605896dac15f90077" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py312_25.1.1-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-Linux-x86_64.sh#4766d85b5f7d235ce250e998ebb5a8a8210cbd4f2b0fea4d2177b3ed9ea87884" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py312_25.1.1-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-MacOSX-arm64.sh#16e7eea739d470d0c3451e9bb779bbfa169b98cfb283d2d6508945e0c6b36ada" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py312_25.1.1-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py312_25.1.1-2-MacOSX-x86_64.sh#0df9f4b7d063a78d18fd02af2b0a97121879af00b535ea79ee23d68d1005e6f8" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-2 b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-2 new file mode 100644 index 00000000..f299266d --- /dev/null +++ b/plugins/python-build/share/python-build/miniconda3-3.9-25.1.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniconda3-py39_25.1.1-2-Linux-aarch64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-aarch64.sh#5afee04df06c923462341cfc87727100a67fa854550d0d7a2e6295005168e6b7" "miniconda" verify_py39 + ;; +"Linux-s390x" ) + install_script "Miniconda3-py39_25.1.1-2-Linux-s390x.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-s390x.sh#94a10a8a43dfd0360ecad9df24ef768db1b776d1a76fc2df1928d76c0bbb5535" "miniconda" verify_py39 + ;; +"Linux-x86_64" ) + install_script "Miniconda3-py39_25.1.1-2-Linux-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-Linux-x86_64.sh#b40682cedf1e1755c02555f8d3d98aadb4607a68da7caf72a9bbe1fb9ae0b904" "miniconda" verify_py39 + ;; +"MacOSX-arm64" ) + install_script "Miniconda3-py39_25.1.1-2-MacOSX-arm64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-MacOSX-arm64.sh#b50b4c46b481d3c9cb4befdbcf18087748d85eee9148c56a35f199940d607933" "miniconda" verify_py39 + ;; +"MacOSX-x86_64" ) + install_script "Miniconda3-py39_25.1.1-2-MacOSX-x86_64.sh" "https://repo.anaconda.com/miniconda/Miniconda3-py39_25.1.1-2-MacOSX-x86_64.sh#92109afe5edcc06d3a3c61b0faf1edd3e3e2539eaad637d2711305ccd0065046" "miniconda" verify_py39 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 2f4bdcdb43229575ebfe245b8f31d87bfb1081a2 Mon Sep 17 00:00:00 2001 From: John Sirois Date: Fri, 28 Feb 2025 11:05:57 -0800 Subject: [PATCH 231/246] Add PyPy v7.3.19. (#3205) The release blog entry is here: https://pypy.org/posts/2025/02/pypy-v7319-release.html --- .../share/python-build/pypy2.7-7.3.19 | 77 +++++++++++++++++++ .../share/python-build/pypy2.7-7.3.19-src | 14 ++++ .../share/python-build/pypy3.10-7.3.19 | 77 +++++++++++++++++++ .../share/python-build/pypy3.10-7.3.19-src | 14 ++++ .../share/python-build/pypy3.11-7.3.19 | 77 +++++++++++++++++++ .../share/python-build/pypy3.11-7.3.19-src | 14 ++++ 6 files changed, 273 insertions(+) create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.19 create mode 100644 plugins/python-build/share/python-build/pypy2.7-7.3.19-src create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.19 create mode 100644 plugins/python-build/share/python-build/pypy3.10-7.3.19-src create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.19 create mode 100644 plugins/python-build/share/python-build/pypy3.11-7.3.19-src diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.19 b/plugins/python-build/share/python-build/pypy2.7-7.3.19 new file mode 100644 index 00000000..9bbba97f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.19 @@ -0,0 +1,77 @@ +VERSION='7.3.19' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +aarch64_hash=fe89d4fd4af13f76dfe7315975003518cf176520e3ccec1544a88d174f50910e +linux32_hash=cc52df02b6926bd8645c1651cd7f6637ce51c2f352d0fb3c6b9330d15194b409 +linux64_hash=d38445508c2eaf14ebb380d9c1ded321c5ebeae31c7e66800173d83cb8ddf423 +osarm64_hash=28780e0b908ad6db4b4e096f4237124be79ecc9731946d840d9c8749eb67a759 +osx64_hash=6be28d448d8e64fffc586d9b0ae4d09064a83ccaeb5b8060c651c5cd9ae06878 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy2.7-7.3.19-src b/plugins/python-build/share/python-build/pypy2.7-7.3.19-src new file mode 100644 index 00000000..30aec5e6 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy2.7-7.3.19-src @@ -0,0 +1,14 @@ +VERSION='7.3.19' +PYVER='2.7' + +# https://www.pypy.org/checksums.html +hash=8703cdcb01f9f82966dd43b6a6018f140399db51ebb43c125c1f9a215e7bb003 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip_lt21' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.19 b/plugins/python-build/share/python-build/pypy3.10-7.3.19 new file mode 100644 index 00000000..13df1c38 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.19 @@ -0,0 +1,77 @@ +VERSION='7.3.19' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +aarch64_hash=af27a589178f11198e2244ab65ca510630ba97c131d7ccc4021eb5bc58de7f57 +linux32_hash=e63a4fcad2641ee541e852918befb513abf04ce7070f743a50778cae9f9da80e +linux64_hash=c73ac2cc2380ac9227fd297482bf2a3e17a80618ba46db7544d535515321ec1e +osarm64_hash=3db8a03fc496164801646844d7f3b12baa0adb3ad9a0b7cb124521bc2e168a36 +osx64_hash=2c5e5c2a33ac882551d7f28b98d19d486b8995aa50824a73b4edcc6aeec35c63 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.10-7.3.19-src b/plugins/python-build/share/python-build/pypy3.10-7.3.19-src new file mode 100644 index 00000000..625d016f --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.10-7.3.19-src @@ -0,0 +1,14 @@ +VERSION='7.3.19' +PYVER='3.10' + +# https://www.pypy.org/checksums.html +hash=a7c22930b918f40870865ed8a74147f4434ef84d3d6ca2b3c1eba9355d4929c8 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.19 b/plugins/python-build/share/python-build/pypy3.11-7.3.19 new file mode 100644 index 00000000..1f737eed --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.19 @@ -0,0 +1,77 @@ +VERSION='7.3.19' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +aarch64_hash=13207dbf81ce24e96da760b1b863627b77bb20b1fb4c95191e02a0b72383df74 +linux32_hash=5c6cdafd0a0abd14ca59926ed1b6aeb13b228c18b4b46de655aae48734c731ad +linux64_hash=9177d9e0bb91b05f921c642cb0ff71a0f3653b5d29a42d40d6a078c15b75720f +osarm64_hash=7704e0d5302e53920d32dcfe9afeeb10436d4c94233e8830cf603aa955a861c1 +osx64_hash=a2439f9d30dfdae96a5e9101c7dc54a8a68b56c9d7314ea399b0a25d3e87ebb2 + +### end of manual settings - following lines same for every download + +function err_no_binary { + local archmsg="${1}" + local ver="pypy${PYVER}-v${VERSION}-src" + local url="https://downloads.python.org/pypy/${ver}.tar.bz2" + { echo + colorize 1 "ERROR" + echo ": The binary distribution of PyPy is not available for ${archmsg}." + echo "try '${url}' to build from source." + echo + } >&2 + exit 1 +} + +function pypy_pkg_data { + # pypy architecture tag + local ARCH="${1}" + + # defaults + local cmd='install_package' # use bz2 + local pkg="${ARCH}" # assume matches + local ext='tar.bz2' + local hash='' # undefined + + # select the hash, fix pkg if not match ARCH + case "${ARCH}" in + 'linux-aarch64' ) + hash="${aarch64_hash}" + pkg='aarch64' + ;; + 'linux' ) + hash="${linux32_hash}" + pkg='linux32' + ;; + 'linux64' ) + hash="${linux64_hash}" + ;; + 'osarm64' ) + hash="${osarm64_hash}" + pkg='macos_arm64' + ;; + 'osx64' ) + if require_osx_version "10.13"; then + hash="${osx64_hash}" + pkg='macos_x86_64' + else + err_no_binary "${ARCH}, OS X < 10.13" + fi + ;; + * ) + err_no_binary "${ARCH}" + ;; + esac + + local basever="pypy${PYVER}-v${VERSION}" + local baseurl="https://downloads.python.org/pypy/${basever}" + + # result - command, package dir, url+hash + echo "${cmd}" "${basever}-${pkg}" "${baseurl}-${pkg}.${ext}#${hash}" +} + +# determine command, package directory, url+hash +declare -a pd="$(pypy_pkg_data "$(pypy_architecture 2>/dev/null || true)")" + +# install +${pd[0]} "${pd[1]}" "${pd[2]}" 'pypy' "verify_py${PYVER//./}" 'ensurepip' diff --git a/plugins/python-build/share/python-build/pypy3.11-7.3.19-src b/plugins/python-build/share/python-build/pypy3.11-7.3.19-src new file mode 100644 index 00000000..39441379 --- /dev/null +++ b/plugins/python-build/share/python-build/pypy3.11-7.3.19-src @@ -0,0 +1,14 @@ +VERSION='7.3.19' +PYVER='3.11' + +# https://www.pypy.org/checksums.html +hash=4817c044bb469a3274e60aa3645770f81eb4f9166ea7fdc4e6c351345554c8d8 + +### end of manual settings - following lines same for every download + +ver="pypy${PYVER}-v${VERSION}-src" +url="https://downloads.python.org/pypy/${ver}.tar.bz2" + +prefer_openssl11 +install_package "openssl-1.1.1f" "https://www.openssl.org/source/openssl-1.1.1f.tar.gz#186c6bfe6ecfba7a5b48c47f8a1673d0f3b0e5ba2e25602dd23b629975da3f35" mac_openssl --if has_broken_mac_openssl +install_package "${ver}" "${url}#${hash}" 'pypy_builder' "verify_py${PYVER//./}" 'ensurepip' From 44172d69f2034782fd621044434102634adf067b Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 14 Mar 2025 11:26:03 -0600 Subject: [PATCH 232/246] Add CPython 3.14.0a6 (#3213) --- plugins/python-build/share/python-build/3.14.0a5t | 2 -- .../python-build/share/python-build/{3.14.0a5 => 3.14.0a6} | 4 ++-- plugins/python-build/share/python-build/3.14.0a6t | 2 ++ 3 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.14.0a5t rename plugins/python-build/share/python-build/{3.14.0a5 => 3.14.0a6} (59%) create mode 100644 plugins/python-build/share/python-build/3.14.0a6t diff --git a/plugins/python-build/share/python-build/3.14.0a5t b/plugins/python-build/share/python-build/3.14.0a5t deleted file mode 100644 index d84606a4..00000000 --- a/plugins/python-build/share/python-build/3.14.0a5t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a5 diff --git a/plugins/python-build/share/python-build/3.14.0a5 b/plugins/python-build/share/python-build/3.14.0a6 similarity index 59% rename from plugins/python-build/share/python-build/3.14.0a5 rename to plugins/python-build/share/python-build/3.14.0a6 index 14b1a1de..a674689e 100644 --- a/plugins/python-build/share/python-build/3.14.0a5 +++ b/plugins/python-build/share/python-build/3.14.0a6 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.14.0a5" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a5.tar.xz#74e83f26de1e4fb9eef1b56492cff92508834bb71ac13f5c580438ce9f093682" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a6" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a6.tar.xz#8d6181e5331d9a2cd6ca405ae1230e88589a043f4768ebb443d3889d45c1c35c" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.14.0a5" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a5.tgz#fba0418c29c6ff0c1e7b3c6872a8a611aab472373adbdb831b99456f87549800" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a6" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a6.tgz#8129cdb891958eb644856317f91fd1d2f1019745a983b2b01d2506584eb5be3e" standard verify_py313 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.14.0a6t b/plugins/python-build/share/python-build/3.14.0a6t new file mode 100644 index 00000000..ab4fc8b2 --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0a6t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a6 From abf1376487544fd6059d2c72e099a0b4b621206c Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Sat, 15 Mar 2025 02:06:16 +0300 Subject: [PATCH 233/246] 2.5.4 --- CHANGELOG.md | 5 +++++ libexec/pyenv---version | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2132befe..907e43a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Version History +## Release v2.5.4 +* Add anaconda3-2025.1.1-2 by @binbjz in https://github.com/pyenv/pyenv/pull/3198 +* Add PyPy v7.3.19 by @jsirois in https://github.com/pyenv/pyenv/pull/3205 +* Add CPython 3.14.0a6 by @nedbat in https://github.com/pyenv/pyenv/pull/3213 + ## Release v2.5.3 * Add PyPy v7.3.18 by @dand-oss in https://github.com/pyenv/pyenv/pull/3184 * Add Miniconda3 25.1.1-0 by @binbjz in https://github.com/pyenv/pyenv/pull/3190 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 26e7396a..4b074e80 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.5.3" +version="2.5.4" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From c579b636967184c5748096c00beae348779663cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20=C5=A0im=C3=A1=C4=8Dek?= Date: Tue, 18 Mar 2025 17:18:33 +0100 Subject: [PATCH 234/246] Add graalpy 24.2 (#3215) --- .../share/python-build/graalpy-24.2.0 | 64 +++++++++++++++++++ .../python-build/graalpy-community-24.2.0 | 54 ++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-24.2.0 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.2.0 diff --git a/plugins/python-build/share/python-build/graalpy-24.2.0 b/plugins/python-build/share/python-build/graalpy-24.2.0 new file mode 100644 index 00000000..05d212a9 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.2.0 @@ -0,0 +1,64 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.0' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="06381ebe89a242bbb66afdc7dc35d21ae537f7eb130f16db1f0e94c2a65249ba" + ;; +"linux-aarch64" ) + checksum="a80f4fe8c4b2ad53af6e5090bab462c7d0797b9b281e35bfc8284b703610c5cf" + ;; +"macos-amd64" ) + checksum="dafd706de39041887d016ef84413f5252d085b03ad47a44a6f680f40ed1a87e4" + ;; +"macos-aarch64" ) + checksum="108ad4c15b814aecc5b69b83a10a3a5e8982c656c4b639740d034a4783eb3839" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.2.0 b/plugins/python-build/share/python-build/graalpy-community-24.2.0 new file mode 100644 index 00000000..7f102744 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.2.0 @@ -0,0 +1,54 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.0' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="a3be9d91af186e270819cd3983507e073eeba33a303c5e5bec05ed1ac6078262" + ;; +"linux-aarch64" ) + checksum="6d5792eaebdf7847e1e75089f5d1f15f3762e55b8c69ea5631108c0e737cbf45" + ;; +"macos-amd64" ) + checksum="4a16be069341bdb3597d39c09eb11bfb994504f1c4c4b114cbb4489555229b6f" + ;; +"macos-aarch64" ) + checksum="bed8b15bc260a899766a2051d87c6fe9172c30751fa9c2e9a7ea2f5c8c49b781" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip From 004f6706a19072caf4132ddbbb3ef9fff7e97244 Mon Sep 17 00:00:00 2001 From: native-api Date: Thu, 27 Mar 2025 23:35:50 +0300 Subject: [PATCH 235/246] Switch 3.9+ to OpenSSL 3 (#3223) --- plugins/python-build/share/python-build/3.10-dev | 2 +- plugins/python-build/share/python-build/3.10.0 | 2 +- plugins/python-build/share/python-build/3.10.1 | 2 +- plugins/python-build/share/python-build/3.10.10 | 2 +- plugins/python-build/share/python-build/3.10.11 | 2 +- plugins/python-build/share/python-build/3.10.12 | 2 +- plugins/python-build/share/python-build/3.10.13 | 2 +- plugins/python-build/share/python-build/3.10.14 | 2 +- plugins/python-build/share/python-build/3.10.15 | 2 +- plugins/python-build/share/python-build/3.10.16 | 2 +- plugins/python-build/share/python-build/3.10.2 | 2 +- plugins/python-build/share/python-build/3.10.3 | 2 +- plugins/python-build/share/python-build/3.10.4 | 2 +- plugins/python-build/share/python-build/3.10.5 | 2 +- plugins/python-build/share/python-build/3.10.6 | 2 +- plugins/python-build/share/python-build/3.10.7 | 2 +- plugins/python-build/share/python-build/3.10.8 | 2 +- plugins/python-build/share/python-build/3.10.9 | 2 +- plugins/python-build/share/python-build/3.11-dev | 2 +- plugins/python-build/share/python-build/3.11.0 | 2 +- plugins/python-build/share/python-build/3.11.1 | 2 +- plugins/python-build/share/python-build/3.11.2 | 2 +- plugins/python-build/share/python-build/3.11.3 | 2 +- plugins/python-build/share/python-build/3.11.4 | 2 +- plugins/python-build/share/python-build/3.9-dev | 2 +- plugins/python-build/share/python-build/3.9.0 | 2 +- plugins/python-build/share/python-build/3.9.1 | 2 +- plugins/python-build/share/python-build/3.9.10 | 2 +- plugins/python-build/share/python-build/3.9.11 | 2 +- plugins/python-build/share/python-build/3.9.12 | 2 +- plugins/python-build/share/python-build/3.9.13 | 2 +- plugins/python-build/share/python-build/3.9.14 | 2 +- plugins/python-build/share/python-build/3.9.15 | 2 +- plugins/python-build/share/python-build/3.9.16 | 2 +- plugins/python-build/share/python-build/3.9.17 | 2 +- plugins/python-build/share/python-build/3.9.18 | 2 +- plugins/python-build/share/python-build/3.9.19 | 2 +- plugins/python-build/share/python-build/3.9.2 | 2 +- plugins/python-build/share/python-build/3.9.20 | 2 +- plugins/python-build/share/python-build/3.9.21 | 2 +- plugins/python-build/share/python-build/3.9.4 | 2 +- plugins/python-build/share/python-build/3.9.5 | 2 +- plugins/python-build/share/python-build/3.9.6 | 2 +- plugins/python-build/share/python-build/3.9.7 | 2 +- plugins/python-build/share/python-build/3.9.8 | 2 +- plugins/python-build/share/python-build/3.9.9 | 2 +- 46 files changed, 46 insertions(+), 46 deletions(-) diff --git a/plugins/python-build/share/python-build/3.10-dev b/plugins/python-build/share/python-build/3.10-dev index a7088bfb..daa21f39 100644 --- a/plugins/python-build/share/python-build/3.10-dev +++ b/plugins/python-build/share/python-build/3.10-dev @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.0 b/plugins/python-build/share/python-build/3.10.0 index b55ce42a..9eec8f5f 100644 --- a/plugins/python-build/share/python-build/3.10.0 +++ b/plugins/python-build/share/python-build/3.10.0 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.1 b/plugins/python-build/share/python-build/3.10.1 index 7a2f71a4..74568c15 100644 --- a/plugins/python-build/share/python-build/3.10.1 +++ b/plugins/python-build/share/python-build/3.10.1 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.10 b/plugins/python-build/share/python-build/3.10.10 index bdab1b75..b30b38fa 100644 --- a/plugins/python-build/share/python-build/3.10.10 +++ b/plugins/python-build/share/python-build/3.10.10 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.11 b/plugins/python-build/share/python-build/3.10.11 index 2c84bd8f..3376dead 100644 --- a/plugins/python-build/share/python-build/3.10.11 +++ b/plugins/python-build/share/python-build/3.10.11 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.12 b/plugins/python-build/share/python-build/3.10.12 index 3d97afed..01aeace3 100644 --- a/plugins/python-build/share/python-build/3.10.12 +++ b/plugins/python-build/share/python-build/3.10.12 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.13 b/plugins/python-build/share/python-build/3.10.13 index ccd3f791..af2f2a08 100644 --- a/plugins/python-build/share/python-build/3.10.13 +++ b/plugins/python-build/share/python-build/3.10.13 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.14 b/plugins/python-build/share/python-build/3.10.14 index 0b062fec..6bbe017b 100644 --- a/plugins/python-build/share/python-build/3.10.14 +++ b/plugins/python-build/share/python-build/3.10.14 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.15 b/plugins/python-build/share/python-build/3.10.15 index a42cd118..b1613337 100644 --- a/plugins/python-build/share/python-build/3.10.15 +++ b/plugins/python-build/share/python-build/3.10.15 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.16 b/plugins/python-build/share/python-build/3.10.16 index c5b61f46..6a1d62b5 100644 --- a/plugins/python-build/share/python-build/3.10.16 +++ b/plugins/python-build/share/python-build/3.10.16 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.2 b/plugins/python-build/share/python-build/3.10.2 index 9e92b000..e0bd4189 100644 --- a/plugins/python-build/share/python-build/3.10.2 +++ b/plugins/python-build/share/python-build/3.10.2 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.3 b/plugins/python-build/share/python-build/3.10.3 index 116a3a8a..306a770b 100644 --- a/plugins/python-build/share/python-build/3.10.3 +++ b/plugins/python-build/share/python-build/3.10.3 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.4 b/plugins/python-build/share/python-build/3.10.4 index 16bf24c7..58ccc897 100644 --- a/plugins/python-build/share/python-build/3.10.4 +++ b/plugins/python-build/share/python-build/3.10.4 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1n" "https://www.openssl.org/source/openssl-1.1.1n.tar.gz#40dceb51a4f6a5275bde0e6bf20ef4b91bfc32ed57c0552e2e8e15463372b17a" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.5 b/plugins/python-build/share/python-build/3.10.5 index 71be01eb..ecaa5082 100644 --- a/plugins/python-build/share/python-build/3.10.5 +++ b/plugins/python-build/share/python-build/3.10.5 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.6 b/plugins/python-build/share/python-build/3.10.6 index 6a9c84ab..8f19a0d4 100644 --- a/plugins/python-build/share/python-build/3.10.6 +++ b/plugins/python-build/share/python-build/3.10.6 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.7 b/plugins/python-build/share/python-build/3.10.7 index 0e1b04bf..9d5eb3f1 100644 --- a/plugins/python-build/share/python-build/3.10.7 +++ b/plugins/python-build/share/python-build/3.10.7 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.8 b/plugins/python-build/share/python-build/3.10.8 index b5d47739..02d9162f 100644 --- a/plugins/python-build/share/python-build/3.10.8 +++ b/plugins/python-build/share/python-build/3.10.8 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.10.9 b/plugins/python-build/share/python-build/3.10.9 index 2486eaba..a18d67c4 100644 --- a/plugins/python-build/share/python-build/3.10.9 +++ b/plugins/python-build/share/python-build/3.10.9 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1o" "https://www.openssl.org/source/openssl-1.1.1o.tar.gz#9384a2b0570dd80358841464677115df785edb941c71211f75076d72fe6b438f" mac_openssl --if has_broken_mac_openssl install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.11-dev b/plugins/python-build/share/python-build/3.11-dev index 904f2138..9aa935bf 100644 --- a/plugins/python-build/share/python-build/3.11-dev +++ b/plugins/python-build/share/python-build/3.11-dev @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl diff --git a/plugins/python-build/share/python-build/3.11.0 b/plugins/python-build/share/python-build/3.11.0 index f96cb69d..1dc73d59 100644 --- a/plugins/python-build/share/python-build/3.11.0 +++ b/plugins/python-build/share/python-build/3.11.0 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1q" "https://www.openssl.org/source/openssl-1.1.1q.tar.gz#d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca" mac_openssl --if has_broken_mac_openssl diff --git a/plugins/python-build/share/python-build/3.11.1 b/plugins/python-build/share/python-build/3.11.1 index 23a3c310..2ff94135 100644 --- a/plugins/python-build/share/python-build/3.11.1 +++ b/plugins/python-build/share/python-build/3.11.1 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl diff --git a/plugins/python-build/share/python-build/3.11.2 b/plugins/python-build/share/python-build/3.11.2 index ab048e36..20122d17 100644 --- a/plugins/python-build/share/python-build/3.11.2 +++ b/plugins/python-build/share/python-build/3.11.2 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl diff --git a/plugins/python-build/share/python-build/3.11.3 b/plugins/python-build/share/python-build/3.11.3 index f9fd9d90..4b1ab6f5 100644 --- a/plugins/python-build/share/python-build/3.11.3 +++ b/plugins/python-build/share/python-build/3.11.3 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl diff --git a/plugins/python-build/share/python-build/3.11.4 b/plugins/python-build/share/python-build/3.11.4 index ee146232..b6819e94 100644 --- a/plugins/python-build/share/python-build/3.11.4 +++ b/plugins/python-build/share/python-build/3.11.4 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 install_package "openssl-1.1.1s" "https://www.openssl.org/source/openssl-1.1.1s.tar.gz#c5ac01e760ee6ff0dab61d6b2bbd30146724d063eb322180c6f18a6f74e4b6aa" mac_openssl --if has_broken_mac_openssl diff --git a/plugins/python-build/share/python-build/3.9-dev b/plugins/python-build/share/python-build/3.9-dev index 81338042..d42b3bda 100644 --- a/plugins/python-build/share/python-build/3.9-dev +++ b/plugins/python-build/share/python-build/3.9-dev @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.9.0 b/plugins/python-build/share/python-build/3.9.0 index 28e2ca1a..91e79e16 100644 --- a/plugins/python-build/share/python-build/3.9.0 +++ b/plugins/python-build/share/python-build/3.9.0 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.9.1 b/plugins/python-build/share/python-build/3.9.1 index 237743a5..18cfb476 100644 --- a/plugins/python-build/share/python-build/3.9.1 +++ b/plugins/python-build/share/python-build/3.9.1 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.9.10 b/plugins/python-build/share/python-build/3.9.10 index 283c543d..5191c8f0 100644 --- a/plugins/python-build/share/python-build/3.9.10 +++ b/plugins/python-build/share/python-build/3.9.10 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.11 b/plugins/python-build/share/python-build/3.9.11 index 50ddeb17..7dfbc804 100644 --- a/plugins/python-build/share/python-build/3.9.11 +++ b/plugins/python-build/share/python-build/3.9.11 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.12 b/plugins/python-build/share/python-build/3.9.12 index 2a0bcc84..eed5c910 100644 --- a/plugins/python-build/share/python-build/3.9.12 +++ b/plugins/python-build/share/python-build/3.9.12 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.13 b/plugins/python-build/share/python-build/3.9.13 index 2dfd8784..bae24465 100644 --- a/plugins/python-build/share/python-build/3.9.13 +++ b/plugins/python-build/share/python-build/3.9.13 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.14 b/plugins/python-build/share/python-build/3.9.14 index 586743a9..a347e967 100644 --- a/plugins/python-build/share/python-build/3.9.14 +++ b/plugins/python-build/share/python-build/3.9.14 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.15 b/plugins/python-build/share/python-build/3.9.15 index a62ad159..8fb1309a 100644 --- a/plugins/python-build/share/python-build/3.9.15 +++ b/plugins/python-build/share/python-build/3.9.15 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.16 b/plugins/python-build/share/python-build/3.9.16 index 11345f10..5a184522 100644 --- a/plugins/python-build/share/python-build/3.9.16 +++ b/plugins/python-build/share/python-build/3.9.16 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.17 b/plugins/python-build/share/python-build/3.9.17 index 32aecb8d..3964ce55 100644 --- a/plugins/python-build/share/python-build/3.9.17 +++ b/plugins/python-build/share/python-build/3.9.17 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.18 b/plugins/python-build/share/python-build/3.9.18 index 5d524e95..57cacd37 100644 --- a/plugins/python-build/share/python-build/3.9.18 +++ b/plugins/python-build/share/python-build/3.9.18 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.19 b/plugins/python-build/share/python-build/3.9.19 index b6c1e5ba..a30911d2 100644 --- a/plugins/python-build/share/python-build/3.9.19 +++ b/plugins/python-build/share/python-build/3.9.19 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.2 b/plugins/python-build/share/python-build/3.9.2 index e4456eca..d72cba62 100644 --- a/plugins/python-build/share/python-build/3.9.2 +++ b/plugins/python-build/share/python-build/3.9.2 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1i" "https://www.openssl.org/source/old/1.1.1/openssl-1.1.1i.tar.gz#e8be6a35fe41d10603c3cc635e93289ed00bf34b79671a3a4de64fcee00d5242" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.9.20 b/plugins/python-build/share/python-build/3.9.20 index a3af19d8..e405f827 100644 --- a/plugins/python-build/share/python-build/3.9.20 +++ b/plugins/python-build/share/python-build/3.9.20 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.21 b/plugins/python-build/share/python-build/3.9.21 index 4a317c63..021f9ddd 100644 --- a/plugins/python-build/share/python-build/3.9.21 +++ b/plugins/python-build/share/python-build/3.9.21 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.4 b/plugins/python-build/share/python-build/3.9.4 index 2e5cd7bf..f4440e69 100644 --- a/plugins/python-build/share/python-build/3.9.4 +++ b/plugins/python-build/share/python-build/3.9.4 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-1.1.1k" "https://www.openssl.org/source/openssl-1.1.1k.tar.gz#892a0875b9872acd04a9fde79b1f943075d5ea162415de3047c327df33fbaee5" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline diff --git a/plugins/python-build/share/python-build/3.9.5 b/plugins/python-build/share/python-build/3.9.5 index cbf1b53f..bcebf5a4 100644 --- a/plugins/python-build/share/python-build/3.9.5 +++ b/plugins/python-build/share/python-build/3.9.5 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.6 b/plugins/python-build/share/python-build/3.9.6 index 20e42ddd..e7eb8622 100644 --- a/plugins/python-build/share/python-build/3.9.6 +++ b/plugins/python-build/share/python-build/3.9.6 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.7 b/plugins/python-build/share/python-build/3.9.7 index 659d388e..dcdec7f2 100644 --- a/plugins/python-build/share/python-build/3.9.7 +++ b/plugins/python-build/share/python-build/3.9.7 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.8 b/plugins/python-build/share/python-build/3.9.8 index 10ac89e6..3d90c3bc 100644 --- a/plugins/python-build/share/python-build/3.9.8 +++ b/plugins/python-build/share/python-build/3.9.8 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" diff --git a/plugins/python-build/share/python-build/3.9.9 b/plugins/python-build/share/python-build/3.9.9 index bdd1579b..d6445a3a 100644 --- a/plugins/python-build/share/python-build/3.9.9 +++ b/plugins/python-build/share/python-build/3.9.9 @@ -1,4 +1,4 @@ -prefer_openssl11 +prefer_openssl3 export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 # Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" From 67f474d3e30dda469a6e181a0de0657176587c46 Mon Sep 17 00:00:00 2001 From: native-api Date: Fri, 28 Mar 2025 00:03:17 +0300 Subject: [PATCH 236/246] Add miniforge3-24.11.3-1, miniforge3-24.11.3-2, miniforge3-25.1.1 (#3224) --- .../share/python-build/miniforge3-24.11.3-1 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-24.11.3-2 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-25.1.1-1 | 25 +++++++++++++++++++ .../share/python-build/miniforge3-25.1.1-2 | 25 +++++++++++++++++++ 4 files changed, 100 insertions(+) create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.3-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-24.11.3-2 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.1.1-1 create mode 100644 plugins/python-build/share/python-build/miniforge3-25.1.1-2 diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.3-1 b/plugins/python-build/share/python-build/miniforge3-24.11.3-1 new file mode 100644 index 00000000..f81d46e7 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.3-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.3-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-Linux-aarch64.sh#64ee999aaa1e81968345382569780dae499bdc680751b1b408e2030c51397d49" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.3-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-Linux-ppc64le.sh#db36c2024ca0b7216a91faebb20de11bca3d8baa4e3c8b253a65e3d9149f6e72" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.3-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-Linux-x86_64.sh#2163c5c29661ae2850c00a9d03af82db795b822d391ae68a5f8cce62a7483a54" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.3-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-MacOSX-arm64.sh#a2c3cfe749325634b2c29103f7c65a160e9c0ddc6b3c35528b0921ba3f6e9a91" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.3-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-1/Miniforge3-24.11.3-1-MacOSX-x86_64.sh#304bb96966caeb96e7ccd1859bf81f6abf15de667c144bf3600cbeaf3491033c" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-24.11.3-2 b/plugins/python-build/share/python-build/miniforge3-24.11.3-2 new file mode 100644 index 00000000..541db6a1 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-24.11.3-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-24.11.3-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-Linux-aarch64.sh#d61942220d28e2103ad6303de808fec52d2e276fa698e2ae5d8ab865e194c504" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-24.11.3-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-Linux-ppc64le.sh#7e312337a1a34c88802ff300a50ff785c6db85a8e518ee1cdc0d58085e0ad08e" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-24.11.3-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-Linux-x86_64.sh#65af53dad30b3fcbd1cb1d4ad62fd3a86221464754844544558aae3a28795189" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-24.11.3-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-MacOSX-arm64.sh#a20f9dd033fcdb26329abab726bfddf22de44bf1d37030bb212cf52120b26618" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-24.11.3-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/24.11.3-2/Miniforge3-24.11.3-2-MacOSX-x86_64.sh#164f9891ca2338d9c748d1d007d081d1206ae255264df201493204b93b8ba484" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.1.1-1 b/plugins/python-build/share/python-build/miniforge3-25.1.1-1 new file mode 100644 index 00000000..0424ed2c --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.1.1-1 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.1.1-1-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-Linux-aarch64.sh#2e9889a77e32b322ce4aef26e465ff44f6493de66243faae9528c1d57c2a91e9" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.1.1-1-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-Linux-ppc64le.sh#2e47c220ff4c6f074c30ec977bb925861597e588c63dbb8df7c4aebf89c70c38" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.1.1-1-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-Linux-x86_64.sh#73ccbf68c018df3f30bbe15cd69235b5994d8b32b62d50d9389be89736d0a08d" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.1.1-1-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-MacOSX-arm64.sh#288dcf12f3c9a054ba004e4d7b38467653e0084949ded152145079047ae8f94e" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.1.1-1-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-1/Miniforge3-25.1.1-1-MacOSX-x86_64.sh#02500e29f3956211fcbfeda20756fd5d05c537ff5e6d0f530d9003729105fae2" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac diff --git a/plugins/python-build/share/python-build/miniforge3-25.1.1-2 b/plugins/python-build/share/python-build/miniforge3-25.1.1-2 new file mode 100644 index 00000000..30bf4658 --- /dev/null +++ b/plugins/python-build/share/python-build/miniforge3-25.1.1-2 @@ -0,0 +1,25 @@ +case "$(anaconda_architecture 2>/dev/null || true)" in +"Linux-aarch64" ) + install_script "Miniforge3-25.1.1-2-Linux-aarch64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-Linux-aarch64.sh#99e5b987d6662ce956db33beab94b330a7024561b7f14e79f7ee413100f20927" "miniconda" verify_py312 + ;; +"Linux-ppc64le" ) + install_script "Miniforge3-25.1.1-2-Linux-ppc64le.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-Linux-ppc64le.sh#47f8bdffef0bb72e31db2bf26764bb64956528f792db33e03e4c414fee69c629" "miniconda" verify_py312 + ;; +"Linux-x86_64" ) + install_script "Miniforge3-25.1.1-2-Linux-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-Linux-x86_64.sh#d1090d98cbae7ed8a9ae19a92cfba6fc47cdc48c8c9b679df78408dba6820eff" "miniconda" verify_py312 + ;; +"MacOSX-arm64" ) + install_script "Miniforge3-25.1.1-2-MacOSX-arm64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-MacOSX-arm64.sh#a85a688a7b5a536974b939e2b774c0e98b1f9417a81ab01d0ae4ff192d98e2ac" "miniconda" verify_py312 + ;; +"MacOSX-x86_64" ) + install_script "Miniforge3-25.1.1-2-MacOSX-x86_64.sh" "https://github.com/conda-forge/miniforge/releases/download/25.1.1-2/Miniforge3-25.1.1-2-MacOSX-x86_64.sh#172d0445149d85abd266e59d7d829106ab503cd6fba131819c9a1db9daa4e7ea" "miniconda" verify_py312 + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": The binary distribution of Miniforge is not available for $(anaconda_architecture 2>/dev/null || true)." + echo + } >&2 + exit 1 + ;; +esac From 323bd16fbf555ea902a1149a1e896da5e6a84106 Mon Sep 17 00:00:00 2001 From: native-api Date: Wed, 9 Apr 2025 21:56:48 +0300 Subject: [PATCH 237/246] Add CPython 3.9.22, 3.10.17, 3.11.12, 3.12.10, 3.13.3, 3.14.0a7 (#3233) Co-authored-by: Ned Batchelder --- plugins/python-build/share/python-build/3.10.17 | 9 +++++++++ plugins/python-build/share/python-build/3.11.12 | 10 ++++++++++ plugins/python-build/share/python-build/3.12.10 | 9 +++++++++ plugins/python-build/share/python-build/3.13.3 | 9 +++++++++ plugins/python-build/share/python-build/3.13.3t | 2 ++ plugins/python-build/share/python-build/3.14.0a6t | 2 -- .../share/python-build/{3.14.0a6 => 3.14.0a7} | 4 ++-- plugins/python-build/share/python-build/3.14.0a7t | 2 ++ plugins/python-build/share/python-build/3.9.22 | 12 ++++++++++++ 9 files changed, 55 insertions(+), 4 deletions(-) create mode 100644 plugins/python-build/share/python-build/3.10.17 create mode 100644 plugins/python-build/share/python-build/3.11.12 create mode 100644 plugins/python-build/share/python-build/3.12.10 create mode 100644 plugins/python-build/share/python-build/3.13.3 create mode 100644 plugins/python-build/share/python-build/3.13.3t delete mode 100644 plugins/python-build/share/python-build/3.14.0a6t rename plugins/python-build/share/python-build/{3.14.0a6 => 3.14.0a7} (59%) create mode 100644 plugins/python-build/share/python-build/3.14.0a7t create mode 100644 plugins/python-build/share/python-build/3.9.22 diff --git a/plugins/python-build/share/python-build/3.10.17 b/plugins/python-build/share/python-build/3.10.17 new file mode 100644 index 00000000..26e4817f --- /dev/null +++ b/plugins/python-build/share/python-build/3.10.17 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.10.17" "https://www.python.org/ftp/python/3.10.17/Python-3.10.17.tar.xz#4c68050f049d1b4ac5aadd0df5f27941c0350d2a9e7ab0907ee5eb5225d9d6b0" standard verify_py310 copy_python_gdb ensurepip +else + install_package "Python-3.10.17" "https://www.python.org/ftp/python/3.10.17/Python-3.10.17.tgz#8fcda0fbdc131859a4a4223abb925fd522a77e3fb3b52c46cea5f3bc2ae0cd9f" standard verify_py310 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.11.12 b/plugins/python-build/share/python-build/3.11.12 new file mode 100644 index 00000000..ca860cc9 --- /dev/null +++ b/plugins/python-build/share/python-build/3.11.12 @@ -0,0 +1,10 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +install_package "openssl-3.2.4" "https://github.com/openssl/openssl/releases/download/openssl-3.2.4/openssl-3.2.4.tar.gz#b23ad7fd9f73e43ad1767e636040e88ba7c9e5775bfa5618436a0dd2c17c3716" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.11.12" "https://www.python.org/ftp/python/3.11.12/Python-3.11.12.tar.xz#849da87af4df137710c1796e276a955f7a85c9f971081067c8f565d15c352a09" standard verify_py311 copy_python_gdb ensurepip +else + install_package "Python-3.11.12" "https://www.python.org/ftp/python/3.11.12/Python-3.11.12.tgz#379c9929a989a9d65a1f5d854e011f4872b142259f4fc0a8c4062d2815ed7fba" standard verify_py311 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.12.10 b/plugins/python-build/share/python-build/3.12.10 new file mode 100644 index 00000000..75258a1d --- /dev/null +++ b/plugins/python-build/share/python-build/3.12.10 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.3.3" "https://github.com/openssl/openssl/releases/download/openssl-3.3.3/openssl-3.3.3.tar.gz#712590fd20aaa60ec75d778fe5b810d6b829ca7fb1e530577917a131f9105539" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.12.10" "https://www.python.org/ftp/python/3.12.10/Python-3.12.10.tar.xz#07ab697474595e06f06647417d3c7fa97ded07afc1a7e4454c5639919b46eaea" standard verify_py312 copy_python_gdb ensurepip +else + install_package "Python-3.12.10" "https://www.python.org/ftp/python/3.12.10/Python-3.12.10.tgz#15d9c623abfd2165fe816ea1fb385d6ed8cf3c664661ab357f1782e3036a6dac" standard verify_py312 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.3 b/plugins/python-build/share/python-build/3.13.3 new file mode 100644 index 00000000..32f5c79a --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.3 @@ -0,0 +1,9 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.13.3" "https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tar.xz#40f868bcbdeb8149a3149580bb9bfd407b3321cd48f0be631af955ac92c0e041" standard verify_py313 copy_python_gdb ensurepip +else + install_package "Python-3.13.3" "https://www.python.org/ftp/python/3.13.3/Python-3.13.3.tgz#988d735a6d33568cbaff1384a65cb22a1fb18a9ecb73d43ef868000193ce23ed" standard verify_py313 copy_python_gdb ensurepip +fi diff --git a/plugins/python-build/share/python-build/3.13.3t b/plugins/python-build/share/python-build/3.13.3t new file mode 100644 index 00000000..a3bb97b8 --- /dev/null +++ b/plugins/python-build/share/python-build/3.13.3t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.13.3 diff --git a/plugins/python-build/share/python-build/3.14.0a6t b/plugins/python-build/share/python-build/3.14.0a6t deleted file mode 100644 index ab4fc8b2..00000000 --- a/plugins/python-build/share/python-build/3.14.0a6t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a6 diff --git a/plugins/python-build/share/python-build/3.14.0a6 b/plugins/python-build/share/python-build/3.14.0a7 similarity index 59% rename from plugins/python-build/share/python-build/3.14.0a6 rename to plugins/python-build/share/python-build/3.14.0a7 index a674689e..742117b0 100644 --- a/plugins/python-build/share/python-build/3.14.0a6 +++ b/plugins/python-build/share/python-build/3.14.0a7 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.14.0a6" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a6.tar.xz#8d6181e5331d9a2cd6ca405ae1230e88589a043f4768ebb443d3889d45c1c35c" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a7" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a7.tar.xz#71adbcec3ac9edf93308e55cfb4184f2eb4b16fda2bb0a5a382929ed29c8386d" standard verify_py313 copy_python_gdb ensurepip else - install_package "Python-3.14.0a6" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a6.tgz#8129cdb891958eb644856317f91fd1d2f1019745a983b2b01d2506584eb5be3e" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0a7" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a7.tgz#381cc699c1dff5153ab76bff4c6d1f916069be39d0231ee20390f42785b9c046" standard verify_py313 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.14.0a7t b/plugins/python-build/share/python-build/3.14.0a7t new file mode 100644 index 00000000..8ec827fc --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0a7t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a7 diff --git a/plugins/python-build/share/python-build/3.9.22 b/plugins/python-build/share/python-build/3.9.22 new file mode 100644 index 00000000..0e03b4b2 --- /dev/null +++ b/plugins/python-build/share/python-build/3.9.22 @@ -0,0 +1,12 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +# Avoid a compilation error when linking against OpenSSL built with SSLv3 support (fixed in 3.10.0) (#2181) +export PYTHON_CFLAGS="-DOPENSSL_NO_SSL3${PYTHON_CFLAGS:+ $PYTHON_CFLAGS}" + +install_package "openssl-3.0.16" "https://github.com/openssl/openssl/releases/download/openssl-3.0.16/openssl-3.0.16.tar.gz#57e03c50feab5d31b152af2b764f10379aecd8ee92f16c985983ce4a99f7ef86" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.1" "https://ftpmirror.gnu.org/readline/readline-8.1.tar.gz#f8ceb4ee131e3232226a17f51b164afc46cd0b9e6cef344be87c65962cb82b02" mac_readline --if has_broken_mac_readline +if has_tar_xz_support; then + install_package "Python-3.9.22" "https://www.python.org/ftp/python/3.9.22/Python-3.9.22.tar.xz#8c136d199d3637a1fce98a16adc809c1d83c922d02d41f3614b34f8b6e7d38ec" standard verify_py39 copy_python_gdb ensurepip +else + install_package "Python-3.9.22" "https://www.python.org/ftp/python/3.9.22/Python-3.9.22.tgz#76f4daef4ffce6fd107280a0db8d108b1f896c1c22f09d8300efd90a69c4298b" standard verify_py39 copy_python_gdb ensurepip +fi From 97993fcc26999fb9f9d2172afd6914738df274d8 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Wed, 9 Apr 2025 23:00:35 +0300 Subject: [PATCH 238/246] 2.5.5 --- CHANGELOG.md | 6 ++++++ libexec/pyenv---version | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 907e43a3..b2e34408 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Version History +## Release v2.5.5 +* Add graalpy 24.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3215 +* Switch 3.9+ to OpenSSL 3 by @native-api in https://github.com/pyenv/pyenv/pull/3223 +* Add miniforge3-24.11.3-1, miniforge3-24.11.3-2, miniforge3-25.1.1 by @native-api in https://github.com/pyenv/pyenv/pull/3224 +* Add CPython 3.9.22, 3.10.17, 3.11.12, 3.12.10, 3.13.3, 3.14.0a7 by @native-api in https://github.com/pyenv/pyenv/pull/3233 + ## Release v2.5.4 * Add anaconda3-2025.1.1-2 by @binbjz in https://github.com/pyenv/pyenv/pull/3198 * Add PyPy v7.3.19 by @jsirois in https://github.com/pyenv/pyenv/pull/3205 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index 4b074e80..bd7a205c 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.5.4" +version="2.5.5" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 323af282db0a7798090b612065632f7dcef7246c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20=C5=A0im=C3=A1=C4=8Dek?= Date: Wed, 16 Apr 2025 20:08:46 +0200 Subject: [PATCH 239/246] Add GraalPy 24.2.1 (#3238) --- .../share/python-build/graalpy-24.2.1 | 64 +++++++++++++++++++ .../python-build/graalpy-community-24.2.1 | 54 ++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 plugins/python-build/share/python-build/graalpy-24.2.1 create mode 100644 plugins/python-build/share/python-build/graalpy-community-24.2.1 diff --git a/plugins/python-build/share/python-build/graalpy-24.2.1 b/plugins/python-build/share/python-build/graalpy-24.2.1 new file mode 100644 index 00000000..0cf664df --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-24.2.1 @@ -0,0 +1,64 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.1' +BUILD='' + +colorize 1 "GraalPy 23.1 and later installed by python-build use the faster Oracle GraalVM distribution" && echo +colorize 1 "Oracle GraalVM uses the GFTC license, which is free for development and production use, see https://medium.com/graalvm/161527df3d76" && echo +colorize 1 "The GraalVM Community Edition variant of GraalPy is also available, under the name graalpy-community-${VERSION}" && echo + + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="55872af24819cb99efa2338db057aeda0c8f9dd412a4a6f5ea19b256ee82fd9e" + ;; +"linux-aarch64" ) + checksum="2a80800a76ee6b737d6458ba9ab30ce386dfdd5b2b2bec3ee6bc51fd8e51e7c2" + ;; +"macos-amd64" ) + checksum="4bc42b36117c9ab09c4f411ec5a7a85ed58521dd20b529d971bb0ed3d0b7c363" + ;; +"macos-aarch64" ) + checksum="61e11d5176d5bb709b919979ef3525f4db1e39c404b59aa54d887f56bf8fab44" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + { echo + colorize 1 "ERROR" + echo "Oracle GraalPy currently doesn't provide snapshot builds. Use graalpy-community if you need snapshots." + echo + } >&2 + exit 1 +fi + +url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" + +install_package "graalpy-${VERSION}" "${url}" "copy" ensurepip diff --git a/plugins/python-build/share/python-build/graalpy-community-24.2.1 b/plugins/python-build/share/python-build/graalpy-community-24.2.1 new file mode 100644 index 00000000..ca2ee6d7 --- /dev/null +++ b/plugins/python-build/share/python-build/graalpy-community-24.2.1 @@ -0,0 +1,54 @@ +# Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy of +# this software and associated documentation files (the "Software"), to deal in +# the Software without restriction, including without limitation the rights to +# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +# of the Software, and to permit persons to whom the Software is furnished to do +# so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE. +VERSION='24.2.1' +BUILD='' + +graalpy_arch="$(graalpy_architecture 2>/dev/null || true)" + +case "$graalpy_arch" in +"linux-amd64" ) + checksum="96c1f332604f8425df0bb694d435d932cdf21c302e452cd10cf78a1626ba90a0" + ;; +"linux-aarch64" ) + checksum="676eefe6011a1a2c01997c7a3cea92817f0d9de7e608d561eb5255a1e5350eff" + ;; +"macos-amd64" ) + checksum="0d0a50cc93457bdebab992af287a275d0b364fcbd90b68cdf08ae9c64e3a1aca" + ;; +"macos-aarch64" ) + checksum="ec31fc1f024938e6dc193013a365c23ad3d532498c93c80c3af607a853964909" + ;; +* ) + { echo + colorize 1 "ERROR" + echo ": No binary distribution of GraalPy is available for $(uname -sm)." + echo + } >&2 + exit 1 + ;; +esac + +if [ -n "${BUILD}" ]; then + url="https://github.com/graalvm/graalvm-ce-dev-builds/releases/download/${VERSION}-dev-${BUILD}/graalpy-community-dev-${graalpy_arch}.tar.gz" +else + url="https://github.com/oracle/graalpython/releases/download/graal-${VERSION}/graalpy-community-${VERSION}-${graalpy_arch}.tar.gz#${checksum}" +fi + +install_package "graalpy-community-${VERSION}${BUILD}" "${url}" "copy" ensurepip From ee40ad2253c83b317825dba88947bbaa62de1e34 Mon Sep 17 00:00:00 2001 From: David Lawson Date: Tue, 29 Apr 2025 18:58:49 +0100 Subject: [PATCH 240/246] Fix get-pip URLs for 3.7, 3.8 and Pyston (#3242) Co-authored-by: Ivan Pozdeev --- plugins/python-build/bin/python-build | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index de698ce4..03f03ec4 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -2434,6 +2434,12 @@ if [ -z "${GET_PIP_URL}" ]; then 3.6 | 3.6.* | pypy3.6 | pypy3.6-* ) GET_PIP_URL="https://bootstrap.pypa.io/pip/3.6/get-pip.py" ;; + 3.7 | 3.7.* | pypy3.7 | pypy3.7-* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/3.7/get-pip.py" + ;; + 3.8 | 3.8.* | pypy3.8 | pypy3.8-* | pyston* ) + GET_PIP_URL="https://bootstrap.pypa.io/pip/3.8/get-pip.py" + ;; * ) GET_PIP_URL="https://bootstrap.pypa.io/get-pip.py" ;; From bc7b6cb6b50c1bf86891b1a34c43203919fe7ed3 Mon Sep 17 00:00:00 2001 From: native-api Date: Tue, 6 May 2025 19:17:36 +0300 Subject: [PATCH 241/246] Cache `uname` and `sw_vers` output (#3244) Mainly for tests, to avoid having to adjust call counts for stubs when the logic changes --- plugins/python-build/bin/python-build | 30 ++++---- plugins/python-build/test/build.bats | 91 +++++++++++------------- plugins/python-build/test/compiler.bats | 12 ++-- plugins/python-build/test/pyenv_ext.bats | 22 +++--- 4 files changed, 76 insertions(+), 79 deletions(-) diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 03f03ec4..661f4371 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -106,7 +106,7 @@ os_information() { if type -p lsb_release >/dev/null; then lsb_release -sir | xargs echo elif type -p sw_vers >/dev/null; then - echo "OS X $(sw_vers -productVersion)" + echo "OS X ${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)}" elif [ -r /etc/os-release ]; then source /etc/os-release echo "$NAME" $VERSION_ID @@ -117,7 +117,7 @@ os_information() { } is_mac() { - [ "$(uname -s)" = "Darwin" ] || return 1 + [ "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" = "Darwin" ] || return 1 [ $# -eq 0 ] || [ "$(osx_version)" "$@" ] } @@ -140,7 +140,7 @@ can_use_homebrew() { # 10.10 -> 1010 osx_version() { local -a ver - IFS=. ver=( `sw_vers -productVersion` ) + IFS=. ver=( ${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)} ) IFS="$OLDIFS" echo $(( ${ver[0]}*100 + ${ver[1]} )) } @@ -179,7 +179,7 @@ file_is_not_empty() { num_cpu_cores() { local num - case "$(uname -s)" in + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in Darwin | *BSD ) num="$(sysctl -n hw.ncpu 2>/dev/null || true)" ;; @@ -971,7 +971,7 @@ build_package_micropython() { } pypy_architecture() { - case "$(uname -s)" in + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in "Darwin" ) case "$(uname -m)" in "arm64" ) echo "osarm64" ;; @@ -1003,7 +1003,7 @@ pypy_architecture() { } graalpy_architecture() { - case "$(uname -s)" in + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in "Darwin" ) case "$(uname -m)" in "x86_64" ) echo "macos-amd64" ;; @@ -1084,7 +1084,7 @@ build_package_pypy_builder() { } activepython_architecture() { - case "$(uname -s)" in + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in "Darwin" ) echo "macosx10.9-i386-x86_64" ;; "Linux" ) case "$(uname -m)" in @@ -1104,7 +1104,7 @@ build_package_activepython() { } anaconda_architecture() { - case "$(uname -s)" in + case "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" in "Darwin" ) case "$(uname -m)" in "arm64" ) echo "MacOSX-arm64" ;; @@ -1381,7 +1381,7 @@ require_osx_version() { function version { echo "$@" | awk -F. '{ printf("%d%03d%03d%03d\n", $1,$2,$3,$4); }'; } local required_version="$@" - local osx_version="$(sw_vers -productVersion)" + local osx_version="${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)}" if [[ $(version $osx_version) -ge $(version $required_version) ]]; then return 0 fi @@ -1457,14 +1457,14 @@ use_homebrew_yaml() { use_freebsd_pkg() { # check if FreeBSD - if [ "FreeBSD" = "$(uname -s)" ]; then + if [ "FreeBSD" = "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" ]; then # use openssl if installed from Ports Collection if pkg info -e openssl; then package_option python configure --with-openssl="/usr/local" fi # check if 11-R or later - release="$(uname -r)" + release="${_PYTHON_BUILD_CACHE_UNAME_R:=$(uname -r)}" if [ "${release%%.*}" -ge 11 ]; then # Use packages from Ports Collection. # @@ -2251,11 +2251,13 @@ if [ -n "$noexec" ]; then fi if [ -z "$MAKE" ]; then - if [ "FreeBSD" = "$(uname -s)" ]; then + if [ "FreeBSD" = "${_PYTHON_BUILD_CACHE_UNAME_S:=$(uname -s)}" ]; then if [ "$(echo $1 | sed 's/-.*$//')" = "jruby" ]; then export MAKE="gmake" else - if [ "$(uname -r | sed 's/[^[:digit:]].*//')" -lt 10 ]; then + # var assignment inside $() does not propagate due to being in subshell + : "${_PYTHON_BUILD_CACHE_UNAME_R:=$(uname -r)}" + if [ "$(echo "$_PYTHON_BUILD_CACHE_UNAME_R" | sed 's/[^[:digit:]].*//')" -lt 10 ]; then export MAKE="gmake" else export MAKE="make" @@ -2450,7 +2452,7 @@ fi # Set MACOSX_DEPLOYMENT_TARGET from the product version of OS X (#219, #220) if is_mac; then if [ -z "${MACOSX_DEPLOYMENT_TARGET}" ]; then - MACOS_VERSION="$(sw_vers -productVersion 2>/dev/null || true)" + MACOS_VERSION="${_PYTHON_BUILD_CACHE_SW_VERS:=$(sw_vers -productVersion)}" MACOS_VERSION_ARRAY=(${MACOS_VERSION//\./ }) if [ "${#MACOS_VERSION_ARRAY[@]}" -ge 2 ]; then export MACOSX_DEPLOYMENT_TARGET="${MACOS_VERSION_ARRAY[0]}.${MACOS_VERSION_ARRAY[1]}" diff --git a/plugins/python-build/test/build.bats b/plugins/python-build/test/build.bats index 8e3ce566..b0b054cf 100644 --- a/plugins/python-build/test/build.bats +++ b/plugins/python-build/test/build.bats @@ -62,7 +62,7 @@ assert_build_log() { cached_tarball "yaml-0.1.6" cached_tarball "Python-3.6.2" - for i in {1..10}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' stub brew false stub_make_install stub_make_install @@ -104,7 +104,7 @@ OUT cached_tarball "yaml-0.1.6" "$yaml_configure" cached_tarball "Python-3.6.2" - for i in {1..10}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' stub brew false stub_make_install stub_make_install "$PYTHON_MAKE_INSTALL_TARGET" @@ -132,7 +132,7 @@ OUT cached_tarball "yaml-0.1.6" cached_tarball "Python-3.6.2" - for i in {1..10}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' stub brew false stub_make_install stub_make_install @@ -162,7 +162,7 @@ OUT cached_tarball "yaml-0.1.6" cached_tarball "Python-3.6.2" - for i in {1..10}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' stub brew false stub_make_install stub_make_install @@ -194,8 +194,8 @@ OUT BREW_PREFIX="$TMP/homebrew-prefix" mkdir -p "$BREW_PREFIX" - for i in {1..9}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' stub brew "--prefix : echo '$BREW_PREFIX'" false stub_make_install @@ -222,8 +222,8 @@ OUT brew_libdir="$TMP/homebrew-yaml" mkdir -p "$brew_libdir" - for i in {1..10}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' stub brew "--prefix libyaml : echo '$brew_libdir'" for i in {1..6}; do stub brew false; done stub_make_install @@ -249,8 +249,8 @@ OUT readline_libdir="$TMP/homebrew-readline" mkdir -p "$readline_libdir" - for i in {1..8}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' for i in {1..3}; do stub brew false; done stub brew "--prefix readline : echo '$readline_libdir'" for i in {1..2}; do stub brew false; done @@ -279,8 +279,8 @@ OUT ncurses_libdir="$TMP/homebrew-ncurses" mkdir -p "$ncurses_libdir" - for i in {1..9}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' for i in {1..4}; do stub brew false; done stub brew "--prefix ncurses : echo '$ncurses_libdir'" stub brew false @@ -307,9 +307,8 @@ OUT @test "openssl is linked from Ports in FreeBSD if present" { cached_tarball "Python-3.6.2" - for i in {1..7}; do stub uname '-s : echo FreeBSD'; done + stub uname '-s : echo FreeBSD' stub uname '-r : echo 11.0-RELEASE' - for i in {1..3}; do stub uname '-s : echo FreeBSD'; done stub sysctl '-n hw.ncpu : echo 1' stub pkg "info -e openssl : true" @@ -341,9 +340,8 @@ OUT for lib in readline sqlite3; do - for i in {1..7}; do stub uname '-s : echo FreeBSD'; done + stub uname '-s : echo FreeBSD' stub uname '-r : echo 11.0-RELEASE' - for i in {1..3}; do stub uname '-s : echo FreeBSD'; done stub sysctl '-n hw.ncpu : echo 1' stub pkg false @@ -376,8 +374,8 @@ OUT @test "homebrew is not touched if PYTHON_BUILD_SKIP_HOMEBREW is set" { cached_tarball "Python-3.6.2" - for i in {1..4}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' stub brew true; brew stub_make_install export PYTHON_BUILD_SKIP_HOMEBREW=1 @@ -405,7 +403,7 @@ OUT BREW_PREFIX="$TMP/homebrew-prefix" mkdir -p "$BREW_PREFIX" - for i in {1..4}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' stub brew "--prefix : echo '$BREW_PREFIX'" for i in {1..5}; do stub brew false; done stub_make_install @@ -435,7 +433,7 @@ OUT BREW_PREFIX="${BREW_PREFIX%/*}" BREW_PREFIX="${BREW_PREFIX%/*}" - for i in {1..4}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' stub brew "--prefix : echo '$BREW_PREFIX'" for i in {1..5}; do stub brew false; done stub_make_install @@ -464,7 +462,7 @@ OUT BREW_PREFIX="$TMP/homebrew-prefix" mkdir -p "$BREW_PREFIX" - for i in {1..9}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' for i in {1..5}; do stub brew "--prefix : echo '$BREW_PREFIX'"; done stub_make_install @@ -493,8 +491,8 @@ OUT mkdir -p "$readline_libdir/include/readline" touch "$readline_libdir/include/readline/rlconf.h" - for i in {1..8}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' for i in {1..5}; do stub brew false; done stub_make_install @@ -525,8 +523,8 @@ OUT mkdir -p "$tcl_tk_libdir/lib" echo "TCL_VERSION='$tcl_tk_version'" >>"$tcl_tk_libdir/lib/tclConfig.sh" - for i in {1..9}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' stub brew false stub brew "--prefix tcl-tk@8 : echo '$tcl_tk_libdir'" @@ -559,8 +557,8 @@ OUT tcl_tk_version_long="8.6.10" tcl_tk_version="${tcl_tk_version_long%.*}" - for i in {1..8}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' for i in {1..4}; do stub brew false; done stub_make_install @@ -587,8 +585,8 @@ OUT @test "tcl-tk is linked from Homebrew via pkgconfig only when envvar is set" { cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' tcl_tk_libdir="$TMP/homebrew-tcl-tk" mkdir -p "$tcl_tk_libdir/lib" @@ -620,8 +618,8 @@ OUT @test "number of CPU cores defaults to 2" { cached_tarball "Python-3.6.2" - for i in {1..10}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 10.10'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 10.10' stub sysctl false stub_make_install @@ -647,8 +645,8 @@ OUT @test "number of CPU cores is detected on Mac" { cached_tarball "Python-3.6.2" - for i in {1..10}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 10.10'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 10.10' stub sysctl '-n hw.ncpu : echo 4' stub_make_install @@ -675,9 +673,8 @@ OUT @test "number of CPU cores is detected on FreeBSD" { cached_tarball "Python-3.6.2" - for i in {1..7}; do stub uname '-s : echo FreeBSD'; done + stub uname '-s : echo FreeBSD' stub uname '-r : echo 11.0-RELEASE' - for i in {1..3}; do stub uname '-s : echo FreeBSD'; done for i in {1..3}; do stub pkg false; done stub sysctl '-n hw.ncpu : echo 1' @@ -704,7 +701,7 @@ OUT @test "setting PYTHON_MAKE_INSTALL_OPTS to a multi-word string" { cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' stub_make_install @@ -728,7 +725,7 @@ OUT @test "--enable-shared is not added if --disable-shared is passed" { cached_tarball "Python-3.6.2" - for i in {1..9}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' stub_make_install @@ -752,8 +749,8 @@ OUT @test "configuring with dSYM in MacOS" { cached_tarball "Python-3.6.2" - for i in {1..10}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 1010'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 1010' for i in {1..6}; do stub brew false; done stub_make_install @@ -779,7 +776,7 @@ OUT @test "configuring with dSYM has no effect in non-MacOS" { cached_tarball "Python-3.6.2" - for i in {1..10}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' stub_make_install run_inline_definition <> build.log' stub_make_install diff --git a/plugins/python-build/test/compiler.bats b/plugins/python-build/test/compiler.bats index 61ff22be..9ca1735c 100644 --- a/plugins/python-build/test/compiler.bats +++ b/plugins/python-build/test/compiler.bats @@ -9,8 +9,8 @@ export -n PYTHON_CONFIGURE_OPTS @test "require_gcc on OS X 10.9" { - for i in {1..3}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 10.9.5'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 10.9.5' stub gcc '--version : echo 4.2.1' @@ -31,8 +31,8 @@ OUT } @test "require_gcc on OS X 10.10" { - for i in {1..3}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 10.10'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 10.10' stub gcc '--version : echo 4.2.1' @@ -69,8 +69,8 @@ DEF mkdir -p "$INSTALL_ROOT" cd "$INSTALL_ROOT" - for i in {1..10}; do stub uname '-s : echo Darwin'; done - for i in {1..3}; do stub sw_vers '-productVersion : echo 10.10'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 10.10' stub cc 'false' stub brew 'false' diff --git a/plugins/python-build/test/pyenv_ext.bats b/plugins/python-build/test/pyenv_ext.bats index a4d45901..1c4b47a7 100644 --- a/plugins/python-build/test/pyenv_ext.bats +++ b/plugins/python-build/test/pyenv_ext.bats @@ -144,7 +144,7 @@ OUT echo "bar" | install_patch definitions/vanilla-python "Python-3.6.2/bar.patch" echo "baz" | install_patch definitions/vanilla-python "Python-3.6.2/baz.patch" - for i in {1..2}; do stub uname '-s : echo Linux'; done + stub uname '-s : echo Linux' TMPDIR="$TMP" install_tmp_fixture definitions/vanilla-python < /dev/null assert_success @@ -171,7 +171,7 @@ OUT " : echo \"$MAKE \$@\" >> build.log" \ " : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" - for i in {1..4}; do stub uname '-s : echo Darwin'; done + stub uname '-s : echo Darwin' PYTHON_MAKE_INSTALL_TARGET="altinstall" TMPDIR="$TMP" install_tmp_fixture definitions/vanilla-python < /dev/null assert_success @@ -253,7 +253,8 @@ OUT done unset framework_path executable - for i in {1..3}; do stub uname '-s : echo Darwin'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 10.10' PYTHON_CONFIGURE_OPTS="--enable-framework" TMPDIR="$TMP" run_inline_definition <> build.log" \ " : echo \"$MAKE \$@\" >> build.log && cat build.log >> '$INSTALL_ROOT/build.log'" @@ -346,8 +350,8 @@ OUT @test "default MACOSX_DEPLOYMENT_TARGET" { # yyuu/pyenv#257 - for i in {1..3}; do stub uname '-s : echo Darwin'; done - for i in {1..2}; do stub sw_vers '-productVersion : echo 10.10'; done + stub uname '-s : echo Darwin' + stub sw_vers '-productVersion : echo 10.10' TMPDIR="$TMP" run_inline_definition < Date: Wed, 7 May 2025 13:07:33 -0600 Subject: [PATCH 242/246] Add CPython 3.14.0b1 --- plugins/python-build/bin/python-build | 7 ++++++- plugins/python-build/share/python-build/3.14.0a7t | 2 -- .../python-build/share/python-build/{3.14.0a7 => 3.14.0b1} | 4 ++-- plugins/python-build/share/python-build/3.14.0b1t | 2 ++ 4 files changed, 10 insertions(+), 5 deletions(-) delete mode 100644 plugins/python-build/share/python-build/3.14.0a7t rename plugins/python-build/share/python-build/{3.14.0a7 => 3.14.0b1} (59%) create mode 100644 plugins/python-build/share/python-build/3.14.0b1t diff --git a/plugins/python-build/bin/python-build b/plugins/python-build/bin/python-build index 661f4371..b8b1b922 100755 --- a/plugins/python-build/bin/python-build +++ b/plugins/python-build/bin/python-build @@ -2040,7 +2040,12 @@ build_package_verify_py313() { # Post-install check for Python 3.14.x build_package_verify_py314() { - build_package_verify_py313 "$1" "${2:-3.13}" + build_package_verify_py313 "$1" "${2:-3.14}" +} + +# Post-install check for Python 3.15.x +build_package_verify_py315() { + build_package_verify_py314 "$1" "${2:-3.15}" } # Post-install check for Python 3.x rolling release scripts diff --git a/plugins/python-build/share/python-build/3.14.0a7t b/plugins/python-build/share/python-build/3.14.0a7t deleted file mode 100644 index 8ec827fc..00000000 --- a/plugins/python-build/share/python-build/3.14.0a7t +++ /dev/null @@ -1,2 +0,0 @@ -export PYTHON_BUILD_FREE_THREADING=1 -source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0a7 diff --git a/plugins/python-build/share/python-build/3.14.0a7 b/plugins/python-build/share/python-build/3.14.0b1 similarity index 59% rename from plugins/python-build/share/python-build/3.14.0a7 rename to plugins/python-build/share/python-build/3.14.0b1 index 742117b0..bf985385 100644 --- a/plugins/python-build/share/python-build/3.14.0a7 +++ b/plugins/python-build/share/python-build/3.14.0b1 @@ -3,7 +3,7 @@ export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline if has_tar_xz_support; then - install_package "Python-3.14.0a7" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a7.tar.xz#71adbcec3ac9edf93308e55cfb4184f2eb4b16fda2bb0a5a382929ed29c8386d" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0b1" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0b1.tar.xz#2ddd30a77c9f62e065ce648664a254b9b0c011bcdaa8c1c2787087e644cbeb39" standard verify_py314 copy_python_gdb ensurepip else - install_package "Python-3.14.0a7" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0a7.tgz#381cc699c1dff5153ab76bff4c6d1f916069be39d0231ee20390f42785b9c046" standard verify_py313 copy_python_gdb ensurepip + install_package "Python-3.14.0b1" "https://www.python.org/ftp/python/3.14.0/Python-3.14.0b1.tgz#d6c4473fce72fb6b881c1f50fbfcf157be2caa56102f01bd9dda8a459b880a37" standard verify_py314 copy_python_gdb ensurepip fi diff --git a/plugins/python-build/share/python-build/3.14.0b1t b/plugins/python-build/share/python-build/3.14.0b1t new file mode 100644 index 00000000..3ef12c7f --- /dev/null +++ b/plugins/python-build/share/python-build/3.14.0b1t @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.14.0b1 From f4b94c14a6a17373b09ba19373103c96a0558d4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez-Mondrag=C3=B3n?= Date: Wed, 7 May 2025 13:53:53 -0600 Subject: [PATCH 243/246] Add CPython 3.15-dev --- plugins/python-build/share/python-build/3.15-dev | 7 +++++++ plugins/python-build/share/python-build/3.15t-dev | 2 ++ 2 files changed, 9 insertions(+) create mode 100644 plugins/python-build/share/python-build/3.15-dev create mode 100644 plugins/python-build/share/python-build/3.15t-dev diff --git a/plugins/python-build/share/python-build/3.15-dev b/plugins/python-build/share/python-build/3.15-dev new file mode 100644 index 00000000..52ddebf8 --- /dev/null +++ b/plugins/python-build/share/python-build/3.15-dev @@ -0,0 +1,7 @@ +prefer_openssl3 +export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1 +export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 +export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 +install_package "openssl-3.4.1" "https://github.com/openssl/openssl/releases/download/openssl-3.4.1/openssl-3.4.1.tar.gz#002a2d6b30b58bf4bea46c43bdd96365aaf8daa6c428782aa4feee06da197df3" mac_openssl --if has_broken_mac_openssl +install_package "readline-8.2" "https://ftpmirror.gnu.org/readline/readline-8.2.tar.gz#3feb7171f16a84ee82ca18a36d7b9be109a52c04f492a053331d7d1095007c35" mac_readline --if has_broken_mac_readline +install_git "Python-3.15-dev" "https://github.com/python/cpython" main standard verify_py315 copy_python_gdb ensurepip diff --git a/plugins/python-build/share/python-build/3.15t-dev b/plugins/python-build/share/python-build/3.15t-dev new file mode 100644 index 00000000..f86423c3 --- /dev/null +++ b/plugins/python-build/share/python-build/3.15t-dev @@ -0,0 +1,2 @@ +export PYTHON_BUILD_FREE_THREADING=1 +source "$(dirname "${BASH_SOURCE[0]}")"/3.15-dev From 6fff3d29d475b879955476ad1899ce5078631d05 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Thu, 8 May 2025 17:12:28 +0300 Subject: [PATCH 244/246] 2.5.6 --- CHANGELOG.md | 6 ++++++ libexec/pyenv---version | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b2e34408..fafd4240 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Version History +## Release v2.5.6 +* Add GraalPy 24.2.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3238 +* Fix get-pip URLs for 3.7, 3.8 and Pyston by @dmrlawson in https://github.com/pyenv/pyenv/pull/3242 +* [CI] Cache `uname` and `sw_vers` output in Python-Build for easier mocking in tests by @native-api in https://github.com/pyenv/pyenv/pull/3244 +* Add CPython 3.14.0b1 and 3.15-dev by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3245 + ## Release v2.5.5 * Add graalpy 24.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3215 * Switch 3.9+ to OpenSSL 3 by @native-api in https://github.com/pyenv/pyenv/pull/3223 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index bd7a205c..e6fdf778 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.5.5" +version="2.5.6" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then From 54fd0106f86f477dd37387140351579ed67aed34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Ram=C3=ADrez=20Mondrag=C3=B3n?= Date: Thu, 8 May 2025 15:51:24 -0600 Subject: [PATCH 245/246] Point 3.14-dev to `3.14` branch (#3246) --- plugins/python-build/share/python-build/3.14-dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/python-build/share/python-build/3.14-dev b/plugins/python-build/share/python-build/3.14-dev index 9ce786be..71a74ac5 100644 --- a/plugins/python-build/share/python-build/3.14-dev +++ b/plugins/python-build/share/python-build/3.14-dev @@ -4,4 +4,4 @@ export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1 export PYTHON_BUILD_CONFIGURE_WITH_DSYMUTIL=1 install_package "openssl-3.3.0" "https://www.openssl.org/source/openssl-3.3.0.tar.gz#53e66b043322a606abf0087e7699a0e033a37fa13feb9742df35c3a33b18fb02" mac_openssl --if has_broken_mac_openssl install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline -install_git "Python-3.14-dev" "https://github.com/python/cpython" main standard verify_py314 copy_python_gdb ensurepip +install_git "Python-3.14-dev" "https://github.com/python/cpython" 3.14 standard verify_py314 copy_python_gdb ensurepip From f216b4bfb1598347137ecb3c4a8f893baf9ea37f Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Fri, 9 May 2025 00:52:54 +0300 Subject: [PATCH 246/246] 2.5.7 --- CHANGELOG.md | 3 +++ libexec/pyenv---version | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fafd4240..8f70111e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,8 @@ # Version History +## Release v2.5.7 +* Point 3.14-dev to `3.14` branch by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3246 + ## Release v2.5.6 * Add GraalPy 24.2.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3238 * Fix get-pip URLs for 3.7, 3.8 and Pyston by @dmrlawson in https://github.com/pyenv/pyenv/pull/3242 diff --git a/libexec/pyenv---version b/libexec/pyenv---version index e6fdf778..fa9a2df3 100755 --- a/libexec/pyenv---version +++ b/libexec/pyenv---version @@ -12,7 +12,7 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -version="2.5.6" +version="2.5.7" git_revision="" if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then

%9?XMJkwo=w^E{l>Im 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