Compare commits

..

No commits in common. "master" and "v2.6.18" have entirely different histories.

14 changed files with 25 additions and 216 deletions

View File

@ -4,7 +4,7 @@ on:
workflow_dispatch: {} workflow_dispatch: {}
schedule: schedule:
# Every N hours # Every N hours
- cron: '0 */4 * * *' - cron: '* */8 * * *'
permissions: permissions:
contents: write contents: write
@ -27,7 +27,6 @@ jobs:
python plugins/python-build/scripts/add_cpython.py --verbose >added_versions.lst && rc=$? || rc=$? python plugins/python-build/scripts/add_cpython.py --verbose >added_versions.lst && rc=$? || rc=$?
echo "rc=$rc" >> $GITHUB_ENV echo "rc=$rc" >> $GITHUB_ENV
- name: set PR properties - name: set PR properties
if: env.rc == 0
shell: python shell: python
run: | run: |
import os import os
@ -35,7 +34,7 @@ jobs:
versions=[l.rstrip() for l in open("added_versions.lst")] versions=[l.rstrip() for l in open("added_versions.lst")]
with open(os.environ['GITHUB_ENV'],'a') as f: with open(os.environ['GITHUB_ENV'],'a') as f:
f.write(f'branch_name=auto_add_version/{"_".join(versions)}\n') f.write(f'branch_name=auto_add_version/{"_".join(versions)}\n')
f.write(f'pr_name=Add CPython {", ".join(versions)}\n') f.write(f'pr_name=Add {", ".join(versions)}\n')
os.remove("added_versions.lst") os.remove("added_versions.lst")
- name: Create Pull Request - name: Create Pull Request
@ -44,4 +43,3 @@ jobs:
with: with:
branch: ${{ env.branch_name }} branch: ${{ env.branch_name }}
title: ${{ env.pr_name }} title: ${{ env.pr_name }}
token: ${{ secrets.TOKEN_AUTO_PR }}

View File

@ -56,14 +56,6 @@ jobs:
if name == 'anaconda3' and version >= packaging.version.Version('2025.12'): if name == 'anaconda3' and version >= packaging.version.Version('2025.12'):
result.append({'os':'macos-15-intel','python-version':line}) result.append({'os':'macos-15-intel','python-version':line})
if m:=re.match(r'graalpy-(community-)?-(\d+\.\d+.\d+)', line):
version = packaging.version.Version(m.group(2))
# GraalPy dropped MacOS x64 support
if version >= packaging.version.Version('25.0.2'):
result.append({'os':'macos-15-intel','python-version':line})
EOF = str(random.getrandbits(15*8)) EOF = str(random.getrandbits(15*8))
with open(os.environ['GITHUB_ENV'],'w') as f: with open(os.environ['GITHUB_ENV'],'w') as f:

View File

@ -1,19 +1,5 @@
# Version History # Version History
## Release v2.6.22
* Add CPython 3.13.12 by @github-actions[bot] in https://github.com/pyenv/pyenv/pull/3401
## Release v2.6.21
* Add GraalPy 25.0.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3395
* Add CPython 3.14.3 by @github-actions[bot] in https://github.com/pyenv/pyenv/pull/3400
## Release v2.6.20
* CI: adjust CPython PR generation logic by @native-api in https://github.com/pyenv/pyenv/pull/3392
* Add CPython 3.15.0a5 by @nedbat in https://github.com/pyenv/pyenv/pull/3393
## Release v2.6.19
* Add CPython 3.15.0a4 by @nedbat in https://github.com/pyenv/pyenv/pull/3390
## Release v2.6.18 ## Release v2.6.18
* Fix an infinite loop if a shim is symlinked to and called from a different location with "system" version active by @native-api in https://github.com/pyenv/pyenv/pull/3375 * Fix an infinite loop if a shim is symlinked to and called from a different location with "system" version active by @native-api in https://github.com/pyenv/pyenv/pull/3375
* CI: Update and cleanup workflow scripts by @native-api in https://github.com/pyenv/pyenv/pull/3372 * CI: Update and cleanup workflow scripts by @native-api in https://github.com/pyenv/pyenv/pull/3372

View File

@ -12,7 +12,7 @@
set -e set -e
[ -n "$PYENV_DEBUG" ] && set -x [ -n "$PYENV_DEBUG" ] && set -x
version="2.6.22" version="2.6.18"
git_revision="" git_revision=""
if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then if cd "${BASH_SOURCE%/*}" 2>/dev/null && git remote -v 2>/dev/null | grep -q pyenv; then

View File

@ -14,7 +14,7 @@
# -g/--debug Build a debug version # -g/--debug Build a debug version
# #
PYTHON_BUILD_VERSION="2.6.22" PYTHON_BUILD_VERSION="2.6.18"
OLDIFS="$IFS" OLDIFS="$IFS"

View File

@ -13,11 +13,9 @@ import io
import itertools import itertools
import logging import logging
import operator import operator
import os.path
import pathlib import pathlib
import pprint import pprint
import re import re
import subprocess
import sys import sys
import typing import typing
import urllib.parse import urllib.parse
@ -42,8 +40,7 @@ OUT_DIR: pathlib.Path = here.parent.parent / "share" / "python-build"
T_THUNK=\ T_THUNK=\
'''export PYTHON_BUILD_FREE_THREADING=1 '''export PYTHON_BUILD_FREE_THREADING=1
source "${BASH_SOURCE[0]%t}" source "${BASH_SOURCE[0]%t}"'''
'''
def adapt_script(version: packaging.version.Version, def adapt_script(version: packaging.version.Version,
@ -123,7 +120,7 @@ def add_version(version: packaging.version.Version):
return False return False
VersionDirectory.existing.append(_CPythonExistingScriptInfo(version,str(new_path))) VersionDirectory.existing.append(_CPythonExistingScriptInfo(version,str(new_path)))
cleanup_prerelease_upgrade(is_prerelease_upgrade, previous_version, version) cleanup_prerelease_upgrade(is_prerelease_upgrade, previous_version)
handle_t_thunks(version, previous_version, is_prerelease_upgrade) handle_t_thunks(version, previous_version, is_prerelease_upgrade)
@ -133,55 +130,26 @@ def add_version(version: packaging.version.Version):
def cleanup_prerelease_upgrade( def cleanup_prerelease_upgrade(
is_prerelease_upgrade: bool, is_prerelease_upgrade: bool,
previous_version: packaging.version.Version, previous_version: packaging.version.Version)\
new_version: packaging.version.Version)\
-> None: -> None:
if not is_prerelease_upgrade: if is_prerelease_upgrade:
return previous_version_path = OUT_DIR / str(previous_version)
logger.info(f'Deleting {previous_version_path}')
previous_version_filename = str(previous_version) previous_version_path.unlink()
new_version_filename = str(new_version) del VersionDirectory.existing[previous_version]
new_version_path = OUT_DIR / new_version_filename
logger.info(f'Git moving {previous_version_filename} '
f'to {new_version_filename} (preserving new data)')
data = new_version_path.read_text()
new_version_path.unlink()
subprocess.check_call(("git","-C",OUT_DIR,
"mv",
previous_version_filename,
new_version_filename))
new_version_path.write_text(data)
del VersionDirectory.existing[previous_version]
def handle_t_thunks(version, previous_version, is_prerelease_upgrade): def handle_t_thunks(version, previous_version, is_prerelease_upgrade):
if (version.major, version.minor) < (3, 13): if (version.major, version.minor) >= (3, 13):
return # an old thunk may have older version-specific code
# so it's safer to write a known version-independent template
# an old thunk may have older version-specific code thunk_path = OUT_DIR.joinpath(str(version) + "t")
# so it's safer to write a known version-independent template logger.info(f"Writing {thunk_path}")
thunk_name = (str(version) + "t") thunk_path.write_text(T_THUNK, encoding='utf-8')
thunk_path = OUT_DIR / thunk_name if is_prerelease_upgrade:
previous_thunk_name = str(previous_version) + "t" previous_thunk_path = OUT_DIR.joinpath(str(previous_version) + "t")
previous_thunk_path = OUT_DIR / previous_thunk_name logger.info(f"Deleting {previous_thunk_path}")
if is_prerelease_upgrade: previous_thunk_path.unlink()
logger.info(f"Git moving {previous_thunk_name} to {thunk_name}")
subprocess.check_call(("git","-C",OUT_DIR,
"mv",
previous_thunk_name,
thunk_name))
else:
logger.info(f"Deleting {previous_thunk_path}")
previous_thunk_path.unlink()
logger.info(f"Writing {thunk_path}")
thunk_path.write_text(T_THUNK, encoding='utf-8')
Arguments: argparse.Namespace Arguments: argparse.Namespace
@ -500,13 +468,10 @@ class ReadlineVersionsDirectory(KeyedList[_ReadlineVersionInfo, packaging.versio
max_item = candidates._latest_release() max_item = candidates._latest_release()
hash_ = Url.sha256_url(max_item.url, VersionDirectory.session) hash_ = Url.sha256_url(max_item.url, VersionDirectory.session)
permalink = 'https://ftpmirror.gnu.org/readline/' +\
os.path.basename(urllib.parse.urlparse(max_item.url).path)
result = _ReadlineVersionInfo( result = _ReadlineVersionInfo(
max_item.version, max_item.version,
max_item.package_name, max_item.package_name,
permalink, max_item.url,
hash_) hash_)
self.append(result) self.append(result)

View File

@ -1,10 +0,0 @@
prefer_openssl3
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl
install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline
if has_tar_xz_support; then
install_package "Python-3.13.12" "https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tar.xz#2a84cd31dd8d8ea8aaff75de66fc1b4b0127dd5799aa50a64ae9a313885b4593" standard verify_py313 copy_python_gdb ensurepip
else
install_package "Python-3.13.12" "https://www.python.org/ftp/python/3.13.12/Python-3.13.12.tgz#12e7cb170ad2d1a69aee96a1cc7fc8de5b1e97a2bdac51683a3db016ec9a2996" standard verify_py313 copy_python_gdb ensurepip
fi

View File

@ -1,10 +0,0 @@
prefer_openssl3
export PYTHON_BUILD_CONFIGURE_WITH_OPENSSL=1
export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
install_package "openssl-3.6.1" "https://github.com/openssl/openssl/releases/download/openssl-3.6.1/openssl-3.6.1.tar.gz#b1bfedcd5b289ff22aee87c9d600f515767ebf45f77168cb6d64f231f518a82e" mac_openssl --if has_broken_mac_openssl
install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline
if has_tar_xz_support; then
install_package "Python-3.14.3" "https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tar.xz#a97d5549e9ad81fe17159ed02c68774ad5d266c72f8d9a0b5a9c371fe85d902b" standard verify_py314 copy_python_gdb ensurepip
else
install_package "Python-3.14.3" "https://www.python.org/ftp/python/3.14.3/Python-3.14.3.tgz#d7fe130d0501ae047ca318fa92aa642603ab6f217901015a1df6ce650d5470cd" standard verify_py314 copy_python_gdb ensurepip
fi

View File

@ -4,7 +4,7 @@ export PYTHON_BUILD_TCLTK_USE_PKGCONFIG=1
install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl install_package "openssl-3.6.0" "https://github.com/openssl/openssl/releases/download/openssl-3.6.0/openssl-3.6.0.tar.gz#b6a5f44b7eb69e3fa35dbf15524405b44837a481d43d81daddde3ff21fcbb8e9" mac_openssl --if has_broken_mac_openssl
install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline install_package "readline-8.3" "https://ftpmirror.gnu.org/readline/readline-8.3.tar.gz#fe5383204467828cd495ee8d1d3c037a7eba1389c22bc6a041f627976f9061cc" mac_readline --if has_broken_mac_readline
if has_tar_xz_support; then if has_tar_xz_support; then
install_package "Python-3.15.0a5" "https://www.python.org/ftp/python/3.15.0/Python-3.15.0a5.tar.xz#fee40da6450b67547c079dcb2852e8a03db6d57e06415466b2d3294449db22ef" standard verify_py315 copy_python_gdb ensurepip install_package "Python-3.15.0a3" "https://www.python.org/ftp/python/3.15.0/Python-3.15.0a3.tar.xz#6ab02cdac24505779877bb1d9189432d67e90ddf2a9b8b7b373ead54ac07b607" standard verify_py315 copy_python_gdb ensurepip
else else
install_package "Python-3.15.0a5" "https://www.python.org/ftp/python/3.15.0/Python-3.15.0a5.tgz#c4b535cd6f4c07889a53ce68fedf00c77c720086ab018723a8b5079b25a1e051" standard verify_py315 copy_python_gdb ensurepip install_package "Python-3.15.0a3" "https://www.python.org/ftp/python/3.15.0/Python-3.15.0a3.tgz#a8afd71361baf8f02f459a4ab9b73eb4cdf2895991218b8418cf7ba49c96bef7" standard verify_py315 copy_python_gdb ensurepip
fi fi

View File

@ -1,61 +0,0 @@
# Copyright (c) 2026, 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='25.0.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="8967e4bae1c5040d62dbc98976f2099d5c36c00a79944e99b848d455e618ecdf"
;;
"linux-aarch64" )
checksum="805f3526296e04692b27ca001ba97674e53d0f036412d9ffc29aeb8b51517ab6"
;;
"macos-aarch64" )
checksum="c771688b8636932026180bdd9b5e3d6116316fa868faf7e602a60ba020c7bade"
;;
* )
{ 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

View File

@ -1,51 +0,0 @@
# Copyright (c) 2026, 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='25.0.2'
BUILD=''
graalpy_arch="$(graalpy_architecture 2>/dev/null || true)"
case "$graalpy_arch" in
"linux-amd64" )
checksum="8db86f13c0b701bab0780e8821052a40303c08b83fdc9c21da06605d14d4cc79"
;;
"linux-aarch64" )
checksum="98f7b9dea867c45cde5c2886b7544bd267242b2fa93586f2c9d3d38e88d5d109"
;;
"macos-aarch64" )
checksum="c64bef17f34d42327d5c3fe40c05eddf791c3653cc8366f6bf1149b51ce9d517"
;;
* )
{ 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