Compare commits

..

1215 commits

Author SHA1 Message Date
Ayush eb36c1b1e8
CI: publish Ubuntu binary packages (#3539)
Some checks failed
build / discover_build_logic_change (push) Waiting to run
build / build (push) Blocked by required conditions
pyenv_tests / pyenv_tests (macos-15) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-15-intel) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-26) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04-arm) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04-arm) (push) Waiting to run
pyenv_tests / pyenv_tests_docker (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
* CI: Add Ubuntu binary publishing workflow
2026-09-11 15:21:26 +03:00
native-api ef4905cd81
Incorporate the pyenv-link plugin (#3538)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
build / discover_build_logic_change (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15-intel) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-26) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04-arm) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04-arm) (push) Has been cancelled
pyenv_tests / pyenv_tests_docker (push) Has been cancelled
build / build (push) Has been cancelled
for use in linking binary installations
2026-09-09 02:43:22 +03:00
Ivan Pozdeev 88e9ab13e8 pwsh: Fix error in shell integration if pyenv is on PATH multiple times
Fixes "The term 'pyenv pyenv' is not recognized..."
2026-09-09 02:31:49 +03:00
macayu17 798a1ad603 Incorporate the pyenv-link plugin
* Adapt test_helper for use in plugins
* Add pyenv-link tests
* Add pyenv-link tests to CI
2026-09-09 02:30:53 +03:00
macayu17 fb7f2071fb Add 'plugins/pyenv-link/' from commit '2f8cb2cf1f093e955a72babf0b65a07f84f33522'
git-subtree-dir: plugins/pyenv-link
git-subtree-mainline: ef7a9f5d14
git-subtree-split: 2f8cb2cf1f
2026-09-08 02:55:49 +05:30
Michael Newman ef7a9f5d14
docs: Add link to list of available Python distributions (#3535)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
pyenv_tests / pyenv_tests (ubuntu-22.04-arm) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
build / discover_build_logic_change (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15-intel) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-26) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04-arm) (push) Has been cancelled
pyenv_tests / pyenv_tests_docker (push) Has been cancelled
build / build (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
Add a link to the python-build share directory in the intro section
so users can see which Python distributions are supported before
installing pyenv.
2026-09-06 22:14:47 +03:00
Ayush 265b0dcefa
python-build: add build prerequisite installer (#3532)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
pyenv_tests / pyenv_tests (ubuntu-24.04-arm) (push) Has been cancelled
pyenv_tests / pyenv_tests_docker (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04-arm) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15-intel) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-26) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15) (push) Has been cancelled
build / discover_build_logic_change (push) Has been cancelled
build / build (push) Has been cancelled
2026-09-02 17:56:35 +03:00
Michael Šimáček 2548d53706
Update graalpy URLs for 25.3.4.1 (#3533) 2026-09-02 14:47:33 +03:00
Ivan Pozdeev c293de3650 2.8.5
Some checks failed
build / discover_build_logic_change (push) Waiting to run
build / build (push) Blocked by required conditions
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-15) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-15-intel) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-26) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04-arm) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04-arm) (push) Waiting to run
pyenv_tests / pyenv_tests_docker (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
2026-09-01 18:05:40 +03:00
Ayush bdfc6b03f3
pyenv-binary: support relocating macOS archives (#3528) 2026-09-01 18:01:23 +03:00
pyenv-bot[bot] 8c46508bd0
Add CPython 3.15.0rc2 (#3530)
Co-authored-by: native-api <2670332+native-api@users.noreply.github.com>
2026-09-01 17:53:59 +03:00
Michael Šimáček a00e0bc475
Add GraalPy 25.3.4.1 (#3529)
Some checks failed
build / build (push) Blocked by required conditions
build / discover_build_logic_change (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-15) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-15-intel) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-26) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04-arm) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04-arm) (push) Waiting to run
pyenv_tests / pyenv_tests_docker (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
2026-08-31 23:28:40 +03:00
Michael Newman 981559003f
Fix typo
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
pyenv_tests / pyenv_tests (macos-15) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15-intel) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-26) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04-arm) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04-arm) (push) Has been cancelled
pyenv_tests / pyenv_tests_docker (push) Has been cancelled
build / discover_build_logic_change (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
build / build (push) Has been cancelled
2026-08-29 15:01:30 +03:00
Michael Newman 4733cca31b
Fix typo
Some checks failed
build / discover_build_logic_change (push) Waiting to run
build / build (push) Blocked by required conditions
pyenv_tests / pyenv_tests (ubuntu-22.04-arm) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04-arm) (push) Waiting to run
pyenv_tests / pyenv_tests_docker (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-15) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-15-intel) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-26) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
2026-08-28 15:36:28 +03:00
native-api ef2fb22235
Merge pull request #3522 from sujeito-operator/ci-test-everywhere-on-build-logic-change
CI: test on all runners when the build logic changes
2026-08-26 16:05:18 +03:00
sujeito-operator 97900a4aa4 CI: test on all runners when the build logic changes
Co-Authored-By: Ivan Pozdeev <vano@mail.mipt.ru>
2026-08-26 10:09:25 +03:00
sujeito-operator ecf9a7f9e6 CI: collapse macos_build and ubuntu_build into a single job
Co-Authored-By: Ivan Pozdeev <vano@mail.mipt.ru>
2026-08-26 09:40:01 +03:00
native-api 495550afc8
Merge pull request #3525 from native-api/test_improvements
Test improvements
2026-08-26 06:00:53 +03:00
Ivan Pozdeev 57f1df294b tests: add file names to TAP output
by using a customized formatter
2026-08-26 05:51:24 +03:00
Ivan Pozdeev 14830b18bf tests: skip permission tests if permission bits are being overridden
e.g. if running as root in a docker container
2026-08-26 05:50:04 +03:00
Ivan Pozdeev 032e7af407 tests: consolidate shims tests 2026-08-26 05:49:17 +03:00
native-api b0cff001ff
tests: Fix "cd: null directory" in OpenSUSE (#3524)
A workaround because tests don't use the Pyenv launcher and setting PYENV_DIR to $PWD at every run invocation is too cumbersome.
2026-08-25 22:43:59 +03:00
Michael Newman 234a87e400
Fix typo 2026-08-17 01:51:28 +03:00
Ayush 50fbc8c6cc
pyenv-binary: record direct system dependencies in Linux/FreeBSD (#3520) 2026-08-15 22:47:27 +03:00
Ivan Pozdeev 0f16606e4f 2.8.4 2026-08-13 15:08:51 +03:00
native-api 7c2226386b
Add anaconda3-2026.07-1, miniconda3 26.5.3-2 2026-08-13 14:59:25 +03:00
Ivan Pozdeev 3a98f8c1c3 add_miniforge: better logging, skip 2 faulty releases 2026-08-13 14:16:14 +03:00
native-api f99638cb82
Merge pull request #3518 from pyenv/auto_add_version/3.10.21_3.11.16_3.12.14
Add CPython 3.10.21, 3.11.16, 3.12.14
2026-08-13 14:03:45 +03:00
Ivan Pozdeev 3b9604c093 Add missing 3.10.x patches 2026-08-13 13:10:43 +03:00
native-api 920052eb0b Add CPython 3.10.21, 3.11.16, 3.12.14 2026-08-13 08:53:14 +00:00
native-api cb20e375d3
Merge pull request #3517 from native-api/ci_ubuntu_arm
CI: add ubuntu ARM images
2026-08-13 01:51:46 +03:00
Ivan Pozdeev f11926a274 Run Docker tests separately 2026-08-13 01:44:17 +03:00
Ivan Pozdeev 0fc5dfe630 refactor 2026-08-13 01:44:17 +03:00
Ivan Pozdeev 2bcc7d8fc4 Add ubuntu ARM images 2026-08-13 01:44:11 +03:00
Ivan Pozdeev 2bd4f6c4da - rbenv compatibility note
We've not been syncing with Rbenv for years
2026-08-12 15:26:35 +03:00
Ivan Pozdeev 8771e721c1 Add past CVE-2026-68939 fix to CHANGELOG
Now that Github has issued a CVE number 3 weeks late
2026-08-12 15:19:48 +03:00
native-api d92b6e1bbe
Merge pull request #3516 from macayu17/fix/2334-package-feedback
pyenv-binary-package: check patchelf early and add --verbose
2026-08-11 05:25:39 +03:00
Ivan Pozdeev 9962f8cb39 pyenv-binary-package: refactor tests
* make them more human-readable
* don't double-test external code outside of integration tests
2026-08-11 05:17:49 +03:00
Ivan Pozdeev f9ffb73a7e test_helper: support here-document to assert_success/failure; + assert_output_glob 2026-08-11 05:17:42 +03:00
Ivan Pozdeev bd7c969e7f test_helper: show diff with whitespace highlights
to be able to see tiny and whitespace differences
2026-08-11 04:22:34 +03:00
macayu17 4a73bd17e2 pyenv-binary-package: add --verbose
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-08-11 04:22:33 +03:00
macayu17 2c1f405180 pyenv-binary: check patchelf before installing archive 2026-08-11 04:19:39 +03:00
native-api e234812f46
Merge pull request #3515 from fudianchn/fix/version-file-relative-loop-3513
Stop infinite loop in pyenv version-file for relative paths
2026-08-10 13:08:04 +03:00
Ivan Pozdeev 1a591b3963 Avoid extra iteration for argument with a trailing slash 2026-08-10 12:56:57 +03:00
Ivan Pozdeev 48e70e1fe9 Only test for UNC paths every iteration if they are special 2026-08-10 12:55:19 +03:00
付典 195b9fe940 version-file: Fix infinite loop for relative paths
find_local_version_file reduces its target with ${root%/*}, but that leaves a slash-less relative argument such as "." unchanged, leading to an infinite loop

Signed-off-by: 付典 <fudianchn@gmail.com>
2026-08-10 12:49:53 +03:00
native-api b7e7adf4ec
Merge pull request #3511 from macayu17/fix/2334-freebsd-ldconfig
pyenv-binary: check FreeBSD system libraries
2026-08-10 03:29:33 +03:00
macayu17 a6ef1e70ba Resolve version prefixes in package names 2026-08-10 03:27:47 +03:00
macayu17 5a31fea21b pyenv-binary: support checking FreeBSD system libraries
* Handle both spaced and unspaced FreeBSD `ldconfig -r` output
2026-08-10 03:27:46 +03:00
native-api 17be308600
Merge pull request #3514 from native-api/add_macos_26_intel
CI: Add macos_26_intel
2026-08-08 00:58:10 +03:00
Ivan Pozdeev 9d6cf587b7 Run the discover job on slim 2026-08-07 23:17:31 +03:00
Ivan Pozdeev 1cc9e770ae Fix regexes 2026-08-07 23:17:31 +03:00
Ivan Pozdeev 0e2e214f56 Fix ubuntu_build_tar_gz 2026-08-07 23:17:31 +03:00
Ivan Pozdeev 340348d98d - code irrelevant to CPython in CPython-specific scenarios 2026-08-07 23:17:30 +03:00
Ivan Pozdeev 2d9a224e6c Add macos-26-intel to CI
* Fix macos_build_bundled_dependencies in macos-26-intel
  It has a different set of preinstalled OpenSSL formulae
2026-08-07 23:16:23 +03:00
Ivan Pozdeev da172db42d 2.8.3 2026-08-05 22:08:09 +03:00
pyenv-bot[bot] b0a64af8cc
Add CPython 3.13.15, 3.14.7 (#3512) 2026-08-05 22:06:09 +03:00
Ivan Pozdeev 9e4d1ca95a 2.8.2 2026-08-04 23:10:49 +03:00
Ayush b9e165271e
pyenv-binary: generate platform-specific package names (#3504) 2026-08-04 22:53:34 +03:00
John Sirois 3088203e33
Add CPython 3.15.0rc1 (#3510) 2026-08-04 22:48:04 +03:00
Anupam Mediratta 8f70d418bb
add_cpython: refactor extra Requests logic (#3507)
---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-08-04 13:12:42 +03:00
dependabot[bot] bdf8d254fe
Bump actions/setup-python from 6 to 7 in the github-actions group (#3505)
Bumps the github-actions group with 1 update: [actions/setup-python](https://github.com/actions/setup-python).


Updates `actions/setup-python` from 6 to 7
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](https://github.com/actions/setup-python/compare/v6...v7)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-08-01 16:38:32 +03:00
Michael Šimáček f5915fc866
Add graalpy3.12-25.2.4 (#3502) 2026-07-29 05:53:27 +03:00
Michael Newman 84e0f3a887
Fix typos 2026-07-29 05:49:46 +03:00
Ayush 7126870320
pyenv-binary: add the package subcommand; add pyenv install --list --bare (#3498)
Co-authored-by: native-api <vano@mail.mipt.ru>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-07-28 14:31:20 +03:00
Michael Newman 26dd5d9dda
Fix typo 2026-07-27 21:57:58 +03:00
Michael Newman bac39a0ef8
Fix typo 2026-07-27 08:30:33 +03:00
Ivan Pozdeev bec9a562a5 2.8.1 2026-07-18 22:02:09 +03:00
pyenv-bot[bot] ae9e6594d6
Add CPython 3.15.0b4 (#3495)
Co-authored-by: native-api <2670332+native-api@users.noreply.github.com>
2026-07-18 21:59:23 +03:00
native-api 16c7cc6de4
Merge pull request #3488 from macayu17/feat/2334-pyenv-binary-installer
pyenv-binary: add the `generate-installer` subcommand
2026-07-16 10:51:36 +03:00
Ivan Pozdeev 017ad4a573 Add pyenv-binary tests to CI
* README: fix tests instructions
* test/README: -duplicating and unnecessary stuff
* Makefile: Build Docker images and replace bats link conditionally
* Makefile: fix indent irregularity
2026-07-16 10:39:55 +03:00
macayu17 6188e9efa9 pyenv-binary: add the generate-installer subcommand
* Relocation only implemented for Linux (requires patchelf + ldconfig -p)
* Shell-completing file name is not possible with current Pyenv completion logic:
  `pyenv-complete` does not pass info about the word being completed
* Fix `save`-produced tarball to be compatible with Python-Build fetch_tarball()
* Reuse test_helper from core

--

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-07-16 10:39:50 +03:00
Ivan Pozdeev 286a167cf0 gitignore Vim swap files 2026-07-16 10:22:39 +03:00
Ivan Pozdeev 135adbb192 2.8.0 2026-07-13 21:01:27 +03:00
native-api b3a3e702f1
version-name: skip redundant checks (#3492)
Some checks failed
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.14) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15-intel) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-26) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.14) (push) Has been cancelled
2026-07-11 08:24:01 +03:00
native-api 958e3aca95
Add miniconda3 26.5.3-1 (#3491) 2026-07-11 08:23:42 +03:00
Ivan Pozdeev 74c6efe2f4 Adapt tests involving current directory for Docker
In Docker CI tests, the default current dir is read-only
2026-07-11 08:02:53 +03:00
native-api 95df7dbc7b
Merge commit from fork 2026-07-11 07:22:46 +03:00
max e4c462dc70
Fix typos in docs, scripts, and tests (#3490)
Some checks failed
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.14) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15-intel) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-26) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.14) (push) Has been cancelled
2026-07-08 18:03:00 +03:00
OrbisAI Security 790bedd821
CI: fix: package_managers.dependabot.dependabot-missing-cooldown.dependabot-missing-cooldown security vulnerability (#3489)
Some checks failed
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.14) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-15-intel) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-26) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.14) (push) Has been cancelled
Automated security fix generated by OrbisAI Security
2026-07-05 13:40:15 +03:00
Ayush 19f4c7cf20
Add an experimental pyenv-binary plugin with a save command (#3487)
Some checks are pending
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.13) (push) Waiting to run
macos_build / macos_build (3.14) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-15) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-15-intel) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-26) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Waiting to run
ubuntu_build / ubuntu_build (3.10) (push) Waiting to run
ubuntu_build / ubuntu_build (3.13) (push) Waiting to run
ubuntu_build / ubuntu_build (3.14) (push) Waiting to run
ubuntu_build / ubuntu_build (3.11) (push) Waiting to run
ubuntu_build / ubuntu_build (3.12) (push) Waiting to run
* pyenv-binary: add experimental plugin skeleton

Adds a new plugin, decoupled from `pyenv install`, for packaging and installing
relocatable Python binaries. This commit is just the command dispatcher; the
individual subcommands follow.

`pyenv binary <command>` dispatches to the matching script under the plugin's
libexec, so subcommands stay out of the top-level `pyenv commands` list.

Groundwork for the binary distribution support discussed in #2334.

* pyenv-binary: add the `save` subcommand

`pyenv binary save <version> [<output-dir>]` packs an installed version into a
relocatable .tar.gz with relative paths and writes a metadata file recording the
build platform, distro, libc version and the external system libraries the
build links against (via `ldd` on Linux, `otool -L` on macOS).

* pyenv-binary: reject invalid version names and drop readlink -f in save

A version is a single directory name under versions/, so refuse names with a
slash or a dot-dot component before building the prefix path.

Also emit the python paths directly instead of `readlink -f`, which BSD
readlink on macOS does not support; ldd/otool follow the symlinks anyway, so
the resolved paths were never needed.

* pyenv-binary: test the `save` subcommand

Cover argument validation, the version-name guard, and packaging an
installed version into an archive with matching metadata.

* pyenv-binary: test dependency parsing and tighten the version guard

Add tests that feed realistic ldd and otool listings through save and
check only the libraries resolving outside the prefix end up in the
metadata, since that filtering is the fiddliest part of the command.

Narrow the version guard to reject `.' and `..' rather than any name
containing a dot-dot, now that a slash is already refused, and note why
the find still matches *.so.* even though CPython does not produce them.
2026-07-03 09:08:54 +03:00
dependabot[bot] 46cc3e552b
Bump actions/checkout from 6 to 7 in the github-actions group (#3486)
Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).


Updates `actions/checkout` from 6 to 7
- [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/v6...v7)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '7'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-07-01 10:27:40 +03:00
Michael Šimáček 8f68aab443
Add graalpy-3.12-25.1.3 (#3485)
* Add graalpy-3.12-25.1.3

* Adjust GraalPy version detection with the new naming scheme

---------

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-06-30 21:25:03 +03:00
Ivan Pozdeev a27d2723d6 install: reflect the new alias syntax in reference 2026-06-30 04:17:58 +03:00
Ayush 4c78a0dd50
pyenv-install: install a version under a custom name with <version>:<alias> (#3484) 2026-06-30 04:12:16 +03:00
Ayush 91aacc5dbf
Add script to generate sponsors section for release notes (#3478)
* OpenCollectrive API is blocked by a Cloudflare challenge page in some locations so allow to specify the OpenCollective API data manually

---------

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-06-28 20:06:38 +03:00
Yo Takezawa 3974647f0f
rehash: fix race condition in landlock writability check (#3483) 2026-06-26 21:04:33 +03:00
native-api ebd788d08c
Add miniforge3-26.3.2-2, 26.3.2-3 (#3481) 2026-06-25 09:52:54 +03:00
native-api 4b77d83d9d
CI: add_version enhancements (#3480)
* Default 30 seems enough for our needs
* comments on critical knowledge
* Cleaner handling of t thunk patches
* Fix an error when adding a release for which there's also a prerelease
* Workaround excepthook not working in Github Actions
* requirements.txt workaround is only needed for old Python
2026-06-25 09:48:57 +03:00
Ivan Pozdeev 933d0aaf1d 2.7.3 2026-06-24 05:14:13 +03:00
pyenv-bot[bot] 09dce106a4
Add CPython 3.15.0b3 (#3479)
Co-authored-by: native-api <2670332+native-api@users.noreply.github.com>
2026-06-24 04:27:01 +03:00
Ivan Pozdeev b52a8e3f52 python-build scripts: Switch to jc release
They finally made a release with our fix
2026-06-19 08:36:53 +03:00
Ayush f122a9d764
CI: add_version enhancements (#3475)
- Prevent OpenSSL from bumping across major versions
- Skip adding versions that already have pending PRs
- Copy/move patches when adding new releases in the same series
2026-06-14 21:46:48 +03:00
native-api 3323ba3ed9
README: clarify shell setup instructions using the new --install option 2026-06-12 15:34:14 +03:00
Ivan Pozdeev b43c9e5d42 2.7.2 2026-06-10 23:16:50 +03:00
pyenv-bot[bot] 532b659ca2
Add CPython 3.13.14 (#3473)
---------

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-06-10 23:12:21 +03:00
pyenv-bot[bot] 7565df6eab
Add CPython 3.14.6 (#3472)
---------

Co-authored-by: native-api <2670332+native-api@users.noreply.github.com>
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-06-10 23:11:56 +03:00
Ivan Pozdeev e55613a267 CI: Don't trigger push checks on a pull request 2026-06-10 22:03:22 +03:00
Ivan Pozdeev 6c0c5cfa96 Fix verify_* calls in 3.6.x
Fixes #3470
2026-06-10 21:56:41 +03:00
Anup Das cf6f3c3200
fix(rehash): prevent terminal hang caused by stale or sandbox-blocked lock file (#3469)
* reduce stale lock TTL to 2 min, check for stale lock before acquiring and each time -- to hold up new shell sessions for as little as possible

---------

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-06-04 22:36:11 +03:00
Ivan Pozdeev 45180928d3
2.7.1 2026-06-03 09:09:54 +03:00
native-api c12fd3ae6b
realpath.c: fix obsolete syntax warning (#3468) 2026-06-03 08:42:53 +03:00
Ayush 455d1a31db
init: add --install for shell setup (#3454) 2026-06-03 01:13:07 +03:00
pyenv-bot[bot] efc77132f7
Add CPython 3.15.0b2 (#3467)
Co-authored-by: native-api <2670332+native-api@users.noreply.github.com>
2026-06-03 00:55:40 +03:00
native-api c425c9ec3a
Update URLs for PyPy nightly; Remove pypy3.5 and pypy3.7 nightly (#3466)
pypy3.5-c-jit-latest and pypy3.7-c-jit-latest are no longer available
2026-06-02 13:16:51 +03:00
native-api 95ddd7d479
Support 3.9 EOL Pip URL, consolidate tests (#3465) 2026-06-02 10:29:59 +03:00
Ivan Pozdeev 29057a6c69
2.6.32 2026-05-31 06:20:35 +03:00
native-api 23eb9a9ee3
Merge pull request #3463 from native-api/3.14_openssl_4_r2
3.14.0-5: Support building against OpenSSL 4
2026-05-31 05:59:43 +03:00
Ivan Pozdeev bfc595b0a0
CI: trigger rebuilds for <v>t, too, if a patch for <v> is changed 2026-05-30 22:00:44 +03:00
Ivan Pozdeev 034e15b810
3.14.0-5: Support building against OpenSSL 4 2026-05-30 22:00:43 +03:00
native-api 4c6d4c9be7
Add missing CPython 3.14.2t (#3464) 2026-05-30 17:58:36 +03:00
native-api 549a644688
Fix linking against a keg_only Homebrew OpenSSL when a a non-keg_only one is also installed (#3462) 2026-05-30 16:53:57 +03:00
native-api 7f1139ebe6
Add micropython 1.22.0 to 1.28.0; add downstream patches to fix compilation errors (#3460) 2026-05-30 16:36:04 +03:00
Ivan Pozdeev 874b27c749
CI: move no-response and add-version to ubuntu-slim
Supposedly lightweight tasks, we'll see
2026-05-30 16:28:31 +03:00
native-api 08a015100e
python_build: Make verify_python verify `pythonX.Y' suffix (#3459)
* Fix erroneous use in tests that didn't show until now
2026-05-30 12:47:16 +03:00
native-api 8decb512b4
Merge pull request #3458 from native-api/with_openssl_rpath
3.11.0+: Use the `--with-openssl-rpath' Configure option when possible
2026-05-30 05:46:13 +03:00
Ivan Pozdeev 84414c0121
3.11.5: Add missing patch 2026-05-30 05:38:46 +03:00
Ivan Pozdeev 9ea5bd3005
3.11.0+: Use the `--with-openssl-rpath' Configure option
The options is available since 3.10.0+ (https://github.com/python/cpython/pull/24820)
but has no effect until 3.11.0 (cpython b9e9292d75fdea621e05e39b8629e6935d282d0d)
and broken in MacOS until 3.12.2 (cpython cc13eabc7ce08accf49656e258ba500f74a1dae8),
we add downstream patches to fix that except for 3.11-dev where we disabled it
2026-05-30 05:38:32 +03:00
native-api 0a12a9cce2
Add GraalPy 25.0.3 (#3452)
* Add graalpy-25.0.3

* CI: modified_scripts_build : fix GraalPy version detection

---------

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-05-22 09:55:55 +03:00
Ivan Pozdeev e52da606ff
CI: modified_scripts_build : fix GraalPy version detection 2026-05-22 09:48:52 +03:00
Michael Simacek 4f47143108 Add graalpy-25.0.3 2026-05-22 08:36:54 +02:00
native-api 70f096a95c
rehash: detect and remove a stale lockfile (#3450)
fixes stalling for 60s and failing if some past fault
has resulting in a stale lockfile being present

---------

Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
2026-05-17 09:38:23 +03:00
native-api 06fd1ce788
2.7, 3.4: force C99 standard; 2.7.14-18: force OpenSSL 1 formula (#3448)
GCC 15+ uses C23 by default
(https://www.phoronix.com/news/GCC-15-Default-C23)

fixes "error: static declaration of ‘sinpi’ follows non-static declaration"
fixes "error: cannot use keyword ‘false’ as enumeration constant"

* use OpenSSL 1.0 and 1.1 only from formulae
2026-05-14 06:41:47 +03:00
native-api 0864daa5ea
miniconda 26, CI: switch check to 3.13 (#3447) 2026-05-12 01:32:56 +03:00
native-api 522164fbd5
miniforge3 26.1, 26.3, add_miniforge: exclude .pkg installers (#3446)
According to Miniforge README, they are only meant for interactive installation
2026-05-12 01:06:24 +03:00
native-api 8c59c44902
Add miniconda3 26.3.2-2, miniforge3 26.3.2-0, 26.3.2-1 (#3445) 2026-05-11 23:47:34 +03:00
Ivan Pozdeev c639152ac7
2.6.31 2026-05-11 01:39:26 +03:00
pyenv-bot[bot] 331ff66e2d
Add CPython 3.14.5 (#3444)
* Keep bundled OpenSSL 3
There's no support for OpenSSL 4 yet

---------

Co-authored-by: native-api <2670332+native-api@users.noreply.github.com>
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-05-11 01:36:03 +03:00
native-api f6a5b409e9
CI: add_cpython: Support prereleases for non-initial CPython releases (#3443)
* CI: add_version: correctly handle exceptions

exit code 1 is used as a signal that no new version is found -- so have to use a different exit code for unhandled exceptions

* CI: add_version: support prereleases for non-initial releases

They unexpectedly made a prerelease 3.14.5rc1

* clarify confusing error message
2026-05-08 20:20:32 +03:00
Ivan Pozdeev 3399b2e2e5
clarify confusing error message 2026-05-08 20:10:35 +03:00
Ivan Pozdeev 5bb6b27d61
CI: add_version: support prereleases for non-initial releases
They unexpectedly made a prerelease 3.14.5rc1
2026-05-08 20:10:35 +03:00
Ivan Pozdeev 97573e156e
CI: add_version: correctly handle exceptions
exit code 1 is used as a signal that no new version is found -- so have to use a different exit code for unhandled exceptions
2026-05-08 17:48:39 +03:00
Ivan Pozdeev 40dba8256f
2.6.30 2026-05-08 17:37:31 +03:00
Ned Batchelder e30c23eac2
Add CPython 3.16-dev, switch 3.15-dev to maintenance branch (#3442)
3.15.0b1 released means we need 3.16 support
2026-05-08 17:10:22 +03:00
Ivan Pozdeev a7cc776274
2.6.29 2026-05-08 03:54:43 +03:00
native-api e08497a2b7
Add CPython 3.14.5rc1 (#3441) 2026-05-08 03:53:13 +03:00
John Sirois 709f42cc08
Add CPython 3.15.0b1 (#3440) 2026-05-08 03:22:11 +03:00
Ivan Pozdeev 966819a10f
Merge branch 'master' of https://github.com/pyenv/pyenv 2026-05-06 18:19:08 +03:00
Ivan Pozdeev a736e6af27
CI: add_version: move off the start of the hour
Due to load peak at 0 minutes, it may fail to get a runner.
Github tries to allocate a runner for ~15 minutes.
2026-05-06 18:18:58 +03:00
orbisai0security 6bdb85d8b7
CI: add-version: Add timeouts to CPython release metadata fetches (#3439)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-05-06 06:35:23 +03:00
Ivan Pozdeev 36f37e96ea
CI: no-response: fix 2026-05-06 01:26:56 +03:00
Ivan Pozdeev 3f62ee82b5
CI: add_version: Fix commit message 2026-05-06 01:25:17 +03:00
Ivan Pozdeev 27b4b4dc84
CI: no-response: half the frequency
getting "no runner found" errors
2026-05-06 01:24:27 +03:00
native-api 0b0335a378
Add PyPy v7.3.22 (#3438)
* Add PyPy v7.3.22

The release blog entry is here:
https://pypy.org/posts/2026/04/pypy-v7322-release.html

* CI: Don't require openssl@1.1

Missing in macos-26 Homebrew, causing an error,
no longer required for any supported Pythons

---------

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-04-30 10:43:25 +03:00
Ivan Pozdeev b8a6e9c33c
CI: Don't require openssl@1.1
Missing in macos-26 Homebrew, causing an error,
no longer required for any supported Pythons
2026-04-30 07:01:27 +03:00
John Sirois 3966e507ba
Add PyPy v7.3.22
The release blog entry is here:
https://pypy.org/posts/2026/04/pypy-v7322-release.html
2026-04-29 19:39:23 -07:00
Ivan Pozdeev 485090e713
2.6.28 2026-04-29 08:26:10 +03:00
native-api 6481d1451d
pyenv-latest: fast path for when there is an exact match (#3437)
Avoids O(N^2) complexity when `pyenv-latest` is called in a loop
for existing entries
2026-04-24 00:34:40 +03:00
Ivan Pozdeev dfb1a96c3e
CI: use macos-26
the Github runner is out of beta
2026-04-17 22:53:42 +03:00
Ivan Pozdeev ae1bb9c061
CI: add_python: 3.9 is EOL 2026-04-17 22:30:54 +03:00
Ivan Pozdeev 46e4e6ab07
-dead code
[no ci]
2026-04-15 15:18:16 +03:00
Ivan Pozdeev 914ff80062
2.6.27 2026-04-08 18:26:46 +03:00
native-api 840f3ff7fd
Add miniforge3 26.1.1-2, 26.1.1-3 (#3433) 2026-04-08 18:24:54 +03:00
pyenv-bot[bot] bfec0e43f5
Add CPython 3.13.13, 3.14.4, 3.15.0a8 (#3432)
Co-authored-by: native-api <2670332+native-api@users.noreply.github.com>
2026-04-08 18:08:59 +03:00
exurd ce491008e7
python-build: advise user with no c compiler (#3294)
this checks if "no acceptable C compiler found" is in the last 10 lines of the log, and asks if the user has correctly installed the build dependencies.
2026-04-01 21:32:48 +03:00
dependabot[bot] d26308df49
Bump actions/create-github-app-token in the github-actions group (#3428)
Bumps the github-actions group with 1 update: [actions/create-github-app-token](https://github.com/actions/create-github-app-token).


Updates `actions/create-github-app-token` from 2 to 3
- [Release notes](https://github.com/actions/create-github-app-token/releases)
- [Commits](https://github.com/actions/create-github-app-token/compare/v2...v3)

---
updated-dependencies:
- dependency-name: actions/create-github-app-token
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-01 09:31:31 +03:00
Ivan Pozdeev 8397a19c64
- outdated info
[no ci]
2026-03-24 09:05:13 +03:00
Ivan Pozdeev 0d71a264c2
Fix factual errors; highlight pyenv install 3
Closes #3427
[no ci]
2026-03-23 18:12:11 +03:00
Ivan Pozdeev a6521a0d35
Fix link
[no ci]
2026-03-23 17:05:57 +03:00
native-api 044d816d35
which: update pyenv help global tip (#3424) 2026-03-14 11:23:19 +03:00
Jake Lodwick 6a246fad63
commands: fast path for --sh, replace sort|uniq with sort -u (#3423) 2026-03-13 13:56:23 +03:00
Ivan Pozdeev 174c61526f
2.6.26 2026-03-11 01:37:45 +03:00
native-api 397312d0c3
Merge pull request #3422 from native-api/miniconda3-26.1.1-1
Add miniconda3-26.1.1-1
2026-03-11 01:35:04 +03:00
Ivan Pozdeev 5bd084d816
Add miniconda3-26.1.1-1 2026-03-11 01:18:41 +03:00
Ivan Pozdeev 974e820478
Replace patterns with f-strings for logging
fix KeyError: out_dir
2026-03-11 01:17:34 +03:00
pyenv-bot[bot] a47dae9131
Add CPython 3.15.0a7 (#3421) 2026-03-11 01:11:17 +03:00
Ivan Pozdeev d5cd462a35
Revert "Add miniconda3-26.1.1-1 (#3420)"
This reverts commit 1534421e56.

The scripts actually contain the previous version, 25.11.1-1
2026-03-10 08:23:42 +03:00
binbjz 1534421e56
Add miniconda3-26.1.1-1 (#3420)
Co-authored-by: binbjz <binbjz@gmail.com>
2026-03-10 08:21:06 +03:00
Jake Lodwick e985ffab82
rehash: simplify source.bash pipeline (#3419)
Same cleanup applied to conda.bash in #3151.
2026-03-10 08:15:46 +03:00
native-api 8037f22665
rehash: streamline executables discovery; fix regression (#3418)
Separate the corner-cutting code for `rehash' into a dedicated branch.

Saves some more time (about 100ms for the large fixture)
2026-03-07 13:09:14 +03:00
Tekin Tian d5fa1e225e
Fix MacPorts OpenSSL formula detection (#3417)
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-03-07 11:44:57 +03:00
Jake Lodwick 23bcdebe18
versions: fast path for --bare --skip-aliases (#3411)
Skip sort, native extension probe, and per-symlink realpath
when called with --bare --skip-aliases (the rehash case).
Use readlink to distinguish internal aliases (relative target)
from external installs (absolute target).

In MacOS, speeds up rehash by 5.2 ms (7%) in empty environment,
55.9 ms (33%) in a regular environment (3 ver, 12 venvs, 320 bins),
93.7 ms (15%) in a large environment (6 ver, 60 venvs, 1466 bins)
2026-03-04 10:02:44 +03:00
Ivan Pozdeev aa2e8b8260
2.6.25 2026-03-03 20:06:38 +03:00
pyenv-bot[bot] c9d3829169
Add CPython 3.12.13 (#3414) 2026-03-03 20:04:59 +03:00
native-api 05d3a598c4
Add miniforge3-26.1.0-0 (#3413) 2026-03-03 09:07:15 +03:00
Ivan Pozdeev c89b6b46dc
2.6.24 2026-03-03 08:17:57 +03:00
pyenv-bot[bot] c4ed80826f
Add CPython 3.10.20, 3.11.15
Co-authored-by: native-api <2670332+native-api@users.noreply.github.com>
2026-03-03 08:15:01 +03:00
Jake Lodwick 47871b2dc3
rehash: drop redundant sort -u from make_shims call (#3410)
register_shim() already deduplicates via associative array (bash 4+) or
by checking if a shim already exists (bash 3.2). The sort -u pipe in the make_shims
call is thus redundant -- the dedup happens downstream regardless. Shim
creation is order-independent and idempotent, so sorting has no semantic
effect either.

Saves one subprocess fork during every rehash invocation.
2026-03-02 00:36:24 +03:00
binbjz 43e83b52a2
Add Anaconda3-2025.12-2 (#3408)
Co-authored-by: binbjz <binbjz@gmail.com>
2026-02-21 00:32:12 +03:00
Ivan Pozdeev 9279111a60
Revert accidentally left test code from "CI: add_version: use Github App token to create PR"
This partially reverts commit 47b6fce29d.
2026-02-19 07:41:21 +03:00
native-api 3100654510
Merge pull request #3406 from pyenv/use_github_app_token
CI: add_version: use Github App token to create PR
2026-02-19 06:05:04 +03:00
Ivan Pozdeev 06bac52676
add_cpython: fix erroneously deleting old thunks
Looks like a leftover from older logic, before
we `git mv`'d thunks on prerelease upgrade
2026-02-19 04:56:42 +03:00
Ivan Pozdeev 47b6fce29d
CI: add_version: use Github App token to create PR
The only way atm that allows to both trigger CI
and get PR notifications, as per
https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#authenticating-with-github-app-generated-tokens

Created helper app https://github.com/apps/pyenv-bot/
2026-02-19 04:56:41 +03:00
Ivan Pozdeev 81befc1592
2.6.23 2026-02-17 02:38:47 +03:00
native-api c44f03c058
Add CPython 3.15.0a6 (#3403)
Co-authored-by: native-api <2670332+native-api@users.noreply.github.com>
2026-02-17 02:36:26 +03:00
Ivan Pozdeev b2a43bbcdb
CI: add_verison: Don't run "set PR properties" unnecessarily 2026-02-04 13:58:08 +03:00
Ivan Pozdeev 2f10394d33
CI: add_version: fix Actions not triggering for the pull request 2026-02-04 04:15:00 +03:00
Ivan Pozdeev 57ec277d6a
2.6.22 2026-02-04 03:52:39 +03:00
github-actions[bot] 63edb91375
Add CPython 3.13.12 (#3401) 2026-02-04 03:50:15 +03:00
Ivan Pozdeev 6d8c0e4021
2.6.21 2026-02-03 23:46:41 +03:00
github-actions[bot] fbc7067e3f
Add CPython 3.14.3 (#3400) 2026-02-03 23:44:14 +03:00
Ivan Pozdeev 82f4de5593
CI: reflect GraalPy 25.0.2 dropping MacOS x64 support 2026-01-20 18:52:39 +03:00
Michael Šimáček 968cd11daa
Add GraalPy 25.0.2 (#3395) 2026-01-20 18:12:44 +03:00
Ivan Pozdeev 5447f1f859
CI: add_script: make more frequent
practice shows a long enough delay that contributors step in
2026-01-15 16:09:57 +03:00
Ivan Pozdeev 3441980e83
2.6.20 2026-01-15 07:05:06 +03:00
Ned Batchelder bd2f32dd7d
Add CPython 3.15.0a5 (#3393) 2026-01-15 07:00:46 +03:00
native-api 94faa168cb
CI: adjust CPython PR generation logic (#3392)
* For files retrieved through the GNU mirror load balancer, specify the load balancer URL
* Explicitly `git mv` files on prerelease upgrade in case Git doesn't detect it
* Add a trailing newline to a thunk
2026-01-14 07:03:58 +03:00
Ivan Pozdeev 92c9ab5273
2.6.19 2026-01-14 04:11:02 +03:00
Ned Batchelder 37bf92af84
Add CPython 3.15.0a4 (#3390) 2026-01-14 04:00:41 +03:00
Ivan Pozdeev 05ba9388a7
Fix schedule 2026-01-11 23:45:25 +03:00
Ivan Pozdeev c62be31e8c
2.6.18 2026-01-10 06:16:21 +03:00
Ivan Pozdeev c8129ceee6
fix schedule syntax 2026-01-09 12:04:52 +03:00
native-api d9182d6edc
CI: automatically check for CPython releases (#3388)
* .gitignore local venv
* Add alt GNU mirror support with <table>
* Fix UnboundLocalError when no micro 0 releases
* Cutoff for existing vetsions as well
* add missing dependency more_itertools
* workaround fake_useragent 2.0.0 falsely declaring 3.8 compatibility
2026-01-09 09:52:09 +03:00
native-api 4cf95be5ee
Merge pull request #3387 from native-api/anaconda-2025.12-1
Add anaconda-2025.12-1
2026-01-08 14:09:29 +03:00
Ivan Pozdeev 8c50260ba2
Anaconda 2025.12 dropped MacOS x64 support 2026-01-08 14:00:56 +03:00
Ivan Pozdeev f614e5caa5
Fix hang in Ubuntu build for Anaconda-2025.12 2026-01-08 14:00:55 +03:00
native-api 3c539aa0bc
Merge pull request #3386 from native-api/miniconda-25-accept-tos
Auto-accept TOS for miniconda3-25+
2026-01-08 13:07:40 +03:00
Ivan Pozdeev 935e1a68cd
Add anaconda3-2025.12-1 2026-01-08 11:22:55 +03:00
Ivan Pozdeev 98a7a6809c
Fix verify_py prefix in anaconda3-2025.06 2026-01-08 11:20:20 +03:00
Ivan Pozdeev 45ef1677c4
Auto-accept TOS in miniconda3-25+
Required for installation since this version
2026-01-08 11:20:20 +03:00
binbjz c35f26af3e
CI: exclude unsupported MacOS-x64 for recent Miniconda versions (#3385)
* split macOS Intel build and filter unsupported Miniconda

* Generate exclusions instead

---------

Co-authored-by: binbjz <binbjz@gmail.com>
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2026-01-08 09:08:08 +03:00
binbjz 967ed2c367
Add miniconda3-25.11.1-1 (#3382)
Co-authored-by: binbjz <binbjz@gmail.com>
2026-01-08 00:27:49 +03:00
Ivan Pozdeev 1d8240a641 set executable bit for add_cpython.py 2026-01-07 22:53:57 +03:00
Ivan Pozdeev e5a6b49e02
scripts: remove unused 2026-01-07 07:32:00 +03:00
Ivan Pozdeev 4a3aaf4327
scripts: relax version requirements
Latest version are okay.
Freezing them causes Dependabot alerts
about vulnerabilities in old versions
2026-01-03 13:32:53 +03:00
native-api 2c27f44612
Merge pull request #3358 from native-api/cpython_generate
CI: add a script to autogenerate CPython build scripts
2025-12-27 08:20:00 +03:00
Ivan Pozdeev ff94d498db
(refactor) 2025-12-27 08:18:41 +03:00
Ivan Pozdeev 99faf7f217
Add a script to generate CPython installation scripts
[no ci]
2025-12-27 08:18:41 +03:00
native-api bf37e78693
Merge pull request #3379 from native-api/make_j_argument
Recognize an argument to -j in MAKEFLAGS when building extensions in 3.10-3.11 and latest 3.5-3.9
2025-12-27 06:23:19 +03:00
Ivan Pozdeev 956f78df42
Recognize an argument to -j in MAKEFLAGS when building extensions in 3.10-3.11 and latest 3.5-3.9
Upstream issue fixed in 3.12 (https://github.com/python/cpython/issues/87800)
2025-12-27 02:56:23 +03:00
Ivan Pozdeev 56bc05d5d6
python-build: Use no-tests only for OpenSSL 1.1.1+
Introduced in 1.1.1-pre1
2025-12-27 02:56:15 +03:00
Ivan Pozdeev 8ef33165b8
CI: fix CPython-only checks 2025-12-27 02:56:14 +03:00
native-api 48743aa8f3
README: Document how to change Python version in a shell spawned from a Python-based program (e.g. Jupyter) (#3380) 2025-12-26 17:19:10 +03:00
rockandska 2c38423a98
pyenv launcher: introduce and export _PYENV_INSTALL_PREFIX (#3334)
provides a reliable way for Pyenv code to locate other parts of Pyenv code that are not under `PYENV_ROOT`

* tests: Work with Git entirely in a test repo

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2025-12-24 10:00:09 +03:00
native-api aa6c9b9694
init: don't silence automatic rehash; rehash: report final error but not provisional ones (#3377) 2025-12-21 07:21:30 +03:00
native-api a944da76c0
rehash: support BSD mktemp (#3376)
macOS 12 `mktemp' doesn't support `-p`
2025-12-21 06:38:46 +03:00
Florian Blanchet aeea3ac825
Add PowerShell support (#2749)
Co-authored-by: Ivan Pozdeev <ivan_pozdeev@mail.ru>
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2025-12-21 05:33:19 +03:00
Ivan Pozdeev 7998159daa
tests: fix integration tests for Bash and Fish 2025-12-21 02:11:02 +03:00
native-api 5855d9dfca
Merge pull request #3372 from native-api/ci_update_cleanup
CI: Update and cleanup workflow scripts
2025-12-20 19:37:04 +03:00
native-api 22993a239e
Merge pull request #3375 from native-api/fix_inf_loop_shim_different_location
Fix an infinite loop if a shim is symlinked to and called from a different location
2025-12-20 11:24:41 +03:00
Ivan Pozdeev 6113214f65
tests: refactor: migrate to newly-added create_stub() 2025-12-20 11:05:27 +03:00
Ivan Pozdeev 7418835908
Prevent infinite loop if a shim is linked and called from a nonstandard location with "system" active 2025-12-20 11:05:27 +03:00
Ivan Pozdeev b259813357
tests: refactor: rename and consolidate create_executable() functions 2025-12-20 08:34:20 +03:00
Ivan Pozdeev 22b192913e
2.6.17 2025-12-16 23:30:42 +03:00
Edgar Ramírez Mondragón b50afe69a8
Add CPython 3.15.0a3 (#3374)
Signed-off-by: Edgar Ramírez-Mondragón <edgarrm358@gmail.com>
2025-12-16 23:28:46 +03:00
native-api 91931a4dd9
miniconda3-latest: auto accept TOS (#3373)
Since 14.07.2025, Anaconda requires accepting the new TOS upon installation
that limit eligibility for free use
2025-12-14 22:48:46 +03:00
Ivan Pozdeev dabaa901e9
CI: - Ubuntu 18.04 workaround 2025-12-13 18:07:37 +03:00
Ivan Pozdeev 4b33cb68b6
CI: - Micropython-specific code from CPython-only branches 2025-12-13 18:04:15 +03:00
Ivan Pozdeev 9b85239875
CI: - commented-out code 2025-12-13 17:52:53 +03:00
Ivan Pozdeev f19fe0f2be
CI: tests: + macos-15 2025-12-13 17:51:51 +03:00
Ivan Pozdeev 293798582a
CI: build: - EOL 3.9, + 3.13 2025-12-13 17:51:26 +03:00
Ivan Pozdeev 4b36ddf5c6
Merge branch 'master' of https://github.com/pyenv/pyenv 2025-12-13 17:26:59 +03:00
Ivan Pozdeev 4e7626721a
Delete the old issue template
[no ci]
2025-12-13 17:22:12 +03:00
native-api 3b25462407
Merge pull request #3371 from 13steinj/new-miniforge-miniconda-versions
Adds latest miniforge releases 25.9.1-0, 25.11.0-1
2025-12-09 22:25:34 +03:00
Jonathan Stein 70294ef6f1 Add miniforge3 25.9.1-0, 25.11.0-1
Adds latest miniforge releases 25.9.1-0, 25.11.0-1.

Skips 25.11.0-0 due to a regression reported in the release notes of
miniforge3-25.11.0-1.

Ref: https://github.com/conda-forge/miniforge/releases/tag/25.11.0-1
2025-12-09 12:27:18 -06:00
Jonathan Stein bdb0508220 Update requirements for the add_miniconda script
At least under Python 3.14, this quickly fails without lxml[html_clean]
installed explicitly.
2025-12-09 12:18:23 -06:00
Ivan Pozdeev e805257c1f
2.6.16 2025-12-06 00:58:03 +03:00
César Román 6cbce8616e
Add CPython 3.13.11, 3.14.2 (#3370) 2025-12-06 00:56:17 +03:00
Ivan Pozdeev a6ea5b3179 Fix rehash 2025-12-05 20:57:07 +03:00
native-api 0f7b8fa8ee
sh-rehash: Fix erroneously executing rather than printing a command (#3369) 2025-12-05 20:42:25 +03:00
binbjz 59204a6c89
Add Miniconda3-25.9.1-3 (#3368)
Co-authored-by: binbjz <binbjz@gmail.com>
2025-12-05 17:26:32 +03:00
native-api 6f0e2d3458
rehash: Fix hanging for 60 seconds when shims directory is not writable due to Linux Landlock (#3367) 2025-12-05 16:19:17 +03:00
Ivan Pozdeev 61d869f67e
2.6.15 2025-12-03 03:23:17 +03:00
John Sirois a63e48cf75
Add CPython 3.13.10. (#3364) 2025-12-03 03:21:46 +03:00
Ivan Pozdeev d1ae7fd65d
2.6.14 2025-12-02 21:00:00 +03:00
Ned Batchelder b230a338df
Add CPython 3.14.1 (#3363) 2025-12-02 20:52:30 +03:00
native-api 94e4bf0ae8
Fix "ld: symbol(s) not found" for some C system calls in MacOS if XCode is for a newer major MacOS version (#3362)
Citing https://www.postgrespro.ru/list/id/E1kfzRR-0001EH-Ph@gemulon.postgresql.org
fixing the same problem:
We previously put the -isysroot switch only into CPPFLAGS, theorizing
that it was only needed to find the right copies of include files.
However, it seems that we also need to use it while linking programs,
to find the right stub ".tbd" files for libraries.  We got away
without that up to now, but apparently that was mostly luck.  It may
also be that failures are only observed when the Xcode version is
noticeably out of sync with the host macOS version; the case that's
prompting action right now is that builds fail when using latest Xcode
(12.2) on macOS Catalina, even though it's fine on Big Sur.

Specifically, the problem arises for `preadv' and `pwritev' (new in MacOS 11 Big Sur) when building with XCode 12.4 (supporting Big Sur) in MacOS 10.15 Catalina.
2025-12-01 22:01:15 +03:00
dependabot[bot] a30c26ddf5
Bump actions/checkout from 5 to 6 in the github-actions group (#3360)
Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).


Updates `actions/checkout` from 5 to 6
- [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/v5...v6)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-12-01 15:59:31 +03:00
Ivan Pozdeev fdde91269b
2.6.13 2025-11-19 14:30:40 +03:00
Ned Batchelder fa741b861a
Add CPython 3.15.0a2 (#3359) 2025-11-19 14:28:31 +03:00
binbjz 2afd1733a4
Add Miniconda3-25.9.1-1 (#3357) 2025-11-08 14:35:44 +03:00
Edgar Ramírez Mondragón 032022dace
Replace macos-13 with macos-15-intel (#3356)
> The macOS 13 Ventura based runner images will begin deprecation on September 22nd and will be fully unsupported by December 4th for GitHub and ADO.

https://github.com/actions/runner-images/issues/13046

Signed-off-by: Edgar Ramírez Mondragón <edgarrm358@gmail.com>
2025-11-05 22:10:29 +03:00
Ivan Pozdeev c6ea700cdf 2.6.12 2025-10-31 23:27:18 +03:00
Ned Batchelder 97fd8f436d
Add CPython 3.9.25 (#3355) 2025-10-31 23:24:35 +03:00
Michael Šimáček 1b7d2f08fd
Add graalpy-25.0.1 (#3350) 2025-10-22 02:28:06 +03:00
Ivan Pozdeev 74fea7edc6 Fix leftover commented-out test code 2025-10-15 15:00:43 +03:00
Ivan Pozdeev 94071a9374 2.6.11 2025-10-15 14:40:44 +03:00
Edgar Ramírez Mondragón 7661437864
Add CPython 3.15.0a1 (#3347) 2025-10-15 14:38:53 +03:00
native-api ea3a9fe895
Merge pull request #3346 from nedbat/nedbat/3.13.9 2025-10-15 14:08:11 +03:00
Ivan Pozdeev c1c8646d75 Fix Readline 8.3 URLs
https://www.gnu.org/server/mirror.html advises
to use http://ftpmirror.gnu.org/
for automatic mirror selection
2025-10-15 13:10:13 +03:00
Ned Batchelder fc28287273 Add CPython 3.13.9 2025-10-14 16:18:13 -04:00
native-api 8d3bba2f92
Support building against Homebrew Tcl/Tk 9 (#3343)
Use tclConfig.sh/tkConfig.sh for future-proofing
3.14.0 doesn't detect Tcl/Tk with external libtommath, have to do it ourselves
2025-10-11 00:19:06 +03:00
Ivan Pozdeev a419b003b4 2.6.10 2025-10-10 04:14:38 +03:00
Ned Batchelder 1c05252dfc
Add CPython 3.12.12, 3.11.14, 3.10.19, 3.9.24 (#3344) 2025-10-10 04:12:44 +03:00
Ivan Pozdeev 8087e811cd 2.6.9 2025-10-07 22:33:22 +03:00
John Sirois faddc0d3fe
Add CPython 3.13.8 (#3341) 2025-10-07 22:28:30 +03:00
James ce9d396ccc
Add CPython 3.14.0 (#3339)
---------

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2025-10-07 22:26:47 +03:00
native-api ba968fda2d
CI: Fix output variable for CPython-specific workflows (#3340) 2025-10-07 21:31:45 +03:00
tuzi3040 8e34326347
CI: modified-scripts-build: fix CPython-specific jobs never firing (#3338) 2025-10-07 21:00:59 +03:00
Ivan Pozdeev 519ce9dbf0 2.6.8 2025-09-19 07:14:28 +03:00
native-api 3e51bae343
Merge pull request #3327 from native-api/use_pkgconfig_3.12plus
Use TCLTK_* and pkg-config for 3.11+ linking with Homebrew Tcl/Tk; add PYTHON_BUILD_TCLTK_FORMULA envvar
2025-09-19 07:11:26 +03:00
Ivan Pozdeev ca551b3a55 Add PYTHON_BUILD_TCLTK_FORMULA to allow building against Tcl/Tk 9
Tcl/Tk 9.0 support was added in 3.13.0b3 and is not official as of 3.14.0;
the build with Homebrew version fails as of this writing
2025-09-19 06:20:41 +03:00
Ivan Pozdeev bbe6301f01 Use TCLTK_* and pkg-config for 3.11+ instead of --with-tcl-* and pkg-config
Fixes warnings "configure: WARNING: unrecognized options: --with-tcltk-libs, --with-tcltk-includes"

fix script
2025-09-19 06:20:41 +03:00
Ivan Pozdeev 8c3b705f04 CI: modified-scripts-build: print config.log on build failure 2025-09-19 01:26:06 +03:00
native-api 90b1c28fa6
Merge pull request #3333 from nedbat/nedbat/314rc3
Add CPython 3.14.0rc3
2025-09-18 19:17:29 +03:00
Ivan Pozdeev 0052372fa3 Explicitly include Homebrew at /usr/local/include if passing -isysroot
Apple CLang excludes it if -isysroot is passed
2025-09-18 19:02:46 +03:00
Ned Batchelder 1068875cc6 Add CPython 3.14.0rc3 2025-09-18 08:15:02 -04:00
rockandska 22a7c46d54
upgrade pip detetcion in pip-rehash to accept multiple variations: (#3330)
- pip
- pipX
- pipX.Y
- * -m pip

Co-authored-by: Christian Fredrik Johnsen <christian@johnsen.no>
2025-09-17 03:53:37 +03:00
Michael Šimáček 7881c26b5a
Add GraalPy 25.0 (#3331) 2025-09-16 17:57:02 +03:00
native-api 4033a0a260
Merge pull request #3324 from rockandska/bats_in_docker
Bats test suite in docker
2025-09-15 22:37:01 +03:00
rockandska dee36c348d add test README 2025-09-15 20:16:31 +02:00
rockandska d275391f65 add possibility to filter tests with make 2025-09-15 20:16:18 +02:00
rockandska a7897ca0f6 add bats test under docker 2025-09-15 20:16:11 +02:00
rockandska 92a28e531b use BATS_FILE_TMPDIR in test/plugin test
use global setup with bats with possibility to add specific test file _setup
use readlink in helper if realpath is not working as expected
2025-09-15 19:48:34 +02:00
rockandska 8990110dcf upgrade bats to v1.10.0
fix bats warnings
2025-09-15 16:45:02 +02:00
rockandska 68edd564cf update parent shell detection in pyenv-init to be more portable 2025-09-15 15:00:18 +02:00
rockandska 0d987b0e4b fix test isolation
Make sur that PYENV_TEST_DIR is created if mktemp failed
mock python3 usage by updating create_executable function
fix test by adding the right PATH
update path in plugin test
replace for loop with while read
don't use symlink for stub
2025-09-15 15:00:14 +02:00
Ivan Pozdeev 857806e6ca Apple Silicon is now supported by Github 2025-09-14 23:25:49 +03:00
Ivan Pozdeev 85561398ea -unused Dockerfile 2025-09-14 22:21:31 +03:00
native-api 17fb66cd8b
Support curl from a snap (#3329) 2025-09-14 07:23:41 +03:00
native-api 2ecd676a2a
Add miniconda 25.7.0-2 (#3323) 2025-09-08 21:47:20 +03:00
rockandska b57bdef584
Fix rehash hook for pipx/pipx.x/pipx.xx (#3320) 2025-09-04 18:56:53 +03:00
dependabot[bot] cd78412b80
Bump actions/checkout from 4 to 5 in the github-actions group (#3318)
Bumps the github-actions group with 1 update: [actions/checkout](https://github.com/actions/checkout).


Updates `actions/checkout` from 4 to 5
- [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/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: github-actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-01 13:33:28 +03:00
native-api 692ac77559
Fix specifying XCode SDK for distutils; Revert to preferring XCode Zlib (#3316)
* Fix specifying XCode SDK for distutils

* Revert to preferring XCode Zlib

It turns out, everything since 2.7.12 and 3.5.2
can use libs from modern XCode SDK
which is always available unless we're using an alternate compiler
2025-09-01 01:09:57 +03:00
native-api 97eda4403f
Fix Readline and OpenSSL detection for MacPorts without the corresponding package (#3317) 2025-08-31 21:48:24 +03:00
native-api ab1331d3c0
Merge pull request #3311 from native-api/fiz_zlib_homebrew
Prefer ZLib from Homebrew/MacPorts if present; Fix using Zlib from Homebrew
2025-08-28 10:54:50 +03:00
Ivan Pozdeev 7d3854b64d CI: use ZLib from XCode SDK
Everything since 3.5.2 (see #3301) can use it;
it's now present in all non-EOL MacOS XCode versions
2025-08-28 10:49:32 +03:00
Ivan Pozdeev 11c1898abb Fix using Zlib from Homebrew 2025-08-28 09:52:24 +03:00
Ivan Pozdeev 25e5989261 Prefer ZLib from Homebrew/MacPorts if present
Zlib from XCode is virtually always present now so it only makes sense to use it from elsewhere if it's preferred.
Works around build failure for 2.7 that's incapable of using Zlib from XCode 7+ (see #3301)
2025-08-28 09:36:13 +03:00
Ivan Pozdeev cd2f410f75 Clean up, skip looking for mambaforge after it's retired 2025-08-23 21:53:51 +03:00
native-api 89b8e5f8da
Add miniforge 25.3.0-1, 25.3.0-2, 25.3.0-3, 25.3.1-0, skip miniforge 25.3.0-0 (#3306)
miniforge-25.3.0-0 is marked as prerelease, there's no Linux version. Probably recalled.
2025-08-23 19:40:17 +03:00
Jared Stever 71a8d47b81
Use Zlib from XCode SDK in a way compatible with XCode 16 and CLT (#3301)
* use `xcrun` instead of `xcodebuild` which is absent in CLT
* use an alternative way that's compatible with CPython's setup.py since 3.5.2

---------

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2025-08-16 20:17:53 +03:00
Ivan Pozdeev bc44cb8fc0 CI: run modified scripts in MacOS 15, too
It turns out, macos-14 has XCode 15 rather than 16 as advertised in Github docs
2025-08-16 20:04:40 +03:00
Ivan Pozdeev 3dbdfdf39a 2.6.7 2025-08-15 21:49:48 +03:00
Ned Batchelder 43da49d6df
Add CPython 3.14.0rc2 and 3.13.7 (#3303) 2025-08-15 21:13:33 +03:00
native-api 10675af5a6
Don't fail the build if xcodebuild fails (#3302) 2025-08-14 22:40:54 +03:00
native-api 685f281526
Skip Zlib from XCode for XCode 16+ (#3298)
It breaks the build due to yet unknown structural changes from XCode 15
2025-08-08 23:05:49 +03:00
Ivan Pozdeev d56241330c 2.6.6 2025-08-07 23:17:54 +03:00
César Román 73b7420b3d
Add CPython 3.13.6 (#3297) 2025-08-07 23:15:37 +03:00
native-api bd9d13b9fe
Add anaconda3-2025.06-0, anaconda3-2025.06-1, miniconda3-25.3.1-1, miniconda3-25.5.1-0, miniconda3-25.5.1-1 (#3295) 2025-08-03 09:29:54 +03:00
Ivan Pozdeev 05cc41d273 CI: change macos_build to -latest 2025-08-03 09:29:21 +03:00
Ivan Pozdeev df84c42653 2.6.5 2025-07-23 21:20:39 +03:00
Ivan Pozdeev 23fe500a33 Push version in Python-Build as well 2025-07-23 21:20:29 +03:00
Michael Šimáček 609daca27c
Add GraalPy 24.2.2 (#3291) 2025-07-23 21:17:19 +03:00
Ned Batchelder 40f46083db
Add CPython 3.14.0rc1 (#3293) 2025-07-23 21:11:40 +03:00
native-api 418a61b7b8
Update README.md
Explicitly specify how to use the Zsh shell snippet
It turns out to be unclear to some users
2025-07-19 18:34:11 +03:00
César Román 16508177fb
Add Jython 2.7.4 (#3290) 2025-07-17 21:40:12 +03:00
Edgar Ramírez Mondragón 945f4b216d
Bump OpenSSL to 3.5.1 in the latest releases and branch tips in CPython 3.12 - 3.15 (#3287) 2025-07-10 19:49:03 +03:00
Ivan Pozdeev 0c680e8ede 2.6.4 2025-07-08 21:12:30 +03:00
Edgar Ramírez Mondragón 20296fc53a
Add CPython 3.14.0b4 (#3285)
* Bump CPython 3.14 OpenSSL to 3.4.2
2025-07-08 21:10:52 +03:00
native-api 7725fe2cf2
Install feature request templates
[no ci]
2025-07-06 23:46:48 +03:00
native-api d8384fcc05
Install issue templates
It looks like Github have dropped support for https://github.com/pyenv/pyenv/edit/master/.github/ISSUE_TEMPLATE.md entirely.
2025-07-06 23:29:49 +03:00
John Sirois e150257413
Add PyPy v7.3.20 (#3284)
The release blog entry is here:
  https://pypy.org/posts/2025/07/pypy-v7320-release.html
2025-07-06 09:22:51 +03:00
native-api 798d21e0ca
(regression) Use Zlib from XCode SDK in MacOS without Homebrew or Macports (#3282) 2025-06-29 19:51:25 +03:00
native-api 9114929e4f
Backport bpo_36106 to 3.5.10 and 3.6.15 (#3280)
Fixes "error: static declaration of ‘sinpi’ follows non-static declaration"
with newer libm
2025-06-22 14:22:17 +03:00
Ivan Pozdeev f1c5371752 2.6.3 2025-06-18 22:05:08 +03:00
Ned Batchelder 907cd78f35
Add CPython 3.14.0b3 (#3278)
* remove the need for explicit versions in the python-build free-threading files
2025-06-18 22:02:01 +03:00
Danny Kim e13b5848be
Support linking to MacPorts ports installed from binary archives (#3272) 2025-06-14 09:38:35 +03:00
native-api bf19366669
Re-promote "Python versions with extended support" to a section (#3276)
It's a valuable asset of Pyenv and https://github.com/pyenv/pyenv/issues/3275 showed it has stoppped being discoverable

[no ci]
2025-06-13 22:19:06 +03:00
Ivan Pozdeev a71a378dac 2.6.2 2025-06-12 13:19:45 +03:00
Ned Batchelder 807a4e0cac
Add CPython 3.13.5 (#3269) 2025-06-12 12:47:09 +03:00
Ivan Pozdeev b9ede4ae0e 2.6.1 2025-06-04 20:22:49 +03:00
Ned Batchelder 0e05ee8694
Add CPython 3.9.23, 3.10.18, 3.11.13, 3.12.11, 3.13.4 (#3266) 2025-06-04 09:15:55 +03:00
Ivan Pozdeev bfbe76e6a9 2.6.0 2025-05-26 22:59:51 +03:00
Ned Batchelder d88de11543
Add CPython 3.14.0b2 (#3259) 2025-05-26 22:15:12 +03:00
Pedro Fonini 70b973fdd4
Fix python-build's has_broken_mac_readline when Readline is explicitly configured (#3254) 2025-05-22 07:58:25 +03:00
Alexander Studnitskiy f24ff8d152
Add MacPorts support for python-build (#3186)
Did not implement customizable priority due to unclear use feedback and more compilation in the code, can decide and do that separately

Tcl/Tk from MacPorts support is omitted due to CPython's only being compatible with 
Tcl/Tk 9 since 3.12.5 and 3.13.0.

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2025-05-18 18:24:38 +03:00
Ivan Pozdeev 5e82f5cf81 Merge branch 'master' of https://github.com/pyenv/pyenv 2025-05-18 12:27:06 +03:00
Ivan Pozdeev 6c86ae4175 README: fix erroneous extra indents in code blocks 2025-05-18 12:26:50 +03:00
Jordan Stewart da3fcb7eb7
README: Add shell setup instructions for nushell (#2916) 2025-05-18 12:20:30 +03:00
Jesse Wattenbarger 018ca73444
Add --bare option to pyenv version (#2783) 2025-05-17 18:23:25 +03:00
Tom Godkin 90fa430eca
README: make fish PATH add conditional on the directory existing (#2786) 2025-05-17 16:13:12 +03:00
native-api 2d8bd15ccd
Add CODEOWNERS file (#3247)
to get notifications of pull requests ready for review

[no ci]
2025-05-17 15:38:33 +03:00
native-api 9656bcf0b9
python-build: Support patch paths with spaces/special characters (#3251)
This is now possible because all non-EOL MacOS versions now support
`find -print0`/`sort -z`/`xargs -0`
2025-05-17 08:58:06 +03:00
Ivan Pozdeev f216b4bfb1 2.5.7 2025-05-09 00:52:54 +03:00
Edgar Ramírez Mondragón 54fd0106f8
Point 3.14-dev to 3.14 branch (#3246) 2025-05-09 00:51:24 +03:00
Ivan Pozdeev 6fff3d29d4 2.5.6 2025-05-08 17:12:28 +03:00
native-api b70fb9c07b
Merge pull request #3245 from edgarrmondragon/cpython-3.14.0b1-3.15-dev
Add CPython 3.14.0b1 and 3.15-dev
2025-05-08 17:06:01 +03:00
Edgar Ramírez-Mondragón f4b94c14a6
Add CPython 3.15-dev 2025-05-07 13:53:53 -06:00
Edgar Ramírez-Mondragón e95941c9fe
Add CPython 3.14.0b1 2025-05-07 13:26:50 -06:00
native-api bc7b6cb6b5
Cache uname and sw_vers output (#3244)
Mainly for tests, to avoid having to adjust call counts for stubs when the logic changes
2025-05-06 19:17:36 +03:00
David Lawson ee40ad2253
Fix get-pip URLs for 3.7, 3.8 and Pyston (#3242)
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2025-04-29 20:58:49 +03:00
Michael Šimáček 323af282db
Add GraalPy 24.2.1 (#3238) 2025-04-16 21:08:46 +03:00
Ivan Pozdeev 97993fcc26 2.5.5 2025-04-09 23:00:35 +03:00
native-api 323bd16fbf
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 <ned@nedbatchelder.com>
2025-04-09 21:56:48 +03:00
native-api 67f474d3e3
Add miniforge3-24.11.3-1, miniforge3-24.11.3-2, miniforge3-25.1.1 (#3224) 2025-03-28 00:03:17 +03:00
native-api 004f6706a1
Switch 3.9+ to OpenSSL 3 (#3223) 2025-03-27 23:35:50 +03:00
Michael Šimáček c579b63696
Add graalpy 24.2 (#3215) 2025-03-18 19:18:33 +03:00
Ivan Pozdeev abf1376487 2.5.4 2025-03-15 02:06:16 +03:00
Ned Batchelder 44172d69f2
Add CPython 3.14.0a6 (#3213) 2025-03-14 20:26:03 +03:00
John Sirois 2f4bdcdb43
Add PyPy v7.3.19. (#3205)
Some checks failed
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
The release blog entry is here:
  https://pypy.org/posts/2025/02/pypy-v7319-release.html
2025-02-28 22:05:57 +03:00
binbjz 47eef10ce1
Add anaconda3-2025.1.1-2 (#3198)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
Co-authored-by: binbjz <binbjz@gmail.com>
2025-02-14 09:48:24 +03:00
Ivan Pozdeev 5051a42b2c 2.5.3
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.13) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Waiting to run
ubuntu_build / ubuntu_build (3.10) (push) Waiting to run
ubuntu_build / ubuntu_build (3.11) (push) Waiting to run
ubuntu_build / ubuntu_build (3.12) (push) Waiting to run
ubuntu_build / ubuntu_build (3.13) (push) Waiting to run
ubuntu_build / ubuntu_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
2025-02-13 09:17:25 +03:00
native-api 1c2a7658f0
Merge pull request #3151 from ChristianFredrikJohnsen/fix/conda-rehash
Do not execute conda-specific code if conda is not installed
2025-02-13 08:48:57 +03:00
Christian Fredrik Johnsen 8e5379ebe3 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.
2025-02-13 08:31:48 +03:00
Christian Fredrik Johnsen ab2a5ad030 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.
2025-02-13 08:31:48 +03:00
Christian Fredrik Johnsen 09fbed1d4f 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.
2025-02-13 08:31:48 +03:00
John Sirois 496dcfc384
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
2025-02-13 07:56:34 +03:00
binbjz a7de2004eb
Add Miniconda3 25.1.1-1 (#3192)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.13) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Waiting to run
ubuntu_build / ubuntu_build (3.10) (push) Waiting to run
ubuntu_build / ubuntu_build (3.11) (push) Waiting to run
ubuntu_build / ubuntu_build (3.12) (push) Waiting to run
ubuntu_build / ubuntu_build (3.13) (push) Waiting to run
ubuntu_build / ubuntu_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
Co-authored-by: binbjz <zhaobin@avenir.hk>
Co-authored-by: binbjz <binbjz@gmail.com>
2025-02-12 23:03:05 +03:00
Edgar Ramírez Mondragón f37a5a80d3
Add CPython 3.14.0a5 (#3194) 2025-02-12 23:02:24 +03:00
Ivan Pozdeev ddeb3facf0 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
2025-02-12 22:53:37 +03:00
native-api 519f90a67a
Add miniforge3-25.1.1-0, miniforge3-24.11.3-0 (#3191) 2025-02-12 21:49:27 +03:00
binbjz fee6057680
Add Miniconda3 25.1.1 0 (#3190)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
macos_build / macos_build (3.9) (push) Has been cancelled
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
* Add miniconda3-25.1.1-0

Co-authored-by: binbjz <zhaobin@avenir.hk>
Co-authored-by: binbjz <binbjz@gmail.com>
2025-02-10 21:41:22 +03:00
dand-oss 1c7fe36c55
Add PyPy v7.3.18 (#3184)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
Co-authored-by: Dan Dees <dand@appsmiths.com>
2025-02-08 04:46:04 +03:00
Ivan Pozdeev d327702c4d Fix OpenSSL 1.x version parsing
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
2025-02-05 20:57:20 +03:00
Ivan Pozdeev b3dad5887e 2.5.2 2025-02-05 19:54:06 +03:00
Edgar Ramírez Mondragón 8775ffe76c
Add CPython 3.12.9 and 3.13.2 (#3183) 2025-02-05 19:52:09 +03:00
Michael Šimáček 823dd3cef9
Add GraalPy 24.1.2 (#3176)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
2025-02-02 18:57:19 +03:00
threadflow 8d93ccae39
Fix OpenSSL version parsing in python-build script (#3181)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.13) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Waiting to run
ubuntu_build / ubuntu_build (3.10) (push) Waiting to run
ubuntu_build / ubuntu_build (3.11) (push) Waiting to run
ubuntu_build / ubuntu_build (3.12) (push) Waiting to run
ubuntu_build / ubuntu_build (3.13) (push) Waiting to run
ubuntu_build / ubuntu_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
2025-02-02 04:50:48 +03:00
Ivan Pozdeev 734d6323d8 2.5.1
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
2025-01-19 17:47:51 +03:00
Ned Batchelder c9514d8e8e
Add CPython 3.14.0a4 (#3168) 2025-01-19 16:22:10 +03:00
native-api e98a0b489f
Fix "Unsupported options" error building bundled OpenSSL <3.2.0 (#3164)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
2025-01-09 02:16:06 +03:00
native-api 0173299078
Add miniforge3-24.11.2-0, miniforge3-24.11.2-1 (#3163) 2025-01-08 23:51:11 +03:00
Jay Bazuzi 850a74c5cd
README: Add recommended curl arguments to suggested installer invocation (#3155)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
2025-01-04 19:43:09 +03:00
Christian Fredrik Johnsen 4c6b0e9c3b
Fix: mistake in configuration hints in pyenv init and manpage. (#3145)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.13) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
2024-12-23 20:58:54 +03:00
native-api 330e3fc130
CI: use Ubuntu 24.04; use ubuntu-latest for the ubuntu_build check (#3144)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.13) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-24.04) (push) Waiting to run
ubuntu_build / ubuntu_build (3.12) (push) Waiting to run
ubuntu_build / ubuntu_build (3.13) (push) Waiting to run
ubuntu_build / ubuntu_build (3.9) (push) Waiting to run
ubuntu_build / ubuntu_build (3.10) (push) Waiting to run
ubuntu_build / ubuntu_build (3.11) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
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.
2024-12-22 23:38:58 +03:00
Ivan Pozdeev 2aff0df76d 2.5.0 2024-12-22 23:22:20 +03:00
native-api 2acb2296e5
Exclude broken miniforge3/mambaforge3 22.11.0-0, 22.11.0-1, 22.11.0-2 from generation [no ci] (#3143) 2024-12-22 23:10:42 +03:00
native-api 04b440df0b
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) 2024-12-22 23:06:33 +03:00
native-api 5d80be09cb
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
2024-12-22 22:19:24 +03:00
Ivan Pozdeev e0504fc2f8 add_miniforge.py: Support different Python version lines, improvements
* report more progress
* don't download SHA files for unsupported architectures
2024-12-22 21:31:28 +03:00
native-api 51937ccc19
Add miniconda3-24.3.0-0 (#3139)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.13) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
2024-12-22 17:04:32 +03:00
Ivan Pozdeev ac2f882aab Fix scripts not getting a Python version for verify_pyXXX 2024-12-22 16:19:59 +03:00
Ivan Pozdeev 25c966eb4f add_miniconda.py: future-proof, update defaults, change -v
* future-proof PyVersion
* fix handling "-latest"
* Update default versions
* change -v argument to bool
2024-12-22 15:59:52 +03:00
Christian Fredrik Johnsen c6973391f3
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 - <shell>` 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.
2024-12-22 15:23:51 +03:00
binbjz 38421ba6aa
Add miniconda3-24.11.1-0 (#3138)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.13) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 1s
Co-authored-by: binbjz <zhaobin@avenir.hk>
2024-12-21 16:48:25 +03:00
Ivan Pozdeev a1edb81e8e 2.4.23
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-12-18 10:13:13 +03:00
Ned Batchelder 5f7892f728
Add CPython 3.14.0a3 (#3135) 2024-12-18 10:11:11 +03:00
Ivan Pozdeev 86be59a6d5 Tolerate nonexistent versions from pyenv-version-name in pyenv-which
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
Addendum to #3134 as per https://github.com/pyenv/pyenv/pull/3134#issuecomment-2545710044
2024-12-16 21:36:14 +03:00
native-api dc873cf568
Support missing versions being present and set in a local .python-version (#3134)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.13) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
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
2024-12-16 02:32:45 +03:00
Ivan Pozdeev aef6a2a6d0 Remove incorrect statement about resolution behavior
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.13) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
`shell` does not fall through to `local`, and `local to `global`.
2024-12-15 21:20:49 +03:00
native-api 527d8fab3e
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
2024-12-15 17:22:51 +03:00
native-api fc0e27c24b
Support PACKAGE_CPPFLAGS and PACKAGE_LDFLAGS (#3130)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
add test to test all the flag types
2024-12-13 23:06:03 +03:00
Oluf Lorenzen a2ad48aa40
README: explain using multiple versions (#3126)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
Co-authored-by: native-api <vano@mail.mipt.ru>
2024-12-12 06:58:02 +03:00
Ivan Pozdeev d04a081dcb 2.4.22
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-12-07 14:29:09 +03:00
Ivan Pozdeev cb83169098 fix CL: + test modified scripts with tar.gz source
missed some of the changes
2024-12-07 14:27:29 +03:00
Daniel Lamblin 3bdb9bd1e7
Fix 404 for bundled openssl-3.4.0 release in 3.13.1 (#3122) 2024-12-07 14:20:33 +03:00
native-api cc40a3f965
CL: + test modified scripts with tar.gz source (#3125) 2024-12-07 14:19:50 +03:00
native-api 25e70b2c80
CI: + build with bundled MacOS dependencies (#3123) 2024-12-07 13:58:35 +03:00
native-api 4c90a3147f
Speed up building bundled OpenSSL (#3124)
* Skip building bundled OpneSSL unnecessary parts
* Remove bundled OpneSSL build hack: no longer needed
2024-12-07 13:54:33 +03:00
Ivan Pozdeev ee84e89ef1 2.4.21
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-12-06 02:57:27 +03:00
native-api a39449bc50
Prefer tcl-tk@8 from Homebrew due to release of Tcl/Tk 9 with which only 3.12+ are compatible (#3118) 2024-12-06 02:55:53 +03:00
Michael Makukha 3bc0d858cc
Add 3.13.1t (#3120) 2024-12-06 01:53:45 +03:00
Ivan Pozdeev 0f8b2b2b84 2.4.20
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.13) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.13) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-12-04 02:08:51 +03:00
native-api c424717a39
Merge pull request #3117 from edgarrmondragon/cpython-3.13.1
Add CPython 3.9.21, 3.10.16, 3.11.11, 3.12.8 and 3.13.1
2024-12-04 02:07:07 +03:00
Edgar Ramírez-Mondragón 81632f0ab4
Remove EOL Python 3.8 from CI 2024-12-03 16:25:19 -06:00
Edgar Ramírez-Mondragón a79440470e
Run ubuntu_build on Python 3.13 2024-12-03 16:17:03 -06:00
Edgar Ramírez-Mondragón 84037dff4e
Run macos_build on Python 3.13 2024-12-03 16:11:00 -06:00
Edgar Ramírez-Mondragón a7a0354da9
Add CPython 3.9.21, 3.10.16, 3.11.11, 3.12.8 and 3.13.1 2024-12-03 16:09:02 -06:00
Clément Vannicatte 6140619301
README: correct link to shell setup instructions (#3113)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-11-27 23:30:12 +03:00
Noelle Leigh 61c0f25ef5
README: Fix Markdown in "Notes about python releases" (#3112)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
HTML and Markdown need to be separated by an empty line to co-exist, otherwise the Markdown isn't parsed correctly.
2024-11-23 16:35:06 +03:00
Ivan Pozdeev 1e8e96b8a2 2.4.19
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-11-20 22:11:32 +03:00
Madhu Gururajan 707e8d1ef8
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 <vano@mail.mipt.ru>
2024-11-20 22:08:35 +03:00
Ned Batchelder 04b32e2d46
Add CPython 3.14.0a2 (#3110) 2024-11-20 21:26:18 +03:00
Ivan Pozdeev 6393a4dfce 2.4.18
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-11-17 23:49:36 +03:00
Michael Goerz b0d6a67881
Add miniforge3-24.9.2-0 (#3106)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-11-13 23:57:14 +03:00
Ivan Pozdeev d64d1aa1e0 MAINTENANCE.md: easier way to make a release
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-10-28 02:53:18 +03:00
Ivan Pozdeev 96b3fb2fc3 2.4.17 2024-10-28 02:43:30 +03:00
native-api 7f60ef0b54
Merge pull request #3097 from binbjz/anaconda3-2024.10-1
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.8) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
Add Anaconda3-2024.10-1
2024-10-27 10:43:38 +03:00
binbjz 37ad06f7ce
Add miniconda3-24.9.2-0 (#3096)
Co-authored-by: binbjz <zhaobin@avenir.hk>
2024-10-27 10:35:24 +03:00
binbjz 6711e9a21d Add anaconda3-2024.10-1 2024-10-27 15:33:17 +08:00
binbjz f3e288c6ad Add miniconda3-24.9.2-0 2024-10-27 15:24:35 +08:00
Ivan Pozdeev 770eb66ec8 2.4.16
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-10-17 18:47:39 +03:00
Edgar Ramírez Mondragón 630b3700ad
Add CPython 3.14.0a1 (#3093) 2024-10-17 18:45:38 +03:00
Michael Šimáček fb9880e460
Add GraalPy 24.1.1 (#3092)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.8) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
2024-10-16 20:14:36 +03:00
Ivan Pozdeev 050f88c78b 2.4.15
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-10-11 16:31:00 +03:00
native-api 3ced1c4751
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'
2024-10-11 16:28:10 +03:00
Antoine Arbouin 03b60aafec
Support virtualenvs with names starting with "python-" (#3086) 2024-10-10 20:43:13 +03:00
Edgar Ramírez Mondragón 6a7ecfe409
Add CPython 3.13.0 (#3081) 2024-10-08 01:16:53 +03:00
David Poznik d201daeb33
Make "y/N" prompt consistent with others (#3080)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-10-05 02:17:45 +03:00
tuzi3040 468dc81107
CI: replace set-output with GITHUB_OUTPUT (#3079)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
`::set-output` is deprecated as per https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
2024-10-02 16:37:31 +03:00
Ivan Pozdeev 5180c3cfb5 2.4.14 2024-10-02 15:13:21 +03:00
Edgar Ramírez Mondragón 95917cb753
Add CPython 3.13.0rc3 (#3077) 2024-10-02 14:50:59 +03:00
Edgar Ramírez Mondragón 55134ea1a1
Add CPython 3.12.7 (#3078) 2024-10-02 14:50:30 +03:00
Ivan Pozdeev 3f2ef9e00a README: Clarify Zsh configuration
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
Closes #3069
2024-09-28 21:04:59 +03:00
Ivan Pozdeev 62fc392515 2.4.13
Some checks failed
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
2024-09-18 07:38:48 +03:00
Michael Šimáček d8f5b583bd
Add GraalPy 24.1.0 (#3066) 2024-09-18 07:33:27 +03:00
Edgar Ramírez Mondragón 6517caf583
Fix OpenSSL 3.3.2 download URLs (#3059)
Some checks failed
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-09-12 07:43:03 +03:00
native-api 9c40f0b67e
Fix tgz checksum for 3.9.20; fallback OpenSSL URLs checksums for 3.11.10, 3.12.6, 3.13.0rc2 (#3060)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.8) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
changed OpenSSL URLs to permalinks so that they keep working
2024-09-12 01:44:05 +03:00
Ed Morley d60d1c5cdc
Fix latest version resolution when using python- prefix (#3056)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
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.
2024-09-10 18:51:55 +03:00
Andrew Linzie 1cabb6e02b
docs: Use --verbose with performance CPython build instructions (#3053)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-09-08 22:13:47 +03:00
Ivan Pozdeev 2e658d3e35 2.4.12
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-09-07 18:50:46 +03:00
Edgar Ramírez Mondragón d8c8338cd8
Add CPython 3.8.20, 3.9.20, 3.10.15, 3.11.10 and 3.12.6 (#3050) 2024-09-07 18:47:51 +03:00
Edgar Ramírez Mondragón ac5c87e044
Add CPython 3.13.0rc2 (#3049) 2024-09-07 18:46:46 +03:00
Ivan Pozdeev b123520826 2.4.11
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-09-04 22:52:25 +03:00
John Sirois 5fcd9d7a4f
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
2024-09-04 22:15:59 +03:00
binbjz 669d1f1038
Add miniconda3-24.7.1-0 support (#3040)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
Co-authored-by: binbjz <binbjz@skiff.com>
2024-08-24 12:42:23 +03:00
Tom Schraitle 57a6772451
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."
2024-08-24 12:38:54 +03:00
Ivan Pozdeev 9ecd803bff 2.4.10
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-08-07 20:16:29 +03:00
Edgar Ramírez Mondragón 11efbdce46
Add CPython 3.12.5 (#3030) 2024-08-07 19:40:19 +03:00
Ivan Pozdeev 9e7010b72f 2.4.9
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-08-05 01:54:31 +03:00
Edgar Ramírez Mondragón 6511ce26cd
Add CPython 3.13.0rc1 (#3029)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-08-03 14:11:56 +03:00
Michael Goerz 9b09a7efc9
Add miniforge3-24.3.0-0 (#3028)
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-07-31 12:41:59 +03:00
Ivan Pozdeev f17809c4b9 2.4.8
Some checks failed
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-07-21 07:02:45 +03:00
native-api ae5ee4de26
Merge pull request #3021 from native-api/pyenv_latest_b_f
pyenv-latest: replace -q with -b and -f, document as internal
2024-07-21 06:58:00 +03:00
native-api e9611beffe
Fix tests failing if plugins are installed (#3022)
Drop the failing test in favor of a better-written test
that also tests the same
2024-07-21 06:57:39 +03:00
Ivan Pozdeev e44b12c2dc Remove nop tests
Easy syncing with Rbenv is not as important now
2024-07-21 06:36:06 +03:00
Ivan Pozdeev 9373970678 pyenv-latest: replace -q with -b and -f, document as internal
More tailored for the emergent internal use cases
2024-07-21 06:31:42 +03:00
ThomasHaz 88f76ee787
README: Remove reference to Fig [https://fig.io] (#3018)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.8) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
[Fig](https://fig.io) has been sunlit for new users, with access being removed in September
2024-07-20 21:32:57 +03:00
Edgar Ramírez Mondragón e396561661
Add CPython 3.13.0b4 and 3.13.0b4t (#3019) 2024-07-20 21:29:18 +03:00
native-api cdd97d8c30
Fix pyenv-uninstall not having the debug tracing invocation (#3020) 2024-07-20 21:22:50 +03:00
Ivan Pozdeev adf3c2bccf 2.4.7
Some checks failed
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
2024-07-06 04:44:35 +03:00
native-api 50e726ac41
Fix debug build for X.Yy-dev (#3011)
also just use extglob everywhere
2024-07-06 04:04:46 +03:00
native-api 662b5ddd13
Merge pull request #3009 from binbjz/add-new-anaconda3
Add support for anaconda3-2024.06-1
2024-07-06 03:43:27 +03:00
binbjz d81eebf8d1 Add support for anaconda3-2024.06-1 2024-07-05 19:37:22 +08:00
binbjz b11728c284
Merge branch 'pyenv:master' into master 2024-07-05 19:28:02 +08:00
Ivan Pozdeev ca90363d73 2.4.6
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.8) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 0s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 0s
2024-07-05 06:57:48 +03:00
Jon Crall 672eef1561
Speed up pyenv prefix by not constructing advice text when it would be discarded (#3005)
Some checks failed
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.8) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-13) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-14) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Failing after 16s
ubuntu_build / ubuntu_build (3.10) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.11) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.12) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.8) (push) Failing after 1s
ubuntu_build / ubuntu_build (3.9) (push) Failing after 1s
by adding an internal flag
2024-07-04 03:49:12 +03:00
Sam Gross 384361167a
Add 3.13.0b3t and exclude it from pyenv latest (#3001)
Some checks failed
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-13) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-14) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.8) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
This adds the free-threaded (without GIL) version of 3.13.0b3.

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2024-07-01 22:50:03 +03:00
native-api 1bcaab05b7
CI: push MacOS jobs to MacOS 13 and 14 (#3002)
Github has finally released those as free and retired macos-11
2024-07-01 22:38:06 +03:00
Ivan Pozdeev 2c2c7616e2 2.4.5 2024-06-30 20:58:02 +03:00
Edgar Ramírez Mondragón e8e8cfddcd
Add CPython 3.13.0b3 (#2996)
Some checks are pending
macos_build / macos_build (3.10) (push) Waiting to run
macos_build / macos_build (3.11) (push) Waiting to run
macos_build / macos_build (3.12) (push) Waiting to run
macos_build / macos_build (3.8) (push) Waiting to run
macos_build / macos_build (3.9) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-11) (push) Waiting to run
pyenv_tests / pyenv_tests (macos-12) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Waiting to run
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Waiting to run
ubuntu_build / ubuntu_build (3.10) (push) Waiting to run
ubuntu_build / ubuntu_build (3.11) (push) Waiting to run
ubuntu_build / ubuntu_build (3.12) (push) Waiting to run
ubuntu_build / ubuntu_build (3.8) (push) Waiting to run
ubuntu_build / ubuntu_build (3.9) (push) Waiting to run
2024-06-30 20:55:53 +03:00
Ivan Pozdeev 9546f729f7 2.4.4
Some checks failed
macos_build / macos_build (3.11) (push) Has been cancelled
macos_build / macos_build (3.10) (push) Has been cancelled
macos_build / macos_build (3.12) (push) Has been cancelled
macos_build / macos_build (3.8) (push) Has been cancelled
macos_build / macos_build (3.9) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-11) (push) Has been cancelled
pyenv_tests / pyenv_tests (macos-12) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-20.04) (push) Has been cancelled
pyenv_tests / pyenv_tests (ubuntu-22.04) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.10) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.11) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.12) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.8) (push) Has been cancelled
ubuntu_build / ubuntu_build (3.9) (push) Has been cancelled
2024-06-27 23:21:27 +03:00
Sam Gross d660c5a84f
Add support for free-threaded Python (#2995) 2024-06-27 23:18:14 +03:00
binbjz 7947efc130
Add support for miniconda3 24.5.0-0 with py3.12, py3.11, py3.10, py3.9 (#2994) 2024-06-27 20:18:34 +03:00
binbjz bc6a0db677
Merge branch 'pyenv:master' into master 2024-06-27 20:39:59 +08:00
Ivan Pozdeev 756aad2613 2.4.3 2024-06-12 22:48:15 +03:00
Ivan Pozdeev cb27e44291 Merge branch 'master' of https://github.com/pyenv/pyenv 2024-06-10 23:20:31 +03:00
Ivan Pozdeev 42c66c92d8 Document mirror structure and download cache
in more details
2024-06-10 23:20:20 +03:00
binbjz 613e5142b3
Add support for miniconda3 24.4.0-0 with py3.12, py3.11, py3.10, py3.9 (#2982)
Co-authored-by: zhaobin <zhaobin@skycloudsys.com>
2024-06-10 19:38:04 +03:00
zhaobin 4b60ddd06d Add support for miniconda3 24.4.0-0 with py3.12, py3.11, py3.10, py3.9 2024-06-10 15:36:21 +08:00
Ivan Pozdeev 7a91070c02 Removed obsoltete section about --enable-shared 2024-06-09 00:19:44 +03:00
Ivan Pozdeev a86ca7ac2e Document adding defnitions with a plugin 2024-06-09 00:19:03 +03:00
Ivan Pozdeev cb99cbcc8e README: Emphasize the main design idea of the plugins 2024-06-09 00:01:20 +03:00
Ivan Pozdeev 0963c8ac02 2.4.2 2024-06-08 23:49:46 +03:00
Taras I 79951112cc
Add CPython 3.12.4 (#2981)
Also bump up openssl version
2024-06-08 23:32:07 +03:00
John Sirois 2e0bb023e1
Add CPython 3.13.0b2 (#2978) 2024-06-06 21:09:33 +03:00
native-api b0cd5bf883
Add sed and greadlink to exceptions (#2977)
Anaconda has packages that override at least sed
Greadlink is also a critical executable if present
2024-06-04 01:06:33 +03:00
native-api 4ab9b3710b
Document PYTHON_BUILD_CURL_OPTS, PYTHON_BUILD_WGET_OPTS, PYTHON_BUILD_ARIA2_OPTS (#2976)
[no ci]
2024-06-02 15:24:00 +03:00
Younes Askour 8a464cfed1
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.
2024-06-01 22:13:57 +03:00
native-api 56956e9d90
Merge pull request #2969 from timfel/tim/graalpy-dev
Add script to install graalpy development builds
2024-05-27 21:25:30 +03:00
Tim Felgentreff 98c5b711dc fix http_get_aria to cat the correct file 2024-05-27 10:58:58 +02:00
Tim Felgentreff 2ecec311fe
Merge branch 'pyenv:master' into tim/graalpy-dev 2024-05-25 10:38:04 +02:00
Ivan Pozdeev 0e0ca0966b CI: Run changed scripts in debug mode also 2024-05-24 20:36:43 +03:00
Ivan Pozdeev 948f53f6d8 CI: run builds in debug mode
since we're only interested in the output when something goes wrong
2024-05-24 20:34:25 +03:00
Tim Felgentreff 037ba4516b add script to install graalpy ea builds 2024-05-23 14:55:00 +02:00
Ivan Pozdeev aabaa89243 2.4.1 2024-05-09 14:31:11 +03:00
Edgar Ramírez Mondragón ef8daeaea7
Add CPython 3.13.0b1 (#2959)
* Add CPython 3.13.0b1
* Use OpenSSL 3.3.0

---------

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2024-05-09 14:13:45 +03:00
Edgar Ramírez Mondragón 8c7fc98c4f
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
2024-05-09 12:58:17 +03:00
Edgar Ramírez Mondragón 3ff54e89bc
Add PyPy v7.3.16 (#2948) 2024-04-25 21:51:58 +03:00
Edgar Ramírez Mondragón e1f07da73a
Add CPython 3.13.0a6 (#2942) 2024-04-09 23:38:07 +03:00
Edgar Ramírez Mondragón e5997ef66b
Add CPython 3.12.3 (#2941) 2024-04-09 22:28:42 +03:00
Ivan Pozdeev 21eef94ea0 2.4.0 2024-04-07 21:29:02 +03:00
native-api 961882403a
Add anaconda 2024.02 (#2939) 2024-04-07 21:22:53 +03:00
Ivan Pozdeev b80d5fd28d 2.3.37 2024-04-07 20:48:40 +03:00
Ivan Pozdeev 5b4d5a32d3 remove duplication 2024-04-03 21:08:18 +03:00
Edgar Ramírez Mondragón 465b8ee74a
Add CPython 3.11.9 (#2938) 2024-04-02 17:49:31 +03:00
César Román 51a626c1ea
Add Jython 2.7.3 (#2936) 2024-03-30 12:57:02 +03:00
Edgar Ramírez Mondragón 7e550e31f7
Add CPython 3.10.14 (#2930) 2024-03-21 22:26:57 +03:00
Michael Šimáček 7deace6666
Add GraalPy 24.0.0 (#2928) 2024-03-19 23:43:01 +03:00
Edgar Ramírez Mondragón e41f7c9ee4
Add CPython 3.8.19 and 3.9.19 (#2929) 2024-03-19 23:41:58 +03:00
Edgar Ramírez Mondragón 0167890c8c
Add CPython 3.13.0a5 (#2924) 2024-03-16 01:53:11 +03:00
cuinix c5eae0f263
minor grammar fix in libffi backport patch in 2.5.x (#2922)
Signed-off-by: cuinix <915115094@qq.com>
2024-03-07 00:15:41 +03:00
binbjz 21c2a3dd69
Add miniconda3-24.1.2-0 support for py312、py311、py310、py39 (#2915)
Co-authored-by: binbjz <binbjz@skiff.com>
2024-02-28 18:58:25 +03:00
native-api 556edfb0ae
Merge pull request #2909 from aphedges/update-miniforge-2024-02-26
Add new miniforge and mambaforge definitions
2024-02-27 20:09:22 +03:00
native-api 5503efffcf
Merge pull request #2906 from native-api/use_linuxbrew_if_preferred
Use Homebrew in Linux if Pyenv is installled with Homebrew
2024-02-27 20:03:40 +03:00
Ivan Pozdeev 1e017f3917 Set useful PS4 in python-build 2024-02-27 19:17:47 +03:00
Ivan Pozdeev 05bb4f9a8d Use Homebrew in Linux if Pyenv is installed with Homebrew or PYTHON_BUILD_USE_HOMEBREW is set 2024-02-27 19:17:47 +03:00
native-api 9d8764f545
Document default build configuration customizations (#2911) 2024-02-27 19:10:39 +03:00
Ivan Pozdeev 57594c0600 More detailed explanation of the band-aid code 2024-02-27 18:51:46 +03:00
Ivan Pozdeev 2aa13dc4fe Remove broken miniforge3 and mambaforge 22.11.1-0 to 22.11.1-2
Cause 403s on dependency packages
2024-02-27 18:35:43 +03:00
Alex Hedges 5d06a27118 Update miniforge and mambaforge with add_miniforge.py 2024-02-26 18:48:29 -05:00
Alex Hedges dbbe2b63f4 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
2024-02-26 18:46:28 -05:00
Alex Hedges a43259a186 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`.
2024-02-26 18:44:05 -05:00
Alex Hedges 8316450887 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]: a15762906b/docs/releases.py (L35-L36)
2024-02-26 18:39:48 -05:00
Alex Hedges 02e1d4a293
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.
2024-02-26 00:07:52 +03:00
Ivan Pozdeev f9a2bb81b6 Revert "Add CPython 3.13.0a4 (#2903)" -- MacOS build is broken
This reverts commit 932dc464f5.
2024-02-20 20:42:21 +03:00
Saaket Prakash 932dc464f5
Add CPython 3.13.0a4 (#2903)
Co-authored-by: Edgar Ramírez Mondragón <16805946+edgarrmondragon@users.noreply.github.com>
2024-02-20 20:17:32 +03:00
native-api 8f8a5e03b4
Better document installing the HEAD version with Homebrew 2024-02-15 22:40:53 +03:00
Ivan Pozdeev 5e4879a2bc v2.3.36 2024-02-14 00:58:44 +03:00
Edgar Ramírez Mondragón aca9af761e
Add CPython 3.11.8 (#2898) 2024-02-10 13:28:24 +03:00
Edgar Ramírez Mondragón 443de6614b
Add CPython 3.12.2 (#2899) 2024-02-10 13:25:30 +03:00
Ruben Laguna 9908daf81d
Update pypy3.9-7.3.13 checksums
Releases have been reuploaded upstream
2024-01-25 00:22:54 +03:00
Edgar Ramírez Mondragón 2374260efa
Add PyPy v7.3.15 (#2886) 2024-01-18 10:00:11 +03:00
Edgar Ramírez Mondragón f82acf8d44
Add CPython 3.13.0a3 (#2885) 2024-01-17 21:45:12 +03:00
Michael Šimáček 46d3954bff
Add graalpy-23.1.2 (#2884) 2024-01-16 21:43:29 +03:00
dand-oss 6e3b91a816
Added PyPy 7.3.14 (#2876)
Co-authored-by: Dan Dees <dand@appsmiths.com>
2023-12-31 22:32:19 +03:00
Ryan Williams 920d8d4dbe
Make "Automatic installer" command a copy-able code block (#2874) 2023-12-30 18:11:56 +03:00
cpzt 2d85075123
Add micropython 1.20.0 and 1.21.0 (#2869) 2023-12-26 22:45:07 +03:00
binbjz 2798a6694d
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 <bin.zhao@naxions.com>
2023-12-26 03:51:40 +03:00
Marvin Häuser 2c69732fec
Add installation prefix to python-config --ldflags output (#2865)
Needed to link against libpython of the Pyenv-controlled installation
2023-12-26 03:43:53 +03:00
dependabot[bot] 96f93fd553
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] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-12 08:04:41 +03:00
Kurt McKee 3c92216ea2
Add a Dependabot config to auto-update GitHub action versions (#2863) 2023-12-12 07:29:06 +03:00
Anton Petrov 74a2523c97
v2.3.35 2023-12-08 13:23:20 +03:00
Anton Petrov dfde39650e
v2.3.35 2023-12-08 13:22:44 +03:00
Anton Petrov 2aa2d17f05
Merge pull request #2861 from edgarrmondragon/cpython-3.12.0 2023-12-08 06:14:46 +03:00
Edgar Ramírez Mondragón fce51d45a0
Add CPython 3.12.1 2023-12-07 18:52:56 -06:00
Anton Petrov d3766f22a5
v2.3.34 2023-12-06 06:56:43 +03:00
Anton Petrov 99d74e78f7
v2.3.34 2023-12-06 06:56:03 +03:00
Anton Petrov 3fc9f4381a
Merge pull request #2860 from edgarrmondragon/cpython-3.11.7
Add CPython 3.11.7
2023-12-05 09:07:32 +03:00
Edgar Ramírez Mondragón 1a9e9ee5da
Add CPython 3.11.7 2023-12-04 23:44:38 -06:00
native-api 3e1b4e0be1
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.
2023-11-29 23:39:14 +03:00
native-api ebff965cc6
Fix graalpy-community to use a separate package name (#2855)
Using the same name as graalpy causes a cache clash
2023-11-29 22:57:28 +03:00
Anton Petrov 2fb5b9e9a3
v2.3.33 2023-11-27 15:54:43 +03:00
Anton Petrov efb01775c0
v2.3.33 2023-11-27 15:54:25 +03:00
native-api 1239b7cb1f
python-build: Document PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA and PYTHON_BUILD_HTTP_CLIENT (#2853)
grammar
2023-11-26 12:59:10 +03:00
Anton Petrov 10f8805526
Merge pull request #2849 from edgarrmondragon/cpython-3.13.0a2 2023-11-24 09:14:29 +03:00
Edgar Ramírez Mondragón ae74597ded
Add CPython 3.13.0a2 2023-11-22 16:25:45 -06:00
Anton Petrov ac32a20f83
Merge pull request #2844 from binbjz/miniconda-bin 2023-11-18 11:58:54 +03:00
binbjz ae1c5d2bff Add support for miniconda3-3.10-23.10.0-1、miniconda3-3.9-23.10.0-1、miniconda3-3.8-23.10.0-1 2023-11-18 16:39:57 +08:00
Anton Petrov 94d879c92a
Merge pull request #2843 from binbjz/new-miniconda 2023-11-18 11:24:38 +03:00
binbjz ef0c2a787b Add support for miniconda3-3.11-23.10.0-1 2023-11-18 15:53:40 +08:00
Anton Petrov 4405459f57
Merge pull request #2839 from goerz-forks/miniforge3-23.3.1-1 2023-11-13 21:40:35 +03:00
Michael Goerz 62242c1d56 Add miniforge3-23.3.1-1 2023-11-13 12:39:23 -05:00
Anton Petrov d312301099
v2.3.32 2023-11-12 18:53:11 +03:00
Anton Petrov 988258ea5f
v2.3.32 2023-11-12 18:52:52 +03:00
native-api fb2c65f149
Make pyenv init output insertable to startup files (#2838) 2023-11-12 12:41:13 +03:00
native-api 087793a660
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.
2023-11-12 11:58:17 +03:00
fsc-eriker 63c471d020
Describe --no-rehash option in the manpage (#2832)
(Closes: #2831)
2023-10-30 22:10:26 +03:00
Anton Petrov 54f7a7c046
v2.3.31 2023-10-22 12:35:53 +03:00
Anton Petrov 011bbf0cca
v2.3.31 2023-10-22 12:35:36 +03:00
Anton Petrov a9a92dfdc5
Merge pull request #2824 from aphedges/update-miniconda-2023-10-21 2023-10-22 06:07:51 +03:00
Alex Hedges 968fc797c3 Update anaconda and miniconda with add_miniconda.py
This adds anaconda 2023.09 and miniconda 23.9.0.
2023-10-21 19:05:51 -04:00
Alex Hedges 27525adece 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.
2023-10-21 19:05:48 -04:00
Anton Petrov f50b99265c
v2.3.30 2023-10-16 21:37:24 +03:00
Anton Petrov 9c8f92cf4e
v2.3.30 2023-10-16 21:36:46 +03:00
startergo d25cd0d0f5
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
2023-10-15 17:17:22 +03:00
Ivan Pozdeev 709534c21f CI: add 3.12 2023-10-15 15:03:49 +03:00
native-api 62e2e9c743
Merge pull request #2807 from dand-oss/pypy-3.7.13
Add PyPy 7.3.13
2023-10-14 10:11:28 +03:00
Ivan Pozdeev 509d3a8855 Use pip<21 syntax in ensurepip call for pypy2.7-7.3.13 and 2.7.18 2023-10-14 07:38:42 +03:00
Dan Dees c6f0d31dc9 pypy 3.7.13 2023-10-14 07:38:41 +03:00
Edgar Ramírez Mondragón b8b6846a21
Add CPython 3.13.0a1 (#2818) 2023-10-13 21:07:42 +03:00
native-api dee8a9dbad
Fix intermittent "broken pipe" in version sort test (#2817) 2023-10-12 22:09:48 +03:00
Anton Petrov bb38acd994
v2.3.29 2023-10-06 08:05:47 +03:00
Anton Petrov 7d7e7e5b93
v2.3.29 2023-10-06 08:05:28 +03:00
Alex Hedges 928f69cf9a
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.
2023-10-06 06:59:29 +03:00
Anton Petrov 44c8f061af
Merge pull request #2812 from eregon/graalpy-gftc-23.1.0
Add GraalPy 23.1.0 definition using the faster Oracle GraalVM distribution
2023-10-05 19:19:41 +03:00
Benoit Daloze 931a7d7c7f 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
2023-10-05 12:16:37 +02:00
Anton Petrov 0ada42d89d
Merge pull request #2806 from coatl-dev/cpython-3.11.6
Add CPython 3.11.6
2023-10-03 14:29:43 +03:00
César Román 7fbec9a971
Add CPython 3.11.6 2023-10-02 14:10:51 -07:00
Anton Petrov 28e7000b48
v2.3.28 2023-10-02 19:54:39 +03:00
Anton Petrov a19d613877
Update CHANGELOG.md 2023-10-02 19:54:11 +03:00
Anton Petrov 3edc31eb3d
v2.3.28 2023-10-02 19:53:49 +03:00
Anton Petrov c9477dfd21
Merge pull request #2804 from edgarrmondragon/cpython-3.12.0
Add CPython 3.12.0
2023-10-02 19:50:27 +03:00
Edgar Ramírez Mondragón 3fda63be30
Add CPython 3.12.0 2023-10-02 08:54:31 -06:00
László Papp f7f096503a
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
2023-09-23 19:47:15 +03:00
Michael Šimáček 8b0c743f12
Add graalpy-23.1.0 (#2796) 2023-09-19 20:48:31 +03:00
Saaket Prakash bed2ec2f73
Add CPython 3.12.0rc3 (#2795) 2023-09-19 18:01:10 +03:00
Edgar Ramírez Mondragón a82598e174
Prefer OpenSSL 3 in Homebrew in 3.13-dev (#2793) 2023-09-19 07:53:45 +03:00
native-api d2c4d963d2
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.
2023-09-18 00:46:59 +03:00
Anton Petrov c844b332ca
v2.3.27 2023-09-17 10:48:10 +03:00
Anton Petrov 64af7c3e54
v2.3.27 2023-09-17 10:47:49 +03:00
Anton Petrov 261fd7c462
Merge pull request #2789 from zsol/patch-1
Update openssl url for 3.12.0rc2
2023-09-17 10:43:27 +03:00
Zsolt Dollenstein 91928bfbc4
Update openssl url for 3.12.0rc2
The old 3.1.1s URL returns a 404
2023-09-16 03:48:52 -07:00
Timothy Pansino 8cfc75604b
Fix get-pip urls for older pypy versions (#2788) 2023-09-16 11:02:21 +03:00
native-api da3ac7b7a3
Prefer OpenSSL 3 in Homebrew since 3.12 (#2781) 2023-09-07 22:11:04 +03:00
Ivan Pozdeev 259b5cad26 Remove 3.7 from CI
3.7 is EOL since 2023-06-27
https://peps.python.org/pep-0537/
2023-09-07 22:03:00 +03:00
Anton Petrov bdfb80cc12
v2.3.26 2023-09-07 11:36:40 +03:00
Anton Petrov abfa56e31d
v2.3.26 2023-09-07 11:36:22 +03:00
Edgar Ramírez Mondragón 1dbb100933
Add CPython 3.12.0rc2 (#2778) 2023-09-07 01:14:28 +03:00
native-api 9100243866
Merge pull request #2764 from xaocon/pip-fix
use -I with ensurepip
2023-08-30 21:16:25 +03:00
Anton Petrov 18ed727eb0
Merge pull request #2769 from xzmeng/fix-a-typo
fix a typo in README.md
2023-08-29 11:50:54 +03:00
Meng Xiangzhuo 3ba8df29e5 fix a typo in README.md 2023-08-29 16:45:11 +08:00
Alex Hedges e1b7e1b519
Fix "grep: warning: stray \ before -" in conda.bash (#2768)
According to the POSIX spec, an unescaped backslash not followed by
an escapable character is undefined behavior,
and it has become an error in GNU grep 3.8 (2022-09-02).
2023-08-28 23:57:04 +03:00
Ivan Pozdeev 2cbba05966 gitignore the bulid directory for tests 2023-08-27 20:27:48 +03:00
Evan Pitstick 6be6231444 Use -I with ensurepip
The -s flag assures that nothing can be installed to user site-packages
but doesn't keep ensurepip from looking there for Pip.
If Pip is installed in the user site-packages directory, pip won't be installed
for the newly built python -- and its shim won't be created.
-I makes the build install Pip in any case.
The user site-packages installation will override it --
but we'll have the shim at least.
2023-08-27 20:27:47 +03:00
Anton Petrov 7ec5c30451
Update pyenv---version 2023-08-27 01:29:50 -07:00
Anton Petrov 14cf54fb1c
Update CHANGELOG.md 2023-08-27 01:29:26 -07:00
Anton Petrov 6e79eb0b7c
Merge pull request #2763 from edgarrmondragon/cpython-3.10.13
Add CPython 3.8.18, 3.9.18, 3.10.13, 3.11.5
2023-08-25 08:47:19 +03:00
Edgar Ramírez Mondragón a8075debe5
Add CPython 3.8.18 2023-08-24 14:56:43 -06:00
Edgar Ramírez Mondragón 552827d3f9
Add CPython 3.9.18 2023-08-24 14:06:46 -06:00
Edgar Ramírez Mondragón 035c9336d2
Add CPython 3.11.5 2023-08-24 12:16:47 -06:00
Edgar Ramírez Mondragón c85ca6ce60
Add CPython 3.10.13 2023-08-24 08:51:13 -06:00
Anton Petrov 79a501139f
2.3.24 2023-08-11 02:21:21 -07:00
Anton Petrov 791ae90aef
2.3.24 2023-08-11 02:20:36 -07:00
Anton Petrov db871427c7
Add an updated Anaconda and Miniconda installer scripts 2023-08-11 12:00:12 +03:00
Anton Petrov 4c5eac68c5
Merge pull request #2752 from edgarrmondragon/cpython-3.12.0rc1
Add CPython 3.12.0rc1
2023-08-06 22:00:47 -07:00
Edgar Ramírez Mondragón d4ff57d0ce
Add CPython 3.12.0rc1 2023-08-06 11:37:43 -06:00
native-api ac5efed3a8
Fix FreeBSD tests in MacOS CI (#2748)
Guthub have recently preinstalled x64 Homebrew OpenSSL to stock MacOS runners. This has caused FreeBSD OpenSSL detection logic to erroneously trigger when running FreeBSD tests in MacOS because their paths happened to coincide.

Replaced checking a specific path with checking with pkg.
2023-07-28 15:23:39 +03:00
VictorieeMan 8aabba9485
README: Add explicit UNIX reference into the relevant installation sections (#2744)
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2023-07-23 22:29:17 +03:00
Anton Petrov 879fa68b35
v2.3.23 2023-07-22 16:09:30 +03:00
Anton Petrov e908606554
v2.3.23 2023-07-22 16:08:35 +03:00
native-api b81204c08b
Merge pull request #2742 from aphedges/update-miniconda-2023-07-11
Add new anaconda and miniconda definitions
2023-07-12 20:48:50 +03:00
Alex Hedges 37cc45a831 Update anaconda and miniconda with add_miniconda.py
This adds anaconda 2023.03, anaconda 2023.07, miniconda 23.3.1, and
miniconda 23.5.0.
2023-07-11 17:42:00 -04:00
Alex Hedges 3f6bc8d16a Support miniconda with Python 3.11 2023-07-11 17:36:41 -04:00
Alex Hedges dd5378941a Fix miniconda version handling
Anaconda and miniconda have changed their version string format again,
so the parsing needs to be done differently. `add_miniconda.py` can now
parse all existing definition files properly.
2023-07-11 17:30:10 -04:00
Alex Hedges 2506c9773c Log errors when parsing existing Conda versions
This makes it easier to fix file names that cannot be parsed using the
current logic.
2023-07-11 17:30:10 -04:00
Edgar R. M 51166377b7
Add CPython 3.12.0b4 (#2741) 2023-07-11 21:50:06 +03:00
Anton Petrov af1a54482b
Update CHANGELOG.md 2023-07-08 22:38:47 +03:00
Anton Petrov 64c70feb08
Update pyenv---version 2023-07-08 22:37:24 +03:00
Mészáros Máté Róbert 2f8cb2cf1f
Handle osx specific ln option name (#1)
On OSX `ln` does not have `--symbolic` only `-s`.

* bin/pyenv-link-version

---------

Co-authored-by: yfprojects <62463991+real-yfprojects@users.noreply.github.com>
2023-07-07 14:18:02 +00:00
Anton Petrov 7b713a88c4
Merge pull request #2739 from filips123/add-cinder-3.10
Add Cinder 3.10 and Cinder configure patches
2023-07-02 10:16:59 +03:00
Filip Š 1874f95a0e Update Cinder errors and warnings 2023-07-01 19:34:12 +02:00
Filip Š 1a882c6053 Add Cinder configure patches 2023-06-28 14:02:51 +02:00
Filip Š 05dcd45741 Add Cinder 3.10 2023-06-28 10:29:55 +02:00
Anton Petrov a2dff4809b
Merge pull request #2730 from edgarrmondragon/cpython-3.12.0b3
Add CPython 3.12.0b3
2023-06-21 07:47:36 +03:00
Edgar Ramírez Mondragón ad0d131032
Add CPython 3.12.0b3 2023-06-20 07:46:41 -06:00
Anton Petrov 7c17c741eb
2.3.21 2023-06-20 13:52:59 +03:00
Anton Petrov ba8b58f90d
2.3.21 2023-06-20 13:52:17 +03:00
native-api fe76b05445
Fix occasional 'libexec/pyenv-latest: line 39: printf: write error: Broken pipe' (#2729) 2023-06-20 03:04:06 +03:00
Anton Petrov c5d2639082
Merge pull request #2726 from edgarrmondragon/pypy-7.3.12
Add PyPy 7.3.12
2023-06-18 09:35:15 +03:00
Edgar Ramírez Mondragón d4bd7bbe2b
Add PyPy 7.3.12 2023-06-17 22:46:05 -06:00
Anton Petrov 38ac747239
Merge pull request #2724 from msimacek/master
Add graalpy-23.0.0
2023-06-14 09:41:42 +03:00
Michael Simacek 8f655d2ca6 Add graalpy-23.0.0 2023-06-13 17:13:00 +02:00
Ivan Pozdeev d0b78fd5fe CONTRIBUTING.md: clearer phrasing 2023-06-12 15:34:45 +03:00
Anton Petrov 43f40eca05
v2.3.20 2023-06-12 10:33:36 +03:00
Alex Tomkins 687944d991
Add missing patches for Python 3.7/3.8/3.9 (#2718)
* Use OpenSSL 1.1.1u and remove patches for 1.1.1q
2023-06-11 00:09:42 +03:00
native-api 0f337a6c9a
Merge pull request #2717 from native-api/backport_42351_3.5.10
Backport bpo-42351 to 3.5.10
2023-06-10 20:49:31 +03:00
Ivan Pozdeev afe2615a1c 3.5.10: Backport bpo-42351
The bug is reported to manifest in Mandjaro Linux 6.3.5-2
2023-06-10 20:33:01 +03:00
Ivan Pozdeev d7d5ab5148 3.5.10: Fix patches to apply cleanly 2023-06-10 20:31:57 +03:00
Anton Petrov e79dd97afa
v2.3.19 2023-06-08 12:18:16 +03:00
Anton Petrov 021b6c2da0
v2.3.19 2023-06-08 12:17:52 +03:00
Anton Petrov e008430451
Merge pull request #2713 from edgarrmondragon/cpython-3.12.0b2
Add CPython 3.12.0b2
2023-06-07 14:47:56 +03:00
Anton Petrov 09fc5b8824
Merge pull request #2714 from edgarrmondragon/cpython-3.10.12
Add CPython 3.10.12
2023-06-07 14:47:10 +03:00
Anton Petrov 6eeda1f87e
Merge pull request #2715 from edgarrmondragon/cpython-3.11.4
Add CPython 3.11.4
2023-06-07 14:46:34 +03:00
Edgar Ramírez Mondragón 452647ab33
Add CPython 3.11.4 2023-06-07 01:12:47 -06:00
Edgar Ramírez Mondragón 4086e452fd
Add CPython 3.10.12 2023-06-06 18:26:24 -06:00
Edgar Ramírez Mondragón 82c8d511c4
Add CPython 3.12.0b2 2023-06-06 14:39:15 -06:00
native-api 578c7507c6
Merge pull request #2711 from edgarrmondragon/cpython-3.9.17
Add CPython 3.7.17, 3.8.17 and 3.9.17
2023-06-06 20:04:06 +03:00
Edgar Ramírez Mondragón 23c727a767
Add CPython 3.7.17 and CPython 3.8.17 2023-06-06 10:39:56 -06:00
Edgar Ramírez Mondragón fb73c4b714
Add CPython 3.9.17 2023-06-06 09:19:19 -06:00
real-yfprojects b8d8dee191
Fix output
* bin/pyenv-link-version
2023-06-06 16:59:25 +02:00
real-yfprojects ba9099392a
Fix completions
* bin/pyenv-link
2023-06-06 16:56:16 +02:00
real-yfprojects d428be59ec
Write README.
* README.md
2023-06-06 16:45:22 +02:00
real-yfprojects dffc750fa2
Initial implementation
* bin/pyenv-link

* bin/pyenv-link-version
2023-06-06 16:22:52 +02:00
yfprojects f46b669f1d
Initial commit 2023-06-06 11:09:59 +00:00
Anton Petrov 3fa5812bfc
Update pyenv---version 2023-05-25 11:23:39 +03:00
Anton Petrov c8a23e26e6
Update CHANGELOG.md 2023-05-25 11:23:18 +03:00
t0b3 def5cd994e
Update 3.12-dev and add 3.13-dev (#2703) 2023-05-25 09:47:37 +03:00
Edgar R. M b5576240a2
Add CPython 3.12.0b1 (#2701) 2023-05-23 23:07:48 +03:00
Kevin Schoedel 920ef1456a
Support ksh alternative names (#2697)
* Support ksh versions

Korn shell had two major versions: ’88 and ’93. Some systems have
ksh installed under the name `ksh93`. A few systems (maybe only
Solaris now) also have a `ksh88`. A few others use the `pdksh` (’88)
or `mksh` (’93) implementations, originated before ksh was open source.

Limit to currently-used versions

---------

Co-authored-by: Kevin Schoedel <kps@datatravelandexperiments.com>
2023-05-13 01:24:57 +03:00
Anton Petrov 528d10e96f
Merge pull request #2691 from aviadhahami/master
fix: updating heredoc delimiter to be random and unique
2023-04-30 08:16:28 +03:00
Aviad Hahami cf9d0dcd7b
fix: updating heredoc delimiter to be random and unique 2023-04-30 00:56:43 +03:00
Anton Petrov aa5fd27e2f
Merge pull request #2687 from tomschr/bug2682-fix-manpage
Fix #2682: Correct pyenv_user_setup.bash file
2023-04-25 07:39:39 +03:00
Tom Schraitle 73b6307399 Fix #2682: Correct pyenv_user_setup.bash file
The manpage contains a reference to a file which does
only exist on Debian (/usr/share/pyenv/pyenv_user_setup.bash).

It is replaced by its content to make it usable for
other distributions.
2023-04-24 13:56:01 +02:00
Ivan Pozdeev a57e0b5019 README: move troubleshooting note higher 2023-04-16 20:11:08 +03:00
Anton Petrov b3c91b37d6
Merge pull request #2677 from mirekdlugosz/fix-31011-3113-tarxz
Correct link in has_tar_xz_support else branch of 3.10.11 and 3.11.3
2023-04-11 11:00:40 +03:00
Mirek Długosz 777089466d
Correct link in has_tar_xz_support else branch of 3.10.11 and 3.11.3 2023-04-11 09:15:16 +02:00
native-api 20189ff06f
Fix not showing symlink contents for unselected versions in pyenv versions (#2675) 2023-04-08 01:12:09 +03:00
Ivan Pozdeev 5a8dbcf143 Document using and writing plugins 2023-04-07 19:07:35 +03:00
Anton Petrov 9a4f9c2511
2.3.17 2023-04-06 06:58:52 +03:00
Anton Petrov bee178a95d
2.3.17 2023-04-06 06:58:33 +03:00
Anton Petrov 0f75cd8800
Merge pull request #2670 from mirekdlugosz/cpython-3.10.11
Add CPython 3.10.11
2023-04-05 18:28:35 +03:00
Anton Petrov 29c4f279a3
Merge pull request #2671 from mirekdlugosz/cpython-3.11.3
Add CPython 3.11.3
2023-04-05 18:07:59 +03:00
Mirek Długosz be4939604e
Add CPython 3.11.3 2023-04-05 15:52:01 +02:00
Mirek Długosz fc616a0aee
Add CPython 3.10.11 2023-04-05 15:51:13 +02:00
Edgar R. M b613a4abeb
Add CPython 3.12.0a7 (#2668) 2023-04-05 05:56:24 +03:00
Shengqi Chen b1ee6c93c4
Try locate readlink first in pyenv-hooks, fix #2654 (#2655)
* Remove all use of `greadlink`, fix #2654

Signed-off-by: Harry Chen <i@harrychen.xyz>

* revert greadlink back in tests

---------

Signed-off-by: Harry Chen <i@harrychen.xyz>
Co-authored-by: Anton Petrov <anton.a.petrov@gmail.com>
2023-03-28 11:25:27 +03:00
Petrov 9fad1f46c5
Update pyenv---version 2023-03-24 08:26:20 +03:00
Petrov f51d3dcb47
Update CHANGELOG.md 2023-03-24 08:26:05 +03:00
Petrov deb4935187
Merge pull request #2648 from anton-petrov/master
Add Anaconda3-2023.03
2023-03-23 14:38:52 +03:00
Petrov e28d747b83
set hashes to sha-256 2023-03-23 13:41:02 +03:00
Petrov ddd37eb823
Add hashes 2023-03-23 13:35:50 +03:00
Petrov be2bd5f03d
Create anaconda3-2023.03 2023-03-19 08:14:59 +03:00
Justin Lecher 4ef81b5c7a
Add Miniforge3-22.11.1-4 (#2642) 2023-03-10 19:38:06 +03:00
Anton Petrov 6bb75b3ba7
Update CHANGELOG.md 2023-03-10 09:04:21 +03:00
Anton Petrov f507d08064
Update pyenv---version 2023-03-10 09:03:23 +03:00
Saaket Prakash ad15c75e0e
Add CPython 3.12.0a6 (#2638) 2023-03-08 08:32:18 +03:00
Ivan Pozdeev 6052caa038 README: extended support for 3.5.10 2023-03-02 11:27:23 +03:00
Ivan Pozdeev e8a4b54231 CI: ubuntu-build: Fix 404s on apt install 2023-03-02 11:24:05 +03:00
Alex Hedges bcbdadf10d
Add miniconda 23.1.0-1 (#2635) 2023-03-02 06:49:44 +03:00
Anton Petrov 904dd5f828
Update pyenv---version 2023-03-01 08:25:31 +03:00
Anton Petrov 3226a1870b
Update CHANGELOG.md 2023-03-01 08:25:12 +03:00
Anton Petrov 0d19efecf5
Merge pull request #2634 from mrienstra/patch-1
README: clarify behavior of `pyenv latest`
2023-02-28 09:30:48 +03:00
Michael Rienstra ecab7b0d17
README: clarify behavior of pyenv latest 2023-02-27 16:26:18 -08:00
Chaim Halbert 3bfc97ad29
bpo-36231 for v3.5.10: fix Unsupported MacOS X CPU type in ffi.h (#2633) 2023-02-26 18:36:51 +03:00
native-api 276ce32643
Merge pull request #2630 from chaimleib/fix-bpo-27987-on-eol-pythons
bpo-27987 for v3.5.10 and v3.6.15: align by 16bytes on 64bit platforms
2023-02-26 16:05:39 +03:00
Chaim Halbert b30508f9b8 bpo-41100 for v3.5.10: fix implicit declaration of function sendfile 2023-02-26 05:51:20 -07:00
Chaim Halbert 0e80d0725b v3.5.10 on macOS13: fix unexpected output of arch on OSX 2023-02-26 05:21:03 -07:00
Chaim Halbert 6bec7a50fe bpo-45405 for v3.5.10: Prevent internal configure error when running configure with recent versions of clang. (GH-28845) (GH-31890) 2023-02-24 13:16:52 -07:00
Chaim Halbert 28be65992d bpo-27987 for v3.5.10 and v3.6.15: align by 16bytes on 64bit platforms 2023-02-24 12:19:13 -07:00
Florian Schüller 68918e69b7
Support for BusyBox version of `head' (#2629) 2023-02-22 20:11:48 +03:00
Rafał 86a4423bbb
Fix indentation (#2620) 2023-02-16 00:10:36 +03:00
Anton Petrov 0ab9683e58
2.3.13 2023-02-15 08:15:35 +03:00
Anton Petrov 7fe647968d
2.3.13 2023-02-15 08:15:14 +03:00
Anton Petrov c8daaa3954
Merge pull request #2614 from Afront/3.12.0a5
Add CPython 3.12.0a5
2023-02-08 14:08:18 +03:00
Anton Petrov 88be70722f
Merge pull request #2616 from edgarrmondragon/cpython-3.10.10
Add CPython 3.10.10
2023-02-08 14:07:46 +03:00
Anton Petrov 47d88d2c5f
Merge pull request #2615 from edgarrmondragon/cpython-3.11.2
Add CPython 3.11.2
2023-02-08 14:07:34 +03:00
Edgar Ramírez Mondragón 6b758c8cf9
Add CPython 3.10.10 2023-02-08 03:43:04 -06:00
Edgar Ramírez Mondragón 017b6d877e
Add CPython 3.11.2 2023-02-08 03:38:33 -06:00
Afront 063aa457e4
Add CPython 3.12.0a5 2023-02-08 15:34:14 +09:00
native-api fcd7806529
Merge pull request #2612 from laggardkernel/bugfix/realpath-in-versions
Fix link resolving in pyenv-versions
2023-02-06 20:09:22 +03:00
Ivan Pozdeev a3f0bddc2a CI: Migrate to checkout@v3
Actions runner warns about v2 deprecation
2023-02-06 19:22:38 +03:00
Ivan Pozdeev f72c1712dc CI: Test with native extension
Only run tests for subcommands that use the native extension
2023-02-06 19:22:38 +03:00
laggardkernel a7b181c3ca Fix link resolving in pyenv-versions
Co-Authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2023-02-06 19:22:38 +03:00
native-api c8c324afb4
Merge pull request #2610 from native-api/version_skip_envs
Ignore virtualenvs in `pyenv latest' in a clean way
2023-02-02 20:01:28 +03:00
Ivan Pozdeev 72c5b034ca Avoid the need to filter out envs in `pyenv-latest' 2023-02-02 18:24:17 +03:00
Ivan Pozdeev 446411dc64 Streamline `pyenv-versions --bare'
Achieves a ~20% speedup.
As it's used in pyenv-latest, this affects all version lookups
2023-02-02 18:15:47 +03:00
Ivan Pozdeev 9fe80f28e5 Add pyenv versions' option to skip envs for pyenv-latest' 2023-02-02 18:15:13 +03:00
native-api 9248255f70
Show symlink contents in non-bare `pyenv versions' (#2609)
* Change other tests to use the newly-created convenience function
2023-02-02 17:24:19 +03:00
native-api 368e04f3fa
Fix pyenv-latest to ignore virtualenvs (#2608)
* Add test, exclude alphas as well
2023-02-02 15:15:16 +03:00
Anton Petrov 76e93b073e
2.3.12 2023-01-30 08:19:43 +03:00
Anton Petrov e3fe82a9b1
2.3.12 2023-01-30 08:19:25 +03:00
native-api dd60d5fae2
Fix overriding arguments for --enable-framework and --enable-universalsdk after #2592 (#2605) 2023-01-29 00:59:47 +03:00
Anton Petrov 96828af31e
Merge pull request #2602 from colesbury/nogil-3.9.10-1
Add more recent build of nogil Python.
2023-01-23 16:17:32 +03:00
Sam Gross c998eae677 Add more recent build of nogil Python. 2023-01-22 13:12:28 -08:00
native-api c20fc7bd6a
Fix pyenv which to support auto-resolved prefixes (#2601)
* Resolve version name that hooks see
* Avoid a 2nd iteration over configured versions
2023-01-22 18:22:26 +03:00
native-api f1a1f59c87
Fix :latest after #2568 (#2599)
* Cleanup mocks logic
* Add test for `:latest`
2023-01-22 05:49:40 +03:00
Ivan Pozdeev b64b0ab5e2 Merge branch 'master' of https://github.com/native-api/pyenv 2023-01-22 00:20:28 +03:00
Ivan Pozdeev 1a0b555baf Improve visibility of the auto-resolution feature
Recent feedback showed that it's not visible enough
2023-01-22 00:07:53 +03:00
native-api 819e2b8f45
Fix wrong libpython being linked to in MacOS (#2596)
Without rpath, python would link up to the system's libpython
2023-01-19 00:21:10 +03:00
Christian Clauss bd618ea9ef
add_miniconda.py: fix typo oversight (#2595) 2023-01-15 13:37:11 +03:00
Anton Petrov b77b0be089
2.3.11 2023-01-15 12:44:38 +03:00
Anton Petrov 906246da4c
2.3.11 2023-01-15 12:43:34 +03:00
native-api 12e74e147a
Fix a compilation error in 3.8.10+ and 3.9.5+ when linking against OpenSSL built with SSLv3 support (#2594) 2023-01-14 05:18:10 +03:00
Ivan Pozdeev 2b0dd7355d Specify additional required information for build failures 2023-01-14 02:28:38 +03:00
native-api f40397088c
Merge pull request #2592 from native-api/disable_shared
* Fix priority for user-supplied configure and make flags
* Don't set --enable-shared if user supplied --disable-shared
2023-01-14 02:00:53 +03:00
Ivan Pozdeev e447fe5b73 Don't set --enable-shared if user supplied --disable-shared 2023-01-14 01:45:20 +03:00
Ivan Pozdeev 4242694a0e Fix priority for user-supplied configure and make flags 2023-01-14 01:44:59 +03:00
native-api 83619f3fbe
Merge pull request #2593 from native-api/fix_freebsd
Fix using dependencies from Ports in FreeBSD that are not searched with pkg-config
2023-01-13 22:20:01 +03:00
Ivan Pozdeev 4bd8a975f4 Avoid adding dangling spaces to *FLAGS 2023-01-13 22:07:31 +03:00
Ivan Pozdeev 2a5bbf6cb5 Fix searching readline and sqlite3 in FreeBSD
Surprisingly, CPython doesn't search these with pkg-config
This is fixed upstream in 3.12.0a1
2023-01-13 22:07:31 +03:00
Sean McGivern b9a27af7b8
Add missing Miniforge/Mambaforge versions (4.10.2-0 - 22.9.0-3) (#2591) 2023-01-11 22:51:31 +03:00
Anton Petrov c03d9cf84c
Merge pull request #2560 from smcgivern/add-miniforge-script
Add a script to add the latest miniforge and mambaforge versions
2023-01-11 19:43:31 +03:00
Sean McGivern c7f2c4db45
Add a script to add the latest miniforge and mambaforge versions
This takes inspiration from the similar script for miniconda, but it
simplifies in a couple of ways:

1. Use the GitHub Releases API instead of scraping HTML.
2. Don't perform a diff, simply add the latest release.

Lots of intermediate miniconda releases have been skipped in the past,
and it doesn't seem particularly valuable to backfill those.
2023-01-11 13:59:33 +00:00
Anton Petrov 3bc3a624db
Merge pull request #2590 from Afront/3.12.0a4
Add CPython 3.12.0a4
2023-01-11 10:43:45 +03:00
Afront f4598bc1f0
Add CPython 3.12.0a4 2023-01-11 13:16:00 +09:00
Anton Petrov fc4c0ac52d
2.3.10 2023-01-10 19:03:46 +03:00
Anton Petrov 579c34e570
2.3.10 2023-01-10 19:03:00 +03:00
native-api 2369ac2a08
Fix using dependencies from Ports in BSD with no pkg-config (#2586) 2023-01-10 01:13:09 +03:00
Brendan Falk 25c974d59a
Add Fig as autocomplete suggestion (#2574)
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2023-01-05 05:03:45 +03:00
native-api 2ea797e226
Merge pull request #2583 from aphedges/update-miniconda-22.11.1
Add miniconda 22.11.1-1
2023-01-05 04:47:28 +03:00
Alex Hedges 7d7f8b94ae Add miniconda 22.11.1-1 2023-01-03 20:31:01 -05:00
Alex Hedges e715e03be0 Support new miniconda file name format 2023-01-03 20:29:19 -05:00
Alex Hedges b3a5b5eee3 Support miniconda with Python 3.10 2023-01-03 20:18:26 -05:00
Anton Petrov 894bcd8717
Merge pull request #2579 from hauntsaninja/faster-cpython
Mention how to build for maximum performance
2023-01-03 09:04:44 +03:00
hauntsaninja 03ee3ffd32 Mention how to build for maximum performance 2023-01-02 14:35:16 -08:00
dand-oss 3d83bcdbef
Add PyPy 7.3.11 (#2576)
Co-authored-by: Dan Dees <dand@appsmiths.com>
2022-12-31 11:17:18 +03:00
Ian Chen f897c50202
Fix non-bash output while detecting shell (#2561)
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2022-12-25 02:35:03 +03:00
Anton Petrov 773c65416b
Merge pull request #2554 from anton-petrov/master
Build CPython with--enable-shared flag by default on non-mac systems
2022-12-23 13:48:30 +03:00
Anton Petrov ca1593c80e
Fix build tests 2022-12-23 13:36:37 +03:00
Anton Petrov cb5da5e831
Merge pull request #2568 from rockandska/fix/919
Allow multiple versions for pyenv-install
2022-12-22 21:44:28 +03:00
rockandska 31f372034d Allow multiple versions for pyenv-install 2022-12-22 19:04:04 +01:00
Tobias Klauser ff93c58bab
Remove stray newline after python-build installation (#2566)
To match other Pyenv commands
2022-12-20 22:01:19 +03:00
Anton Petrov 2bb59169db
2.3.9 2022-12-19 07:52:52 +03:00
Anton Petrov f9e519611a
2.3.9 2022-12-19 07:52:31 +03:00
Phung Nhat-Huy ae04877154
Add Anaconda3-2022.10 (#2565) 2022-12-19 01:16:18 +03:00
Anton Petrov e82e12739c
Merge pull request #2564 from samdoran/openssl-patches
Add `openssl` patches for 3.7.15, 3.7.16, and 3.8.16
2022-12-16 10:10:32 +03:00
Sam Doran 6b9795728e
Add openssl patches for 3.7.15, 3.7.16, and 3.8.16 2022-12-15 16:48:41 -05:00
宇萱/土撥鼠(Lisbeth) 23576296ae
Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.16 (#2558) 2022-12-13 20:05:01 +03:00
Anton Petrov 2128b4f27d
Merge pull request #2559 from smcgivern/add-miniforge3-22.9.0-2
Add miniforge3 and mambaforge 22.9.0-2
2022-12-13 19:17:19 +03:00
Sean McGivern 9ba6124833
Add miniforge3 and mambaforge 22.9.0-2 2022-12-13 11:19:40 +00:00
native-api 6c63e086e9
Merge pull request #2553 from dand-oss/pypy7.3.10
Add Pypy 7.3.10
2022-12-11 04:18:08 +03:00
Dan Dees 540c94bdb1 CI: Use PyPy 2.7 as PyPy source build bootstrapper 2022-12-11 02:19:19 +03:00
Ivan Pozdeev 18f62f266d Remove no-longer-needed PyPy prerequisites 2022-12-11 02:18:36 +03:00
Ivan Pozdeev 49cc88094a CI: Install bootstrapper Python for PyPy source builds 2022-12-11 02:17:39 +03:00
Dan Dees cad18bb332 Add PyPy 7.3.10 2022-12-11 02:17:19 +03:00
Ivan Pozdeev 79fdf1e3bb Improve Mac feature messages phrasing 2022-12-09 16:58:44 +03:00
Ivan Pozdeev 03bba03291 Set --enable-shared earlier
To take advantage of the existing logic to add to rpath
2022-12-09 16:52:47 +03:00
Ivan Pozdeev cf50e2a2db Don't hide output from extension checks 2022-12-09 11:41:26 +03:00
Anton Petrov b3d52b05d2
--enable-shared by default on non-mac systems 2022-12-08 12:17:53 +03:00
Anton Petrov 73dc5547fc
Merge pull request #2551 from nwh/add-miniforge3-latest-suffix
add -latest suffix to miniforge3
2022-12-08 11:33:16 +03:00
Anton Petrov 3f0dd1962f
2.3.8 2022-12-08 10:07:26 +03:00
Chad Crawford 48b0224aaf
Add CPython 3.7.16, 3.8.16, 3.9.16 (#2550) 2022-12-08 00:26:27 +03:00
Nick Henderson 8cfa967d74 add -latest suffix to miniforge3
The auto-resolve feature (#2487) means that

  pyenv install miniforge3

installs miniforge3-4.10.3-10 and not the exactly named "miniforge3"
recipe.  Renaming "miniforge3" to "miniforge3-latest" solves this
issue allowing users to execute

  pyenv install miniforge3-latest

This is similar to the naming of the current "miniconda3-latest" recipe.
2022-12-07 12:56:03 -08:00
Anton Petrov a57106c932
Merge pull request #2544 from rudisimo/master
Add CPython 3.10.9
2022-12-07 14:35:18 +03:00
Anton Petrov 189e73e5e8
Merge pull request #2549 from anton-petrov/master
Add CPython 3.11.1
2022-12-07 14:34:58 +03:00
Anton Petrov 8680247381
Add CPython 3.11.1 2022-12-07 13:43:35 +03:00
Anton Petrov 606ff454a1
Merge pull request #2545 from saaketp/3.12.0a3
Add CPython 3.12.0a3
2022-12-07 13:10:57 +03:00
Saaket Prakash b05d15f673 Add CPython 3.12.0a3 2022-12-07 04:57:31 +05:30
Rodolfo Puig 881ba40ff4 Add CPython 3.10.9
Signed-off-by: Rodolfo Puig <rodolfo@puig.io>
2022-12-06 17:36:03 -05:00
Anton Petrov 58bbbf8880
Merge pull request #2540 from ianchen-tw/detect-shell
Export detected shell environment in pyenv-init
2022-12-02 18:07:11 +03:00
Ian Chen c1674cd552 Detect shell 2022-12-02 00:22:50 +08:00
Anton Petrov 74f923b5fc
2.3.7 2022-12-01 10:16:53 +03:00
Anton Petrov 59c560893a
2.3.7 2022-12-01 10:15:45 +03:00
spookyuser 4971d9e35e
Copy auto installer oneliner to README (#2538) 2022-11-29 23:00:22 +03:00
weensy 6d13db992f
Fix typo in README.md (#2535)
There was a space at the beginning of the `git clone` command
2022-11-28 19:43:11 +03:00
Ivan Pozdeev 13d8568620 Add 3.11 into CI for Linux 2022-11-19 00:08:53 +03:00
Isaac Levy cc56f76733
Add --no-push-path option (#2526)
In some advanced shell setups, the order of custom-added PATH entries is important.
We disregard it by default, always pushing shims to the front of PATH,
to ensure that Pyenv works even in poorly maintained shell environments
and with minimal hassle for non-export users
(an attempt to do the opposite (#1898) has ended in a disaster).
Some advanced users are however ready and able to carefully maintain their environment
and deal with breakages and inconvenience. This option is for them.
2022-11-19 00:01:59 +03:00
Saaket Prakash 4c261e6ea1
Add CPython 3.12.0a2 (#2527) 2022-11-16 00:10:34 +03:00
native-api 31355676f0
Support aria2c being a snap (#2528)
Likely in Ubuntu where it's only available as a snap
2022-11-15 20:57:04 +03:00
Alex Hedges c162dcd932
Add .editorconfig (#2518) 2022-11-13 05:35:45 +03:00
native-api 0b6320d371
Merge pull request #2520 from twangboy/fix_3.9.15
Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.15 and 3.8.15
2022-11-13 04:52:37 +03:00
Twangboy 3bfaa33c1b Gitignore special files of PyCharm and Vim 2022-11-13 04:47:01 +03:00
Twangboy cd2858aa17 Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.15 and 3.8.15 2022-11-13 04:46:48 +03:00
James Campbell 19359de7b8
Add activate.nu to shim creation exception list (#2524) 2022-11-10 18:58:04 +03:00
Alex 8dd46e3915
GitHub Workflows security hardening (#2511)
Signed-off-by: Alex <aleksandrosansan@gmail.com>
2022-11-10 04:46:55 +03:00
native-api ed1083ec27
Fix resolution of a name that's a prefix of another name (#2521) 2022-11-10 04:46:14 +03:00
Ivan Pozdeev 904fe964b0 README: Prefix auto-resolution: improve phrasing 2022-11-07 04:46:44 +03:00
Hoàng 036fd63bbd
style: convert crlf to lf (#2517) 2022-11-06 19:18:04 +03:00
native-api 1250d7dd30
Don't use Zlib from XCode SDK if a custom compiler is used (#2516) 2022-11-05 02:11:55 +03:00
Omer Korner ad6a950734
Add Python version 3.11 to the macOS build (#2510) 2022-11-03 15:32:52 +01:00
Rust Saiargaliev 6da0e89207 2.3.6 2022-11-03 09:26:31 +01:00
Ivan Pozdeev e03118235a Improve prefix resolution documentation 2022-10-30 21:38:06 +03:00
Rust Saiargaliev a8f921ce4d
Document the release process (#2503) 2022-10-30 12:42:20 +03:00
Ivan Pozdeev 4a031504db Document prefix auto-resolution et al.
* Document listing available versions in the tutorial (#1677)
* Reflect 3.7.15's extended support
* Document using development head with Homebrew
* Structurize the Upgrading section
* Fix Pyenv-latest documentation
2022-10-30 05:28:53 +03:00
Ivan Pozdeev 75022d5d7c Revert version auto-resolution in python-build
It was moved to `pyenv-install`
2022-10-30 04:12:42 +03:00
native-api a12f947cc3
Auto-resolve prefixes to the latest version (#2487) 2022-10-30 03:38:40 +03:00
native-api 0b5e16add3
Fix invalid syntax error in pyenv init - if PYENV_ROOT has spaces (#2506) 2022-10-29 23:08:02 +03:00
native-api 5b0ac41dec
Discover Tcl/Tk from Homebrew via pkgconfig for 3.11+ (#2501)
CPython 3.11+ dropped support for --with-tcl-tk-*
in favor of pure pkgconfig
2022-10-29 22:48:13 +03:00
Michael Šimáček 44510a68f1
Add graalpy-22.3.0 (#2497) 2022-10-27 02:55:27 +03:00
Edgar R. M 16c4924f22
Add CPython 3.12.0a1 (#2495) 2022-10-27 02:41:30 +03:00
native-api ac30d5f4e4
Merge pull request #2500 from native-api/fix_macos_openssl_build
Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+
2022-10-27 00:22:09 +03:00
Ivan Pozdeev 9f5dcbffd4 Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+
"error: implicitly declaring library function 'memcmp'"
Downstream backport of https://github.com/openssl/openssl/issues/18720
2022-10-27 00:02:24 +03:00
Ivan Pozdeev faceb4b79c Allow patching supplementary packages 2022-10-27 00:02:13 +03:00
Igor Davydenko d7389c10ee
Update Python 3.11.0 tgz checksum (#2496)
For some reason checksum for `Python-3.11.0.tgz` file introduced in
0726e02e3a is invalid. Update that
checksum to ensure `pyenv install 3.11.0` works well on systems without
tar.xz support.
2022-10-26 21:21:53 +03:00
Noam Cohen 0726e02e3a
Add CPython 3.11.0 (#2493) 2022-10-24 22:49:48 +03:00
Adam Johnson 03a5d65387
Add CPython 3.7.15, 3.8.15, and 3.9.15 (#2482)
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2022-10-12 20:52:53 +03:00
MuX 776f6ff9fa
Add CPython 3.10.8 (#2480) 2022-10-12 07:39:42 +03:00
Ivan Pozdeev bb0f2ae1a7 Merge branch 'master' of https://github.com/pyenv/pyenv 2022-10-08 20:49:53 +03:00
Ivan Pozdeev ea6085e3f3 2.3.5 2022-10-08 20:49:49 +03:00
Ville Skyttä 2c2619a49e
Add Pyston 2.3.5 (#2476) 2022-10-05 20:52:20 +03:00
native-api 1f526edbdd
Merge pull request #2471 from native-api/add_dsymutil
Build CPython 3.12+ with --with-dsymutil in MacOS
2022-09-23 16:37:19 +03:00
Ivan Pozdeev 8b226c9679 Build 3.12+ with --with-dsymutil 2022-09-23 16:16:17 +03:00
Ivan Pozdeev f3521e88be Allow to build CPython with --with-dsymutil
Since 3.12, CPython can provide debug symbols in
Apple's nonstandard way, "dSYM bundles"
2022-09-23 16:16:17 +03:00
native-api 5b08a6492b
Add missing patch for 3.7.14 (#2469) 2022-09-22 10:59:03 +03:00
Nikita Sobolev d722f059a0
Drop Travis integration (#2468)
It has been unused since Travis dropped free plans
2022-09-22 10:32:50 +03:00
native-api 093d0b3a49
Merge pull request #2464 from samdoran/skip-brew
Add ability to easily skip all use of Homebrew
2022-09-19 00:59:55 +03:00
Ivan Pozdeev 73d4f3102a Allow to test python-build separately 2022-09-19 00:19:01 +03:00
Ivan Pozdeev aa07a3a37c Remove extraneous is_mac call 2022-09-19 00:19:00 +03:00
Sam Doran e6446555f3 Add envvar to skip Homebrew 2022-09-19 00:19:00 +03:00
native-api c5e0d2cd94
Document extended support for 3.7.14
Added in https://github.com/pyenv/pyenv/pull/2463
2022-09-15 22:01:05 +03:00
Sam Doran cfe684ef42
Add patches for 3.7.14 needed for Apple Silicon (#2463) 2022-09-15 17:53:22 +03:00
Viktor Haag 1d28067353
Add CPython 3.11.0rc2 (#2459) 2022-09-14 07:53:34 +03:00
Tsuki 0740fdf910
Update miniconda3-3.9-4.12.0 (#2460)
update checksum from https://repo.anaconda.com/miniconda/
Miniconda3-py39_4.12.0-MacOSX-arm64.sh	52.2M	2022-06-01 14:45:20	f7448cfeb278f2a84ed903db02d5525c
2022-09-14 07:48:12 +03:00
Anton Petrov 75fc9f6fd4
Merge pull request #2456 from edgarrmondragon/cpython-3.7.14_3.8.14_3.9.14
Add CPython security releases 3.7.14, 3.8.14 and 3.9.14
2022-09-11 19:47:51 +03:00
Edgar Ramírez Mondragón a0fbdad292
Add CPython security releases 3.7.14, 3.8.14 and 3.9.14 2022-09-07 11:13:11 -05:00
Grzegorz 6a104f68d0
docs: Add configuration option for Fish 3.2.0+ (#2449)
The original instructions were added 2 years ago in 0f2d659732. Since then, [Fish released](https://github.com/fish-shell/fish-shell/releases/tag/3.2.0) [a more declarative instruction for this operation](https://fishshell.com/docs/current/cmds/fish_add_path.html), which is now the recommended way of manipulating `PATH` in Fish.
2022-09-06 21:39:31 +03:00
Edgar R. M f6f1803ac9
Add CPython 3.10.7 (#2454) 2022-09-06 19:13:59 +03:00
Ivan Pozdeev 23559ee6d1 Fix syntax error 2022-09-06 01:43:12 +03:00
Ivan Pozdeev 4e31668c21 Ignore beta and release candidates in :latest
Fixes https://github.com/pyenv/pyenv/issues/2450
2022-09-05 23:20:39 +03:00
Ivan Pozdeev 2b22145670 2.3.4 2022-09-04 01:54:33 +03:00
Filip Š 7c1c180551
Add Cinder 3.8 (#2433)
* Add Cinder 3.8
* Add distro and GCC warnings
* Set the complier to GCC 10 if available

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2022-09-04 01:48:43 +03:00
native-api a648682ed6
CI: Bump OS versions (#2448)
* CI: Bump OS versions

Github released ubuntu-22.04 and macos-12 from beta
and deprecated ubuntu-18.04 and macos-10.15, due to dropping by 2013.

* CI: clean up installed packages
2022-09-04 01:40:00 +03:00
James Stronz 47b0ce77c0
Re-allow paths in .python-version provided that they resolve to within the versions dir (#2442)
* Fixes #2430 while still preventing CVE-2022-35861
* Adds a skipped version message to stderr

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2022-09-03 22:37:53 +03:00
Ivan Pozdeev fdabd14c2b Merge branch 'master' of https://github.com/pyenv/pyenv 2022-09-03 22:31:15 +03:00
Ivan Pozdeev e52ad61389 CI: Bump versions 2022-09-03 22:31:00 +03:00
native-api 2e5983b004
Merge pull request #2447 from native-api/ci_modified_micropython
CI: support Micropython, deleted scripts; build with -v
2022-09-03 22:22:56 +03:00
Ivan Pozdeev 27b5f62dfb CI: Build with -v 2022-09-03 22:02:47 +03:00
Ivan Pozdeev 7c1e3a710c CI: Support Micropython 2022-09-03 22:02:47 +03:00
Ivan Pozdeev 13f273188d CI: Exclude deleted scripts from modified check 2022-09-03 22:02:47 +03:00
Dmitriy Serdyuk c89a69a6ed
Add micropython 1.18 and 1.19.1 (#2443)
Support frozen builtin modules e.g. upip
2022-09-01 13:48:26 +03:00
native-api a8afc61146
CONTRIBUTING.md: phrasing 2022-08-16 21:33:49 +03:00
native-api e4a0c12b1b
CONTRIBUTING.md: clarify that Bash 4+ optimizations are allowed 2022-08-16 21:32:14 +03:00
hardikpnsp afeb971fa2
Add support for multiple versions in pyenv uninstall (#2432) 2022-08-15 20:25:46 +03:00
Edgar R. M 965421d5d4
Add CPython 3.11.0rc1 (#2434) 2022-08-14 15:12:22 +03:00
Janith Petangoda ae22c69505
Small update to instruction in README.md (#2431) 2022-08-06 18:12:11 +03:00
Ivan Pozdeev 37a6070855 2.3.3 2022-08-02 23:59:30 +03:00
Edgar R. M 1ae5596bfa
Add CPython 3.10.6 (#2428) 2022-08-02 23:51:31 +03:00
Michael Šimáček ff9d3ca69e
Add GraalPython 22.2.0 (#2425) 2022-07-28 00:08:14 +03:00
Edgar R. M d98d3f5055
Add CPython 3.11.0b5 (#2420) 2022-07-26 22:04:26 +03:00
brogon f5cbba0636
Allow pypy2 pypy3 patching (#2421)
* Fix: patterns for pypy2.*/pypy3.* versions

* Shrink pypy patterns

* Fix extglob pattern

* Fix: no regex-charclasses like '[:digit:]' in 'extglob', needs also double-activation for parse/runtime stage

Co-authored-by: native-api <vano@mail.mipt.ru>
Co-authored-by: Bjoern Schneider <bjoern.schneider@scribos.com>
2022-07-26 22:03:26 +03:00
brogon 16f7ea03e8
Fix: patterns for pypy2.*/pypy3.* versions (#2419)
Co-authored-by: native-api <vano@mail.mipt.ru>
2022-07-25 23:55:11 +03:00
James Stronz 22fa683571
CVE-2022-35861: Fixed relative path traversal due to using version string in path (#2412) 2022-07-17 01:01:04 +03:00
Tim Gates 0eba0a5bd5
docs: fix simple typo (#2414)
Signed-off-by: Tim Gates <tim.gates@iress.com>
2022-07-15 16:55:30 +03:00
Sorin Sbarnea 0990e7843d
python-build: Replace deprecated git protocol in the README (#2413) 2022-07-14 16:29:59 +03:00
Tahir H. Butt aee9c82c29
Add CPython 3.11.0b4 (#2411) 2022-07-12 00:05:34 +03:00
Pedro Fonini fdaeaf1f97
Use version sort in pyenv versions if available (#2405) 2022-07-10 23:00:51 +03:00
Ivan Pozdeev 207f33fc5e Fix line endings in 3.7.13 patches 2022-07-02 22:05:34 +03:00
Ivan Pozdeev 304515f2cd 2.3.2 2022-06-30 16:04:22 +03:00
Ivan Pozdeev 572a8bcfba Merge branch 'master' of https://github.com/pyenv/pyenv 2022-06-13 18:22:36 +03:00
Ivan Pozdeev 100871b48a Remove no-longer-needed commented line 2022-06-13 18:22:21 +03:00
Xiangyu Xu 9f2cba3da8
Update anaconda3-2022.05 MacOSX arm64 md5 (#2391) 2022-06-11 01:28:58 +03:00
Ivan Pozdeev 6620e0e2c5 CONTRIBUTING: softened working about EOL fixes 2022-06-11 01:24:51 +03:00
native-api d59e7dff5e
Update README.md 2022-06-11 01:14:46 +03:00
Ivan Pozdeev 22532c305e Merge branch 'master' of https://github.com/pyenv/pyenv 2022-06-11 01:10:54 +03:00
Ivan Pozdeev e48883b940 README: document cases of extended support 2022-06-11 01:10:44 +03:00
dand-oss 7457df4190
Add pyston-2.3.4 (#2390)
Co-authored-by: Dan Dees <dand@appsmiths.com>
2022-06-10 10:11:44 +03:00
Ivan Pozdeev c4fd08e6fb README: Link to CONTRIBUTING and Python-Build's envvars 2022-06-09 02:52:50 +03:00
Ivan Pozdeev 97039ca1af Fix accidental typo 2022-06-08 23:23:01 +03:00
native-api c3404568e8
Merge pull request #2385 from native-api/condas
Add Anaconda 2019.10, 2021.04, 2022.05; support Anaconda in add_miniconda.py
2022-06-08 22:40:50 +03:00
Ivan Pozdeev 42cace010b CI: workaround MacOS jobs hanging for some Anaconda releases
Shims from executables bundled with some older Anaconda releases
cause MacOS script check jobs to hang at the end
2022-06-08 22:19:34 +03:00
Ivan Pozdeev e9f95065ad Add Anaconda 2019.10, 2021.04, 2022.05 2022-06-08 18:37:36 +03:00
Ivan Pozdeev 64aacd5cfd add_miniconda: support Anaconda, support non-CPython scripts in scripts check 2022-06-08 18:32:42 +03:00
Illia Volochii 9b91641094
Add CPython 3.10.5 (#2386) 2022-06-06 21:52:20 +03:00
native-api bc13a87bee
Add flags for Homebrew into python-config --ldflags (#2384) 2022-06-05 22:35:56 +03:00
Edgar R. M c055ba718b
Add CPython 3.11.0b3 (#2382) 2022-06-01 19:45:35 +03:00
Alex Hedges 4456e64c89
Add post-install checks for curses, ctypes, lzma, and tkinter (#2353)
Tkinter check is conditional on DISPLAY

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2022-05-31 21:37:44 +03:00
yggdr cd5522965b
Pass through CFLAGS_EXTRA for Micropython (#2007)
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2022-05-31 19:47:06 +03:00
Saaket Prakash 845e08eb2f
Add CPython 3.11.0b2 (#2380) 2022-05-31 18:50:52 +03:00
Ivan Pozdeev 8ff6507f80 2.3.1 2022-05-29 19:50:13 +03:00
tuzi3040 0930533d92
CI: Add tests for modified python build scripts (#2286)
Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2022-05-23 03:36:39 +03:00
Ivan Pozdeev 477fd42d68 Merge branch 'master' of https://github.com/pyenv/pyenv 2022-05-22 15:59:23 +03:00
Ivan Pozdeev e16b7adf94 Migrate from probot/no-response to lee-dohm/no-response
probot/no-response has been retired and no longer runs
2022-05-22 15:58:48 +03:00
native-api e676fde990
Fix endless loop in pyenv init - under SSH in some shell setups (#2374) 2022-05-18 16:15:05 +03:00
native-api 8608d60fed
Merge pull request #2371 from aphedges/update-miniconda-4.12.0
Add miniconda 4.12.0
2022-05-18 00:42:29 +03:00
Mathieu Kniewallner ef110c1c4f
Add CPython 3.9.13 (#2372) 2022-05-18 00:35:26 +03:00
Alex Hedges d200c6afa9 Add miniconda 4.12.0 2022-05-17 15:59:25 -04:00
Alex Hedges 25e0ffa67d Add missing miniconda architectures: aarch64, arm64, s390x 2022-05-17 15:59:11 -04:00
Hugo van Kemenade 70b23638f4
Update 3.11-dev and add 3.12-dev (#2361) 2022-05-10 12:01:58 +03:00
Edgar Ramírez df5ecfc72d
Add CPython 3.11.0b1 (#2358) 2022-05-09 06:07:44 +03:00
SADIK KUZU 169321b3e6
README.md, CHANGELOG.md, libexec/pyenv-help: Fix typos 2022-05-08 09:46:47 +03:00
SADIK KUZU 86598fcf4e
README.md: Fix typo 2022-05-08 01:16:03 +03:00
Ville Skyttä c3fd96c429
Version file read improvements (#2269)
* Don't bother reading empty version files
* Implement version file read in pure bash
Is faster with usual sized version files, slower with degenerate cases.
2022-05-06 19:51:51 +03:00
Ivan Pozdeev 867f34b596 README.md: Fix typos, improve phrasing 2022-05-04 04:28:35 +03:00
Ivan Pozdeev cca008ba04 Merge branch 'master' of https://github.com/pyenv/pyenv 2022-05-04 03:32:53 +03:00
Ivan Pozdeev 2fd7be0453 2.3.0 2022-05-04 03:30:52 +03:00
Hay Kranen cdccbd0ba3
Add :latest syntax to documentation for the install command (#2351) 2022-05-04 03:20:16 +03:00
native-api 51c026bf56
Merge pull request #2349 from native-api/no_linuxbrew
Don't use Homebrew outside of MacOS
2022-05-04 03:19:27 +03:00
Ivan Pozdeev 5d967fa38a Merge branch 'master' into no_linuxbrew 2022-05-04 03:10:08 +03:00
Ivan Pozdeev f03adae58a Rename CI workflows to what they actually do 2022-05-04 03:08:46 +03:00
Ivan Pozdeev 65316a7e99 Don't use Homebrew outside of MacOS
In Linux, it's not the primary source of packages and
cannot be used without build flag adjustments
thus has caused build failures.
2022-05-04 03:04:45 +03:00
Ivan Pozdeev e928e75f22 Fix a duplicate error message on stub plan overrun 2022-05-04 02:58:47 +03:00
native-api de1f8a7a1d
Merge pull request #2310 from native-api/simplify_setup
Simplify init scheme
2022-05-02 19:17:31 +03:00
Ivan Pozdeev 7256feeaa8 Remove EOL versions from CI 2022-05-02 19:08:49 +03:00
Ivan Pozdeev 6d4365a696 Make pyenv init --path usable as a pyenv init - substitute
We're going to eliminate the need to mandatorily use `pyenv init --path`.
We can't delete it yet for backward compatibility.
Besides, there's one other use case for it: to enable shims but without
shell integration, e.g. for noninteractive shells.

To be a full-fledged replacement for `pyenv init -` however,
it needs to do rehashing.
2022-05-02 19:07:24 +03:00
Ivan Pozdeev 8439f8e187 Simplify init scheme; update & clarify the README
Now the setup is to add to both rc and profile:
1) set PYENV_ROOT
   (can do it unconditionally -- since if you change it,
   you need to update all places anyway since any of them can be run first)
2) Add `pyenv` to PATH if not already there
3) eval "$(pyenv init -)"

Not a breaking change, old setup will continue to work.
2022-05-02 19:07:24 +03:00
Ivan Pozdeev 32a86a84c0 Show output for assert_line() and refure_line()
Required for diagnostics
2022-05-02 04:46:00 +03:00
native-api d5b12f826d
Make PYENV_DEBUG imply -v for pyenv install (#2347)
Trace logs without `-v` are usually useless due to missing the build part.
So this leaves one less thing for users to worry about
when submitting error reports.

Mentioning `-v` in the issue template should stay for some time
since users report on old versions, too.
2022-05-01 05:49:09 +03:00
Michael Šimáček b6b761f9f1
Add GraalPython 22.1.0 (#2346) 2022-04-29 20:30:31 +03:00
native-api e8f952a5d8
Support XCode 13.3 (Apple Cang 13.1.6) in all releases that officially support MacOS 11 (#2344)
There are no new (glaring) platform incompatibilities in MacOS 12 so those releases should technically run in it as well
2022-04-29 08:54:22 +03:00
Sam Gross 864cd79980
Add "nogil" Python v3.9.10 (#2342) 2022-04-29 05:49:43 +03:00
Illia Volochii 6d20b3b123
Add CPython 3.11.0a7 (#2315) 2022-04-19 18:01:22 +03:00
Ville Skyttä fe4eccf3e7
Add Pyston 2.3.3 (#2316) 2022-04-19 18:01:07 +03:00
dand-oss f0f2cdd1c6
Add PyPy 7.3.9 (#2308)
Co-authored-by: Dan Dees <dand@appsmiths.com>
2022-04-01 15:26:38 +03:00
native-api 58427b9a5c
Add CONTRIBUTING.md (#2287) 2022-03-31 05:28:28 +03:00
native-api 72757562c1
Remove bountysource since it has gone rogue
I've never been able to activate (or refund) existing bounties on solved problems. Their support has been unhelpful. So I've given up on them.
2022-03-24 20:00:29 +03:00
Sam Doran fb97a9c2bd
Support MacOS with CLang 3+ for CPython 3.7.12 (#2292) 2022-03-24 16:36:48 +03:00
Netanel Shine 48b545345e
Support MacOS with CLang 3+ for CPython 3.6.15 (#2288) 2022-03-24 16:35:57 +03:00
Saaket Prakash 45bb60dc39
Add CPython 3.10.4 (#2295) 2022-03-24 16:10:10 +03:00
Saaket Prakash c0fef470cb
Add CPython 3.9.12 (#2296) 2022-03-24 16:09:17 +03:00
Ed Rogers 986fe1a749
Prevent GitHub autolinking to an issue (#2282) 2022-03-18 07:52:26 +03:00
Ivan Pozdeev bfe54c9459 declare -ar causes "readonly variable" error in Bash 3.2
Fixes https://github.com/pyenv/pyenv/issues/2278
2022-03-18 07:39:44 +03:00
Ivan Pozdeev a43631d7c0 Copy patches 3.7.12->3.7.13
All the patches still apply
2022-03-17 14:48:33 +03:00
tuzi3040 a157725dbe
Bump openssl 1.1 to 1.1.1n for CPython 3.7.13 3.8.13 3.9.11 3.10+ (#2276) 2022-03-17 00:47:09 +03:00
Josh Friend 3a95c969e1
v2.2.5 Add new CPython versions 2022-03-16 16:58:43 -04:00
dand-oss 0d949796ce
Add PyPy 7.3.8 (#2253)
Co-authored-by: Dan Dees <dand@appsmiths.com>
2022-03-09 21:13:38 +03:00
Ville Skyttä ee6ef20859
docs(pyenv-prefix): note support for multiple versions (#2270) 2022-03-09 05:33:01 +03:00
Alex Hedges 7bc426e2be
Add miniconda3-3.7-4.11.0, miniconda3-3.8-4.11.0, miniconda3-3.9-4.11.0 (#2268) 2022-03-08 17:37:39 +03:00
Saaket Prakash 3b0ee099a8
Add CPython 3.11.0a6 (#2266) 2022-03-07 21:23:04 +03:00
Ivan Pozdeev 44db3b03d0 Merge branch 'master' of https://github.com/pyenv/pyenv 2022-03-01 09:25:30 +03:00
Ivan Pozdeev 49d955d584 Fix typo in looked-for argument name 2022-03-01 09:25:20 +03:00
Saaket Prakash 1e79a5222b
Add CPython 3.11.0a5 (#2241) 2022-02-04 03:04:53 +03:00
David Lawson d29feab2c8
Add pyston-2.3.2 (#2240) 2022-02-03 16:07:56 +03:00
Pedro Fonini a98fee0555
python-build: add URL for get-pip for Python 3.6 (#2238) 2022-02-03 03:20:52 +03:00
Pedro Fonini 7ea0408966
Fix UnicodeDecodeError for CPython 3.6.15 and 3.7.12 (#2237) 2022-02-02 15:56:12 +03:00
Anton Petrov 42e6409f6c
Update CHANGELOG.md 2022-01-27 18:51:13 +03:00
Anton Petrov 6f7a29c3f4
Update pyenv---version 2022-01-27 18:46:17 +03:00
Michael Šimáček 8aa8d84e09
Add GraalPython 22.0.0 (#2226) 2022-01-26 12:12:55 +03:00
Verdi March 39f1b141ef
miniconda3-latest: added Linux-aarch64 (#2221) 2022-01-17 19:44:59 +03:00
Ned Batchelder a55dd92436
CPython 3.9.10 and 3.10.2 (#2219) 2022-01-15 16:27:08 +03:00
Ned Batchelder 9f5aa953b4
CPython 3.11.0a4 (#2217) 2022-01-15 10:51:28 +03:00
native-api 971397dd4e
Revert "Disable coreutils on M1 Apple Silicon with arm64 (#2020)" (#2212)
This reverts commit 90d0d20508.

After further consideration, we've decided to remove this workaround:
* It only has an effect if the user has added `gnubin` from Homebrew Coreutils to PATH which is an unsupported setup
* It was intended to be applied only to a few select 3.8 and 3.9 versions that officially support Apple Silicon and only fail with Homebrew Coreutils in PATH because they have `config.*` from a too old version of Autoconf that doesn't support the Arm64 arch -- but
  * CPython devs [didn't actually fix the problem in 3.10, either, only in 3.11](https://github.com/pyenv/pyenv/pull/2157#issuecomment-968055387), so we'd need to apply it to all 3.10 releases, too
  * users started pushing this workaround into other unrelated branches because they were using the above unsupported setup. See https://github.com/pyenv/pyenv/pull/2190#pullrequestreview-835221952 for discussion.
2022-01-08 13:56:56 +03:00
Christian Hammond 867909c933
Fix a regression in include paths when compiling ctypes in 3.6.15/3.7.12. (#2209)
In my previous work on getting Python 3.6.15 and 3.7.12 to compile on
Apple M1, I backported logic from newer 3.8.x releases to properly find
libffi and related files on macOS.

This regressed compilation on Linux. The include search path was
incomplete, and `ffi.h` could not be found, resulting in `ctypes` being
disabled.

There was a key difference between the old logic and new logic that led
to this regression:

1. In 3.8 and newer, `detect_ctypes()` in `setup.py` took no arguments,
   and was expected to access instance variables for the include search
   path.
2. In 3.7 and earlier, `detect_ctypes()` took the path as an argument,
   and was expected to make use of it.

The backport made use of the instance variables, overriding the provided
include path. These were not equivalent. The one on the instance was not
complete, lacking the necessary directories to find `ffi.h`. Since this
could not be found, `ctypes` support was disabled.

The fix is to simply not overwrite the variables passed to the function,
and resume using them as before.

Fixes #2207
2022-01-07 05:14:22 +03:00
Joseph Strach 162fea40f7
Fix incorrect pypy 2.7-7.3.6 sha256 hashes (#2208) 2022-01-05 23:46:06 +03:00
Fluency 423de9ae8d
add-miniconda: add docstrings to several key functions (#2197) 2021-12-23 21:01:28 +03:00
Anton Petrov 40d35f84b4
Update CHANGELOG.md 2021-12-22 09:48:46 +03:00
Anton Petrov 8675031879
Update pyenv---version 2021-12-22 09:48:21 +03:00
Yudai Hayashi 381002dbe2
Add pypy2.7-7.3.2~7.3.6 (#2194) 2021-12-20 13:51:28 +03:00
Christian Hammond 2d9e981d60
Fix Python 3.7.12 compilation on macOS arm64/M1. (#2190)
This change ports pyenv and Python patches to 3.7.12 to enable the
`ctypes `and `decimal` modules to compile.

While Python 3.7.12 itself compiles on arm64/M1, both of these modules
fail to compile, due to missing support for locating system libffi and
due to architecture gate-keeping. These issues have been fixed in newer
releases of Python, and in other pyenv patch bundles.

The following patches are provided:

1. `0001-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch` -
   Fixes system `ffi.h`/`libffi` path determination and usage and
   enables calling of variadic functions, fixing ctypes support
   (consolidated port of existing pyenv patches for 2.7.18 that iterate
   on this logic).

2. `0002-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch` -
   Adds arm64 to the list of allowable architectures for the
   `decimal` module (port of Python patch introduced in 3.8.10).
2021-12-20 07:14:14 +03:00
Christian Hammond 152457a428
Fix Python 3.6.15 compilation on macOS arm64/M1. (#2189)
This change ports several established patches to the Python 3.6.15
build, enabling compilation on arm64/Apple M1 architectures:

1. `0001-Detect-arm64-in-configure.patch` -
   Updates configure to detect arm64 architectures (port of an existing
   pyenv patch for 2.7.18).

2. `0002-bpo-36231-Support-building-on-macOS-without-usr-incl.patch` -
   Adds macOS SDK root computation logic for determining include paths
   (port of existing Python patches introduced in 2.7.17 and 3.7.4).

3. `0003-Fix-macOS-_tkinter-use-of-Tck-Tk-in-Library-Framewor.patch` -
   Fixes Tcl/Tk support on macOS (port of an existing pyenv patch
   for 2.7.18).

4. `0004-Port-ctypes-and-system-libffi-patches-for-arm64-macO.patch` -
   Fixes system `ffi.h`/`libffi` path determination and usage and
   enables calling of variadic functions, fixing ctypes support
   (consolidated port of existing pyenv patches for 2.7.18 that iterate
   on this logic).

5. `0005-BPO-41100-Support-macOS-11-when-building-GH-21113.patch` -
   Updates Darwin version checks to handle macOS 11's major version
   bump (port of Python patches introduced in 3.7.0 and 3.9.0).

6. `0006-bpo-41100-fix-_decimal-for-arm64-Mac-OS-GH-21228.patch` -
   Adds arm64 to the list of allowable architectures for the
   `decimal` module (port of Python patch introduced in 3.8.10).
2021-12-20 07:09:38 +03:00
SouthWolf 86ca164a11
Add Anaconda3-2021.11 (#2193)
* Use verify_py39 since anaconda3-2021.11 is using python-3.9 according to release notes
2021-12-19 18:43:01 +03:00
Ned Batchelder 943c5f995d
Add CPython 3.11.0a3 (#2187) 2021-12-09 21:41:09 +03:00
John Miller c80b1cdfb9
Fix errant "echo" in build env install instructions (#2185) 2021-12-08 07:12:53 +03:00
Juan Luis Cano Rodríguez 15677f7f5a
Add Miniforge and Mambaforge 4.10.3-10 (#2184) 2021-12-07 21:39:30 +03:00
Ricardo Madriz 631bf6a23a
Add CPython 3.10.1 (#2183) 2021-12-07 08:50:30 -05:00
native-api 2862858052
Merge pull request #2182 from J-M0/fix_3.6.15
Fix 3.6.15 build on macOS
2021-12-06 20:01:42 +03:00
James Morris a7e09ce2ea Update macOS test dependencies 2021-12-05 19:23:21 -05:00
James Morris 4d56947277 Fix Python 3.6.15 build 2021-12-03 16:50:13 -05:00
James Morris 07b7471819 Add macOS tests 2021-12-03 16:48:22 -05:00
James Morris 3d4fc164a2 Update Python 3.6 in Ubuntu tests 2021-12-03 16:47:42 -05:00
Ivan Pozdeev f2925393e4 update ISSUE_TEMPLATE.md 2021-11-23 20:22:59 +03:00
Anton Petrov a681e756e1
Update CHANGELOG.md 2021-11-22 22:35:16 +03:00
Anton Petrov dc3a201301
Update pyenv---version 2021-11-22 22:33:10 +03:00
Xiangyu Xu 7706a45080
Add macOS Apple M1 to Miniconda-latest (#2164)
[source](https://www.anaconda.com/blog/anaconda-individual-edition-2021-11#:~:text=Update%20on%20macOS%20Apple%20M1%20Support)
2021-11-20 23:58:42 +03:00
Josh Friend 23dfe75b73
v2.2.1 2021-11-20 09:04:59 -05:00
Illia Volochii df7ccfe0e8
Add CPython 3.9.9 (#2162) 2021-11-16 19:17:00 +03:00
native-api e342d84715
Merge pull request #2158 from scop/micropythons 2021-11-14 00:05:58 +03:00
Ville Skyttä e54cd5f49d Add micropython 1.17 2021-11-13 22:56:51 +02:00
Ville Skyttä 80ec306155 Add micropython 1.16 2021-11-13 22:56:42 +02:00
Ville Skyttä a9e11ba164
Use command and type instead of which (#2144)
`which` has been deprecated in Debian's debianutils 5.0+
They suggest using `type` and `command` as replacements:
3a8dd10b45 ,
610a65c6ef
2021-11-11 21:08:12 +03:00
native-api 5b7c140f5b
Dummy for https://github.com/pyenv/pyenv/issues/106 (#2156)
The issue has been resolved in ed38af6409
but the bounty didn't trigger -- allegedly 'cuz it's not a PR.

Bountysource support replied "we're looking" but never did anything
so I'm going to try to trigger it via a dummy PR.
2021-11-09 20:48:12 +03:00
Ivan Pozdeev aebed1c0a4 Merge branch 'master' of https://github.com/pyenv/pyenv 2021-11-09 20:19:35 +03:00
Ivan Pozdeev 4adc45ef8a Dummy for https://github.com/pyenv/pyenv/issues/106 2021-11-09 20:19:16 +03:00
native-api d79bda4602
Patch 3.10.0 configure (#2155)
* Fix "PKG_PROG_PKG_CONFIG: command not found"

Apply f146ca36f8
* bpo-45350: Rerun autoreconf with the pkg-config macros (GH-28707)
2021-11-09 19:06:42 +03:00
Oğuzhan Çelikarslan 552d943762
Fix typos in command examples (#2147) 2021-11-09 09:50:29 +03:00
Parnassius 663abeb5fa
Add CPython 3.9.8 (#2152) 2021-11-07 17:43:58 +03:00
Ned Batchelder 748261869a
CPython 3.11.0a2 (#2150) 2021-11-06 14:21:35 +03:00
native-api 54889eb87a
Make gist generation instructions more explicit; add Zsh PS4 2021-10-31 05:14:03 +03:00
sandipanpanda cfe2aba670
Add definition of pyenv help in COMMANDS.md (#2139) 2021-10-30 22:11:42 +03:00
Ivan Pozdeev 009fea2b20 Merge branch 'master' of https://github.com/pyenv/pyenv 2021-10-29 12:20:30 +03:00
Ivan Pozdeev 6e214570d1 Use OpenSSL 1 for 2.7.18 2021-10-29 12:20:20 +03:00
native-api abfa1c6d92
Explicitly state to enable verbose mode 2021-10-29 01:21:23 +03:00
Anton Petrov 066c05336f
Update pyenv---version 2021-10-27 11:15:57 +03:00
Anton Petrov 1fa027af1e
Update CHANGELOG.md 2021-10-27 11:15:29 +03:00
Ivan Pozdeev a0cc289d15 Added a wiki page on how to setup shell as a login shell in MacOS 2021-10-27 00:27:14 +03:00
Danny Hermes 4bbf7d7bb0
Adding PyPy release 7.3.7 (Python 3.7 and 3.8). (#2132) 2021-10-26 05:09:48 +03:00
native-api 4b82f575c7
Append Homebrew custom prefix to search path (#1957)
This is needed to find other Python deps (e.g. libintl) in Homebrew if it has
nonstandard prefix (e.g. in Apple M1)

* Re-allow to search Homebrew for zlib everywhere
2021-10-26 04:36:01 +03:00
amd-9 c0d8b9cfe8
Add documentation for init command (#2125) 2021-10-25 15:30:50 +03:00
native-api 0388da7d0b
Add setup instructions for the case when one installs Pyenv as part of a batch job (#2127) 2021-10-25 01:08:57 +03:00
amd-9 13efdea9ab
Add documentation for completions command (#2126) 2021-10-24 23:33:32 +03:00
native-api 8db91d5516
Default --with-universal-archs to universal2 on Apple Silicon (#2122)
Don't override a user-supplied value
2021-10-23 22:01:57 +03:00
Khushl Vora a015760854
Update README.md (#2120)
Minor changes to make the docs better.
2021-10-23 17:33:18 +03:00
Michael Šimáček d4f45b0096
Add GraalPython 21.3.0 (#2117) 2021-10-21 18:04:03 +03:00
native-api 444088b1db
Merge pull request #2111 from dand-oss/pypy3.8-7.3.6
Pypy ver 7.3.6 - python 3.7 and python 3.8
2021-10-19 17:20:46 +03:00
Dan Dees 09877f45cb pypy3.8-7.3.6 2021-10-19 09:36:29 -04:00
Dan Dees f864294e0e pypy3.7-7.3.6 2021-10-19 09:36:29 -04:00
native-api 5963dc4f61
Discover Tcl/Tk reliably and use active version (#2106)
Link to the active version like other Homebrew deps --
this won't break when another binary-compatible version is installed.
Use a discovery method that doesn't break when other versions are present alongside.
2021-10-16 14:51:39 +03:00
native-api 0915c5b7b6
Update README.md 2021-10-16 01:57:05 +03:00
native-api ed38af6409
Add Homerew alias to fix brew doctor's warning
Closes #106
2021-10-15 22:15:25 +03:00
native-api 208be7d6af
Update ISSUE_TEMPLATE.md 2021-10-14 12:13:46 +03:00
Marcin Konowalczyk 07aa659dbb
fish installation instructions (#2104) 2021-10-12 14:09:15 +03:00
native-api 88c3404997
Update ISSUE_TEMPLATE.md 2021-10-08 11:56:08 +03:00
native-api 3a35f43eb4
Update FUNDING.yml 2021-10-08 11:47:01 +03:00
Ivan Pozdeev 9a42b48da4 Merge branch 'master' of https://github.com/pyenv/pyenv 2021-10-07 02:37:36 +03:00
Ivan Pozdeev f5cc25ed14 Fix "`build_package_pyston2.2': not a valid identifier" 2021-10-07 02:37:04 +03:00
Anton Petrov e0e3244015
Merge pull request #2099 from nedbat/master
Add CPython 3.11.0a1
2021-10-06 14:48:38 +03:00
Ned Batchelder 9c72c27d76 Add CPython 3.11.0a1 2021-10-06 07:25:55 -04:00
Anton Petrov 483d95d6d2
Remove travis build status 2021-10-05 17:49:38 +03:00
Anton Petrov 05ca057bb2
Update pyenv---version 2021-10-05 17:32:37 +03:00
Anton Petrov 108a10a198
Update CHANGELOG.md 2021-10-05 17:32:15 +03:00
Anton Petrov 979e6f0a61
Merge pull request #2096 from ashwinvis/patch-1
Fix mambaforge-pypy3 build
2021-10-05 17:24:58 +03:00
Ashwin V. Mohanan 2a9c18372a
Update mambaforge-pypy3
Fix typo `ase` -> `case`
2021-10-05 15:28:13 +02:00
native-api 8315e1528b
Create FUNDING.yml 2021-10-05 12:27:48 +03:00
Anton Petrov c81a28105f
Merge pull request #2093 from Parnassius/py310
Add Python 3.10.0
2021-10-04 22:28:30 +03:00
Parnassius d601efa0d5 Add Python 3.10.0 2021-10-04 21:16:19 +02:00
sandipanpanda 0688b17cc1
Add documentation for exec command (#2090) 2021-10-02 23:15:18 +03:00
sandipanpanda bb6a747c02
Add documentation for shims command (#2091) 2021-10-02 23:10:37 +03:00
sandipanpanda 681d31bc36
Add documentation for hooks command (#2089) 2021-10-02 20:00:24 +03:00
sandipanpanda 3b1bc86031
Add documentation for root command (#2088)
* Add documentation for root command
2021-10-02 19:58:56 +03:00
sandipanpanda 6139b51af4
Add documentaion for prefix command (#2087) 2021-10-02 19:54:12 +03:00
Ivan Pozdeev 10a8c83888 Merge branch 'master' of https://github.com/pyenv/pyenv 2021-10-01 02:30:41 +03:00
Ivan Pozdeev 9985f7b436 Honor CONFIGURE_OPTS as well as PYTHON_CONFIGURE_OPTS when detecting options 2021-10-01 02:30:28 +03:00
Kevin Modzelewski a7895e6ea8
Update to Pyston's v2 package of the 2.3.1 release (#2078)
This one gets rid of the extra "usr" subdirectory that we had and now fits the format that pyenv expects
2021-09-28 21:12:46 +03:00
Anton Petrov 7dd48d1665
Merge pull request #2075 from kmod/pyston_2.3.1
Add pyston-2.3.1 support
2021-09-27 21:45:33 +03:00
Kevin Modzelewski 11c54713bb This looks unnecessary now 2021-09-24 17:23:35 -04:00
Kevin Modzelewski 3051d21004 Add pyston-2.3.1 support
We changed the directory structure for pyston 2.3.1 slightly, where we now
include a top-level "pyston-2.3.1" directory when you unpack the tarball.
2021-09-24 15:10:50 -04:00
Anton Petrov 9ecfdd1073
Merge pull request #2074 from anton-petrov/master
Don't update conda when installing pip
2021-09-23 12:47:50 +03:00
Anton Petrov 47d3dee0bb
Fix 2021-09-23 12:26:46 +03:00
Anton Petrov 0a3b72d890
Don't update conda when installing pip 2021-09-23 12:00:09 +03:00
native-api f018056165
Merge pull request #2072 from aphedges/improve-add_miniconda 2021-09-21 08:07:42 +03:00
Alex Hedges af55330d37 Add miniconda2-2.7-4.8.3, miniconda3-3.7-4.10.3, miniconda3-3.8-4.10.3, miniconda3-3.9-4.10.3 2021-09-21 08:06:57 +03:00
native-api 0211c345f7
Merge pull request #2073 from native-api/github_actions_tests
GitHub actions tests
2021-09-21 07:55:28 +03:00
Ivan Pozdeev 2f8c625a7d Fix test failures 2021-09-21 07:44:03 +03:00
Ivan Pozdeev e28661c7e2 Fix random "broken pipe" 2021-09-21 07:43:58 +03:00
Ivan Pozdeev 6882be06a6 Bats: report unstub failure details 2021-09-21 07:43:58 +03:00
Ivan Pozdeev c6c4e41eb9 Bats: show output on failed assertions 2021-09-21 05:07:17 +03:00
Ivan Pozdeev f504b01818 consistent message 2021-09-21 05:07:12 +03:00
Ivan Pozdeev 876be1bb04 Bats: path_without: support multiple args 2021-09-21 05:07:12 +03:00
Ivan Pozdeev 6185bb55e6 allow for sys.executable to be different 2021-09-21 05:07:06 +03:00
Ivan Pozdeev 7f714c34ba Bats 1.2 requires readline from gnu coreutils in MacOS 2021-09-21 05:07:06 +03:00
Ivan Pozdeev 848e56e992 Add Pyenv tests to Github Actions
Now that Travis check has been removed from the repo
2021-09-21 05:07:06 +03:00
Alex Hedges 8b07b92c37 Support newer miniconda filenames 2021-09-20 19:47:26 -04:00
Alex Hedges 3a20ce7555 Add default verbosity to add_miniconda.py
Required to prevent a crash when no verbosity given.
2021-09-20 19:30:45 -04:00
rallyemax 0c6ad7c52b
Fix sed commands (#2071)
In GNU `sed`, the `-iEe` argument is equivalent to `--in-place=Ee`, which would create `~/.profileEe` as backup of `~/.profile` if the command executed successfully. However, because the `e` is no longer being processed as an expression argument, `sed` does not correctly join the expressions and exits with `sed: -e expression #2, char 10: unexpected }`.

The intent is to use extended regex, perform the changes in-place, and use a series of expressions, so `-Ei -e` is used instead.
2021-09-21 00:30:11 +03:00
Takumi Sueda 1bd397112a
Add Python 2.7.18 patches for Apple Silicon machines (#2061) 2021-09-20 22:10:58 +03:00
Anton Petrov dcfd715603
Update pyenv---version 2021-09-20 20:08:06 +03:00
Anton Petrov 474d7cc066
Update CHANGELOG.md 2021-09-20 20:07:51 +03:00
Anton Petrov 02c44942c6
Merge pull request #2067 from native-api/readme
Update setup instructions in the Readme
2021-09-20 07:33:50 +03:00
Ivan Pozdeev 76db37dbfa Update fish instructions based on user feedback 2021-09-19 01:08:26 +03:00
Ivan Pozdeev eb89256f59 Remove the sample code from pyenv init
since there proved to be to many cases to fit
2021-09-19 00:27:03 +03:00
Ivan Pozdeev 19f74e41f0 Update setup instructions based on user feedback 2021-09-19 00:26:48 +03:00
Ivan Pozdeev 6c74b616a5 Windows note as a separate section 2021-09-19 00:26:30 +03:00
Ivan Pozdeev 8cce6e8dd2 Add notes when to use the 2nd shell step 2021-09-19 00:26:07 +03:00
Ivan Pozdeev 03cabd88e9 Highlight MacOS note about restart 2021-09-19 00:26:07 +03:00
tillhainbach e56962b357
allow tcl-tk as argument or try with homebrew by default Replacement for #1409 (#1646)
* feat(python-build): allow tcl-tk as argument or default to homebrew
* refactor(python-build): detect tcl-tk-libs from confugre_opts_arr
2021-09-17 14:56:53 +03:00
Ivan Pozdeev cabdc45181 fix possible side effect 2021-09-17 03:52:52 +03:00
Ivan Pozdeev 7f45f1eb9d Merge branch 'sbin'
# Conflicts:
#	test/prefix.bats
2021-09-15 20:45:27 +03:00
Ivan Pozdeev acc949c27b fix test 2021-09-15 20:42:41 +03:00
native-api 4f689cdf83
Allow system Python in sbin (#2065)
Arch Linux has Python is sbin as well as bin
2021-09-15 20:00:49 +03:00
Ivan Pozdeev 26134d9b38 Allow system Python in sbin
Arch Linux has Python is sbin as well as bin
2021-09-15 19:07:00 +03:00
Pamela McA'Nulty 1c90a0f864
Prevent duplicate PATH entries when bin_path/.. is the same as PYENV_ROOT (#2045) 2021-09-15 01:09:50 +03:00
Toshihiro Takushima 90d0d20508
Disable coreutils on M1 Apple Silicon with arm64 (#2020)
* Disable coreutils on arm64-apple
* Only selectively apply to the affected CPython versions

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2021-09-09 15:53:00 +03:00
Ned Batchelder 58e2087967
Add Python 3.10.0rc2 (#2053) 2021-09-08 17:28:25 +03:00
Seonghyeon Cho a65af6570d
Add space after yes/no prompt (#2040) 2021-09-07 23:35:53 +03:00
Ricardo N Feliciano 70d7749584
Add CPython v3.6.15 and v3.7.12 (#2052) 2021-09-07 23:07:40 +03:00
Víctor Molina García 9df4524c79
Add missing Python 2.6.x definitions and patches (#2051) 2021-09-06 22:37:38 +03:00
Víctor Molina García f7450587dc
Fix build of ossaudiodev in Linux/FreeBSD for Python 2.6 (#2049)
This is essentially the same fix as in pull request #2047, but it
is applied from Python 2.6.6 to 2.6.9, and for `ossaudiodev` as well
as the (deprecated) `linuxaudiodev`.
2021-09-05 21:54:57 +03:00
Víctor Molina García 22e1aa6e9d
Fix build of ossaudiodev in Linux/FreeBSD for Python 3.1 (#2047)
With the normal `setup.py`, the installation of the `ossaudiodev`
module is skipped under GNU/Linux with newer kernel versions because
Python 3.1 appends the major kernel version to the result of
`build_ext.get_platform` and later `ossaudiodev` is skipped if the
major kernel version is not 2. A similar problem might occur if
installing in FreeBSD.

This problem may even occur if installing Python 3.1 in a Docker image
of an old OS (e.g. prehistoric Debian or CentOS), because the major
kernel version is still the one of the host system.

The solution is to use `str.startswith` and only check that the
platform starts with 'linux' or 'freebsd'.
2021-09-03 16:56:45 +03:00
Anton Petrov 2d64fb1cb9
Update pyenv---version 2021-08-31 08:44:12 +03:00
Anton Petrov a85875c39e
Update CHANGELOG.md 2021-08-31 08:43:56 +03:00
Anton Petrov 8db5778b12
Merge pull request #2044 from poad/master
Add CPython 3.9.7
2021-08-31 08:36:49 +03:00
Kenji Saito c7d8a1c33d Add CPython 3.9.7 2021-08-31 08:29:43 +09:00
Ricardo N Feliciano 44b7da194b
Add CPython v3.8.12 (#2043) 2021-08-30 23:39:24 +03:00
Anton Petrov b2eb2d28d1
Merge pull request #2037 from NyaMisty/master
[Fixed] Adapt conda.bash for bash associative array
2021-08-24 13:42:02 +03:00
Anton Petrov 8b60418361
Update CHANGELOG.md 2021-08-23 10:35:08 +03:00
Anton Petrov e9c8dfc197
Update pyenv---version 2021-08-23 10:34:26 +03:00
Sakuragawa Misty dfeda54079 fixes checking of associative array in conda.bash 2021-08-21 04:20:23 +08:00
Anton Petrov 4f8b15fecd
Merge pull request #2035 from pyenv/revert-2027-master
Revert "Adapt conda.bash for bash associative array"
2021-08-20 14:18:30 +03:00
Anton Petrov 07609cc579
Revert "Adapt conda.bash for bash associative array" 2021-08-20 09:58:18 +03:00
Anton Petrov 3738c2a282
Merge pull request #2027 from NyaMisty/master
Adapt conda.bash for bash associative array
2021-08-19 19:38:25 +03:00
Anton Petrov 9668be8850
Merge pull request #2032 from vatosarmat/master
Move man page to location where it can be automatically found by man
2021-08-19 13:29:12 +03:00
V S dc36c300e1 Move man page to location where in can be automatically found by manpage utility without manual MANPATH setting 2021-08-19 19:55:22 +10:00
Sakuragawa Misty 351ddb1095 Adapt conda.bash for bash associative array 2021-08-10 05:54:51 +08:00
native-api d209e0612b
Merge pull request #2025 from fredrikaverpil/fix-checksums
Update checksums for CPython 3.10.0rc1
Remove 3.10.0rc1
2021-08-04 23:23:24 +03:00
Fredrik Averpil 825ef64995 Remove CPython 3.10.0b4 2021-08-04 22:22:11 +02:00
Fredrik Averpil 65588f51d9 Update checksums for CPython 3.10.0rc1 2021-08-04 22:16:34 +02:00
Anton Petrov ab1a9d290c
Merge pull request #2022 from native-api/remove_3.9.3
Remove 3.9.3
2021-08-03 21:58:21 +03:00
Anton Petrov b40ef3c698
Merge pull request #2023 from fredrikaverpil/add-3100rc1
Add CPython 3.10.0rc1
2021-08-03 21:57:08 +03:00
Fredrik Averpil 1427f80828 Add test to CI 2021-08-03 20:10:53 +02:00
Fredrik Averpil 9db1193c2a Add CPython 3.10.0rc1 2021-08-03 20:07:38 +02:00
Ivan Pozdeev 1f906baae8 Remove 3.9.3
It has been recalled due to introducing an unexpected incompatibility:
https://www.python.org/downloads/release/python-393/
2021-08-03 06:52:44 +03:00
Anton Petrov cef86ce462
Update pyenv---version 2021-07-25 11:54:16 +03:00
Anton Petrov 52822a3d50
Update CHANGELOG.md 2021-07-25 11:53:58 +03:00
Anton Petrov afc8031544
Merge pull request #2019 from anton-petrov/master
Added scripts for rolling releases of Miniforge
2021-07-25 11:48:07 +03:00
Anton Petrov c435fde088
Rename mambaforge3-pypy3-latest to mambaforge-pypy3 2021-07-25 11:38:11 +03:00
Anton Petrov 3773dfb4f1
Update and rename miniforge3-pypy3 to miniforge-pypy3 2021-07-25 11:37:22 +03:00
Anton Petrov abe0056b5f
Update and rename mambaforge3-latest to mambaforge 2021-07-25 11:34:51 +03:00
Anton Petrov fd8854dea1
Rename miniforge3-latest to miniforge3 2021-07-25 11:34:05 +03:00
Anton Petrov 9b6377de23
Create mambaforge3-pypy3-latest 2021-07-25 11:30:59 +03:00
Anton Petrov 8c251a5e9b
Rename mambaforge3 to mambaforge3-latest 2021-07-25 11:27:21 +03:00
Anton Petrov a6d6ba8050
Rename miniforge3 to miniforge3-latest 2021-07-25 11:26:54 +03:00
Anton Petrov fc7560bcfd
Update and rename mambaforge3-latest to mambaforge3 2021-07-25 11:24:59 +03:00
Anton Petrov 56fd6c3c51
Update and rename miniforge3-latest to miniforge3 2021-07-25 11:24:31 +03:00
Anton Petrov db82c73391
Create miniforge3-pypy3 2021-07-25 11:23:28 +03:00
Anton Petrov d4d66b6183
Update miniforge3-latest 2021-07-25 11:12:58 +03:00
Anton Petrov 0c287ffcf7
Create mambaforge3-latest 2021-07-25 11:12:29 +03:00
Anton Petrov af59ef0088
Create miniforge3-latest 2021-07-25 11:09:54 +03:00
David Lawson ad8807543b
Update pyston-2.3 (#2017)
The original 2.3 portable version was compiled on Ubuntu 20.04 and didn't work with older glibc.

This has been fixed and the older file has been deleted so hopefully this change is acceptable.
2021-07-22 19:28:04 +03:00
Michael Šimáček aad74674cb
Add GraalPython 21.2.0 (#2018) 2021-07-22 19:26:11 +03:00
Anton Petrov f043f47c35
Merge pull request #2013 from nedbat/fix-3.10.0b4
fix: correct the reported version for 3.10.0b4
2021-07-20 08:14:12 +03:00
Ned Batchelder d769f22996 fix: correct the reported version for 3.10.0b4 2021-07-19 14:40:13 -04:00
Anton Petrov 56fe98bfed
Merge pull request #2012 from dmrlawson/pyston-2.3
Add Pyston 2.3
2021-07-18 20:55:42 +03:00
David Lawson 041903c640 Add Pyston 2.3 2021-07-18 18:21:01 +01:00
Anton Petrov 84a6535708
Merge pull request #2005 from nedbat/3.10.0b4
3.10.0b4
2021-07-12 07:51:57 +03:00
Ned Batchelder 93dd6f1163 Add 3.10.0b4 2021-07-11 14:02:39 -04:00
Anton Petrov 3a5a21ee05
Update pyenv---version 2021-07-03 10:10:58 +03:00
Anton Petrov ae29f86968
Update CHANGELOG.md 2021-07-03 10:10:42 +03:00
native-api f7754ae6a4
Remove PATH warning (#2001)
* In some cases (Ubuntu), `pyenv init -` has to be run before `pyenv init --path`.
* The warning has served its purpose by now.
2021-07-03 09:48:13 +03:00
Illia Volochii 673c73012d
Add Python 3.6.14, 3.7.11, 3.8.11, and 3.9.6 (#1996) 2021-06-29 13:45:48 +03:00
Anton Petrov 20df064204
Update pyenv---version 2021-06-27 11:25:53 +03:00
Anton Petrov 1cce1cadbd
Update CHANGELOG.md 2021-06-27 11:25:37 +03:00
Anton Petrov fc83d32317
Merge pull request #1992 from anton-petrov/master
Miniforge minor update to 4.10.1-5
2021-06-27 11:01:51 +03:00
Anton Petrov cb0402214e
Merge pull request #1991 from hughrawlinson/patch-1
Suggest that fish users init in interactive mode
2021-06-27 11:01:42 +03:00
Anton Petrov 35e0b0e24a
Create mambaforge-4.10.1-5 2021-06-27 10:45:15 +03:00
Anton Petrov 57f1c3b5b4
Create miniforge3-4.10.1-5 2021-06-27 10:39:48 +03:00
Hugh Rawlinson 637fd914dc
Update README.md 2021-06-27 00:25:22 +02:00
Hugh Rawlinson d2bd4c06ef
Suggest that fish users init in interactive mode
...rather than login mode.

I couldn't get rid of the warning that `pyenv init -` no longer sets path until I did this. It looks like setting only on the login shell wasn't enough to hide the warning in other shells I opened. This fits with [how rbenv does the same thing](https://github.com/rbenv/rbenv/blob/master/libexec/rbenv-init#L74).

I'm way out of my depth here, so someone who knows about shell types should definitely review this.
2021-06-27 00:22:59 +02:00
Ned Batchelder 5f75198569
Add 3.10.0b3 (#1988)
* Add 3.10.0b3

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2021-06-19 15:41:43 +03:00
native-api bbcecc7561
Merge pull request #1984 from pyenv/revert-1907-install_no_blank
Revert "Drop inferring version to install from `pyenv local`"
2021-06-14 18:08:19 +03:00
native-api e154693dc6
Revert "Drop inferring version to install from pyenv local" 2021-06-14 17:08:46 +03:00
native-api 1706436fae
Use system Python3 for tests (#1979)
PEP 394 now doesn't require `python` presence or specify what it is.
Tests that invoke it use Py3-specific code.
2021-06-10 03:57:58 +03:00
native-api 859b260764
Check for shims in path with pure Bash (#1978)
Closes https://github.com/pyenv/pyenv/issues/1921
2021-06-10 03:51:59 +03:00
LukeAI fadb3f3389
Fix instructions for Debian/Ubuntu to have shims ahead of ~/.local/bin (#1977)
Debian/Ubuntu's stock `~/.bashrc` prepends `~/.local/bin` to `PATH` towards its end if it exists.
Executables for per-user modules for system Python are installed into `~/.local/bin` --
so need to prepend `shims` to `PATH` later that that.

Co-authored-by: Ivan Pozdeev <vano@mail.mipt.ru>
2021-06-08 18:10:38 +03:00
Anton Petrov f81bffc95e
2.0.1 2021-06-06 16:25:48 +03:00
Anton Petrov d517315d25
Update CHANGELOG.md 2021-06-06 16:25:21 +03:00
Anton Petrov 70934bd635
Merge pull request #1907 from native-api/install_no_blank
Drop inferring version to install from `pyenv local`
2021-06-04 21:01:48 +03:00
Anton Petrov b8686ffdad
Merge pull request #1971 from anton-petrov/master
Create mambaforge-4.10.1-4
2021-06-04 20:57:34 +03:00
Anton Petrov c95b1f2b95
Create mambaforge-4.10.1-4 2021-06-04 20:32:57 +03:00
Seth Michael Larson c878150dac
Add 3.10.0b2 (#1966) 2021-06-03 00:16:20 +03:00
Philip Howard 6633382417
Fix .bashrc echo install syntax error (#1965)
Change `done` to `fi` since otherwise Bash emits an unexpected token error:

```
bash: /home/foo/.bashrc: line 120: syntax error near unexpected token `done'
bash: /home/foo/.bashrc: line 120: `if command -v pyenv >/dev/null; then eval "$(pyenv init -)"; done'
```
2021-06-03 00:12:58 +03:00
native-api 83056fc404
Merge pull request #1964 from native-api/master
Add explicit Zsh instructions for MacOS
2021-06-02 12:25:12 +03:00
Ivan Pozdeev cb1390cb49 Fix capitalization 2021-06-02 00:47:52 +03:00
Ivan Pozdeev 159327ff25 Add explicit instructions for Zsh in MacOS
Indirect ones with errata have proven to confuse users.
Fixes #1947, #1948
2021-06-02 00:08:28 +03:00
Ivan Pozdeev e2125b2750 Merge branch 'master' of https://github.com/pyenv/pyenv 2021-06-01 02:22:35 +03:00
Ivan Pozdeev adca14a910 fix typo 2021-06-01 02:22:19 +03:00
native-api fa7bb12221
Merge pull request #1955 from aisk/patch-1
install pip with pyston
2021-05-31 12:34:46 +03:00
An Long fa384f134e
install pip with pyston
The default pyston build do not have pip installed by default. This change just add `get_pip` function to have pip installed.
2021-05-31 16:46:01 +08:00
native-api ca2032452b
Merge pull request #1537 from native-api/mention_log
Mention log file if an error happened before building, too
2021-05-27 02:29:58 +03:00
native-api 713cfea475
Merge pull request #1950 from dmrlawson/pypy3.7-7.3.5
Add pypy3.7-7.3.5, pypy3.7-7.3.4-src, pypy3.7-7.3.5-src
2021-05-26 23:20:44 +03:00
David Lawson d73ae603c7 Add pypy3.7-7.3.4-src and pypy3.7-7.3.5-src 2021-05-26 20:55:17 +01:00
David Lawson 84486ceb70 Add pypy3.7-7.3.5 2021-05-26 20:21:38 +01:00
Ivan Pozdeev b4511f0787 Remove test for the feature 2021-05-10 03:19:38 +03:00
Ivan Pozdeev 8bff74dbd4 Drop inferring version to install from pyenv local
This behavior is only triggered when the version is provided as an empty string,
is undocumented and breaks if multiple local versions are specified
(rightly so since it's unclear which of them to install).
2021-05-08 01:58:47 +03:00
Ivan Pozdeev df671621e9 Mention log file if an error happened before building, too 2020-02-19 17:58:50 +03:00
1196 changed files with 118204 additions and 2337 deletions

11
.editorconfig Normal file
View file

@ -0,0 +1,11 @@
# Editor configuration, see https://editorconfig.org
root = true
[*]
end_of_line = lf
charset = utf-8
# Makefiles always use tabs for indentation
[Makefile]
indent_style = tab
indent_size = unset # Allow user-defined tab width

1
.github/CODEOWNERS vendored Normal file
View file

@ -0,0 +1 @@
* @pyenv/pyenv-core-maintainers @pyenv/pyenv-core-committers

12
.github/FUNDING.yml vendored Normal file
View file

@ -0,0 +1,12 @@
# These are supported funding model platforms
github: [pyenv] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: pyenv # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

View file

@ -1,21 +0,0 @@
Too many issues will kill our team's development velocity, drastically.
Make sure you have checked all steps below.
### Prerequisite
* [ ] Make sure your problem is not listed in [the common build problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems).
* [ ] Make sure no duplicated issue has already been reported in [the pyenv issues](https://github.com/pyenv/pyenv/issues). You should look for closed issues, too.
* [ ] Make sure you are not asking us to help solving your specific issue.
* GitHub issues is opened mainly for development purposes. If you want to ask someone to help solving your problem, go to some community site like [Gitter](https://gitter.im/yyuu/pyenv), [StackOverflow](https://stackoverflow.com/questions/tagged/pyenv), etc.
* [ ] Make sure your problem is not derived from packaging (e.g. [Homebrew](https://brew.sh)).
* Please refer to the package documentation for the installation issues, etc.
* [ ] Make sure your problem is not derived from plugins.
* This repository is maintaining `pyenv` and the default `python-build` plugin only. Please refrain from reporting issues of other plugins here.
### Description
- [ ] Platform information (e.g. Ubuntu Linux 16.04):
- [ ] OS architecture (e.g. amd64):
- [ ] pyenv version:
- [ ] Python version:
- [ ] C Compiler information (e.g. gcc 7.3):
- [ ] Please attach verbose build log as gist
* You can turn on verbose debug logging using by setting `PYENV_DEBUG=1`, e.g. `env PYENV_DEBUG=1 pyenv install -v 3.6.4`

54
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,54 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
### Prerequisites
* [ ] Make sure your problem is not listed in [the common build problems](https://github.com/pyenv/pyenv/wiki/Common-build-problems).
* [ ] Make sure no duplicated issue has already been reported in [the pyenv issues](https://github.com/pyenv/pyenv/issues?q=is%3Aissue). For build errors, a reported issue typically mentions a key error message. This key error message is often not in the 10 last build log lines reported to the console but is rather earlier in the build log -- typically, it's the first error message encountered in the log.
* [ ] Make sure you are reporting a problem in Pyenv and not seeking consultation with Pyenv usage.
* GitHub issues are intended mainly for Pyenv development purposes. If you are seeking help with Pyenv usage, check [Pyenv documentation](https://github.com/pyenv/pyenv?tab=readme-ov-file#simple-python-version-management-pyenv), go to a user community site like [Gitter](https://gitter.im/yyuu/pyenv), [StackOverflow](https://stackoverflow.com/questions/tagged/pyenv), etc, or to [Discussions](https://github.com/orgs/pyenv/discussions).
* [ ] Make sure your problem is not derived from packaging (e.g. [Homebrew](https://brew.sh)).
* Please refer to the package documentation for the installation issues, etc.
* [ ] Make sure your problem is not derived from plugins.
* This repository is maintaining `pyenv` and the default `python-build` plugin only. Please refrain from reporting issues of other plugins here.
### Describe the bug
A clear and concise description of what the bug is.
Do specify what the expected behaviour is if that's not obvious from the bug's nature.
#### Reproduction steps
Listing the commands to run in a new console session and their output is usually sufficient.
Please use a Markdown code block (three backticks on a line by themselves before and after the text) to denote a console output excerpt.
Usually not needed for build errors (since the arguments can already be seen in the debug trace) unless you are using an unusual invocation (e.g. setting environment variables that affect the build).
#### Diagnostic details
- [ ] Platform information (e.g. Ubuntu Linux 24.04):
- [ ] OS architecture (e.g. amd64):
- [ ] pyenv version:
- [ ] Python version:
- [ ] C Compiler information (e.g. gcc 7.3):
- [ ] Please attach the debug trace of the failing command as a [gist](https://gist.github.com/):
* Run `env PYENV_DEBUG=1 <faulty command> 2>&1 | tee trace.log` and attach `trace.log`. E.g. if you have a problem with installing Python, run `env PYENV_DEBUG=1 pyenv install -v <version> 2>&1 | tee trace.log` (note the `-v` option to `pyenv install`).
- [ ] If you have a problem with installing Python, please also attach `config.log` from the build directory
* The build directory is reported after the "BUILD FAILED" message and is usually under `/tmp`.
- [ ] If the build succeeds but the problem is still with the build process (e.g. the resulting Python is missing a feature), please attach
* the debug trace from reinstalling the faulty version with `env PYENV_DEBUG=1 pyenv install -f -k -v <version> 2>&1 | tee trace.log`
* `config.log` from the build directory. When using `pyenv install` with `-k` as per above, the build directory will be under `$PYENV_ROOT/sources`.
- [ ] If the problem happens in another Pyenv invocation, turn on debug logging by setting `PYENV_DEBUG=1`, e.g. `env PYENV_DEBUG=1 pyenv local 3.6.4`, and attach the resulting trace as a gist
- [ ] If the problem happens outside of a Pyenv invocation, get the debug trace like this:
```
export PYENV_DEBUG=1
# for Bash
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
# for Zsh
export PS4='+(%x:%I): %N(%i): '
set -x
<reproduce the problem>
set +x
```

View file

@ -0,0 +1,24 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Describe the intended use case**
* What your general environment is if it's relevant to the feature request and is not a generic console with a typical Pyenv installation (CI, server with a custom setup, cloud environment, IDE)
* What you are trying to achieve
* What specifically you are doing for that regarding Pyenv
* Where you are stuck
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
[ ] In particular, did you consider [writing a plugin](https://github.com/pyenv/pyenv/blob/master/README.md#pyenv-plugins)? Note that if your plugin has general applicability, you can publish it in the 3rd-party plugin catalog on the Pyenv Wiki as per the link above.
**Additional context**
Add any other context or screenshots about the feature request here.

View file

@ -3,9 +3,6 @@ Make sure you have checked all steps below.
### Prerequisite
* [ ] Please consider implementing the feature as a hook script or plugin as a first step.
* pyenv has some powerful support for plugins and hook scripts. Please refer to [Authoring plugins](https://github.com/pyenv/pyenv/wiki/Authoring-plugins) for details and try to implement it as a plugin if possible.
* [ ] Please consider contributing the patch upstream to [rbenv](https://github.com/rbenv/rbenv), since we have borrowed most of the code from that project.
* We occasionally import the changes from rbenv. In general, you can expect changes made in rbenv will be imported to pyenv too, eventually.
* Generally speaking, we prefer not to make changes in the core in order to keep compatibility with rbenv.
* [ ] My PR addresses the following pyenv issue (if any)
- Closes https://github.com/pyenv/pyenv/issues/XXXX

44
.github/actions/build-python/action.yml vendored Normal file
View file

@ -0,0 +1,44 @@
name: Build a Python version
description: >
Install python-build's system dependencies for the current runner's OS, build
and check the requested version.
inputs:
python-version:
description: A version as accepted by `pyenv install`.
required: true
runs:
using: composite
steps:
- shell: bash
run: |
#envvars
export PYENV_ROOT="$GITHUB_WORKSPACE"
echo "PYENV_ROOT=$PYENV_ROOT" >> $GITHUB_ENV
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
# The two OSes differ only in this step.
- if: runner.os == 'macOS'
shell: bash
run: |
#prerequisites
brew install openssl readline sqlite3 xz tcl-tk@8 libb2 zstd
- if: runner.os == 'Linux'
shell: bash
run: |
#prerequisites
pyenv install-prerequisites
- shell: bash
run: |
#build
pyenv --debug install ${{ inputs.python-version }} && rc=$? || rc=$?
if [[ $rc -ne 0 ]]; then echo config.log:; cat "${TMPDIR:-/tmp}"/python-build*/*/config.log; false; fi
pyenv global ${{ inputs.python-version }}
pyenv rehash
- shell: bash
run: |
#print version
python --version
python -m pip --version
- shell: python # Prove that actual Python == expected Python
env:
EXPECTED_PYTHON: ${{ inputs.python-version }}
run: import os, sys ; assert sys.version.startswith(os.getenv("EXPECTED_PYTHON"))

12
.github/dependabot.yml vendored Normal file
View file

@ -0,0 +1,12 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"
cooldown:
default-days: 7
groups:
github-actions:
patterns:
- "*"

View file

@ -1,13 +0,0 @@
# Configuration for probot-no-response - https://github.com/probot/no-response
# Number of days of inactivity before an Issue is closed for lack of response
daysUntilClose: 30
# Label requiring a response
responseRequiredLabel: need-feedback
# Comment to post when closing an Issue for lack of response. Set to `false` to disable
closeComment: >
This issue has been automatically closed because there has been no response
to our request for more information from the original author. With only the
information that is currently in the issue, we don't have enough information
to take action. Please reach out if you have or find the answers we need so
that we can investigate further.

View file

@ -0,0 +1,364 @@
#!/usr/bin/env python3
"""Generate a "Sponsors since <date>" section for release notes.
Queries GitHub Sponsors and OpenCollective for new sponsors since the latest
pyenv release or one month ago, whichever is longer. The output is Markdown
suitable for GitHub Releases.
Requirements:
* Python 3.8+
* The ``gh`` CLI authenticated with the ``read:user`` scope.
* Network access to https://opencollective.com.
"""
import argparse
import calendar
import datetime
import json
import pathlib
import subprocess
import sys
import typing
import urllib.error
import urllib.request
GITHUB_ORG = "pyenv"
OPENCOLLECTIVE_MEMBERS_URL = "https://opencollective.com/pyenv/members.json"
class SponsorDataError(RuntimeError):
"""Raised when a sponsors data source cannot be queried or parsed."""
def parse_date(value: str) -> datetime.date:
return datetime.datetime.fromisoformat(value).date()
def one_month_ago(today: typing.Optional[datetime.date] = None) -> datetime.date:
today = today or datetime.date.today()
year = today.year
month = today.month - 1
if month == 0:
year -= 1
month = 12
try:
return datetime.date(year, month, today.day)
except ValueError:
last_day = calendar.monthrange(year, month)[1]
return datetime.date(year, month, last_day)
def latest_release_date() -> datetime.date:
"""Return the publish date of the latest GitHub release."""
latest_release_error = None
try:
result = subprocess.run(
["gh", "api", f"repos/{GITHUB_ORG}/{GITHUB_ORG}/releases/latest"],
capture_output=True,
text=True,
check=True,
)
data = json.loads(result.stdout)
published = data["published_at"].replace("Z", "+00:00")
return datetime.datetime.fromisoformat(published).date()
except (
subprocess.CalledProcessError,
OSError,
json.JSONDecodeError,
KeyError,
) as exc:
latest_release_error = exc
try:
tag = subprocess.run(
["git", "describe", "--tags", "--abbrev=0"],
capture_output=True,
text=True,
check=True,
).stdout.strip()
date_str = subprocess.run(
["git", "log", "-1", "--format=%cI", tag],
capture_output=True,
text=True,
check=True,
).stdout.strip()
return datetime.datetime.fromisoformat(date_str).date()
except (subprocess.CalledProcessError, OSError) as exc:
detail = ""
if latest_release_error is not None:
detail = f" GitHub release lookup failed first: {latest_release_error}."
raise SponsorDataError(
"Could not determine the latest release date. "
"Pass --since explicitly or run from a clone with release tags."
f"{detail}"
) from exc
def compute_since_date(explicit_since: typing.Optional[datetime.date]) -> datetime.date:
if explicit_since is not None:
return explicit_since
return min(latest_release_date(), one_month_ago())
def github_sponsors(since: datetime.date) -> typing.List[typing.Dict]:
"""Return GitHub Sponsors created on or after *since*."""
query = """
query($org: String!, $after: String) {
organization(login: $org) {
sponsorshipsAsMaintainer(
first: 100,
after: $after,
activeOnly: false,
orderBy: {field: CREATED_AT, direction: DESC}
) {
pageInfo {
hasNextPage
endCursor
}
nodes {
createdAt
sponsorEntity {
... on User { login, name }
... on Organization { login, name }
}
}
}
}
}
"""
since_dt = datetime.datetime.combine(
since, datetime.time.min, tzinfo=datetime.timezone.utc
)
sponsors = []
cursor = None
while True:
command = [
"gh",
"api",
"graphql",
"-F",
f"org={GITHUB_ORG}",
"-f",
f"query={query}",
]
if cursor is not None:
command.extend(["-F", f"after={cursor}"])
result = subprocess.run(
command,
capture_output=True,
text=True,
)
if result.returncode != 0:
detail = result.stderr.strip() or result.stdout.strip() or "no output"
raise SponsorDataError(
"GitHub Sponsors query failed. "
"Check that `gh auth status` shows access to the pyenv org "
"and that the token has the scopes required to read sponsorships. "
f"`gh api graphql` exited {result.returncode}: {detail}"
)
try:
data = json.loads(result.stdout)
except json.JSONDecodeError as exc:
raise SponsorDataError(
"GitHub Sponsors query returned invalid JSON."
) from exc
if "errors" in data:
raise SponsorDataError(
f"GitHub Sponsors query returned errors: {data['errors']}"
)
try:
sponsorships = data["data"]["organization"]["sponsorshipsAsMaintainer"]
except (TypeError, KeyError) as exc:
raise SponsorDataError(
"GitHub Sponsors query returned an unexpected response shape."
) from exc
try:
nodes = sponsorships["nodes"]
page_info = sponsorships["pageInfo"]
except (TypeError, KeyError) as exc:
raise SponsorDataError(
"GitHub Sponsors query returned incomplete pagination data."
) from exc
for node in nodes:
try:
created = datetime.datetime.fromisoformat(
node["createdAt"].replace("Z", "+00:00")
)
entity = node["sponsorEntity"]
login = entity["login"]
except (AttributeError, KeyError, TypeError, ValueError) as exc:
raise SponsorDataError(
"GitHub Sponsors query returned an unexpected sponsor record."
) from exc
if created < since_dt:
return sponsors
sponsors.append({
"login": login,
"name": entity.get("name") or login,
})
try:
has_next_page = page_info["hasNextPage"]
cursor = page_info["endCursor"]
except (TypeError, KeyError) as exc:
raise SponsorDataError(
"GitHub Sponsors query returned incomplete pagination data."
) from exc
if not has_next_page:
return sponsors
def opencollective_sponsors(since: datetime.date, data: typing.Union[str, None]) -> typing.List[typing.Dict]:
"""Return OpenCollective backers active on or after *since*."""
if data is None:
req = urllib.request.Request(
f"{OPENCOLLECTIVE_MEMBERS_URL}?limit=1000",
headers={"User-Agent": f"{GITHUB_ORG}/release-notes-sponsors"},
)
try:
with urllib.request.urlopen(req, timeout=30) as resp:
data = resp.read()
except urllib.error.HTTPError as exc:
raise SponsorDataError(
f"OpenCollective sponsors query failed for {OPENCOLLECTIVE_MEMBERS_URL}: "
f"HTTP {exc.code} {exc.reason}"
) from exc
except urllib.error.URLError as exc:
raise SponsorDataError(
f"OpenCollective sponsors query failed for {OPENCOLLECTIVE_MEMBERS_URL}: "
f"{exc.reason}"
) from exc
try:
members = json.loads(data)
except json.JSONDecodeError as exc:
raise SponsorDataError(
"OpenCollective sponsors query returned invalid JSON."
) from exc
since_dt = datetime.datetime.combine(since, datetime.time.min)
sponsors = []
for member in members:
if member.get("role") != "BACKER":
continue
try:
last_transaction_at = datetime.datetime.strptime(member["lastTransactionAt"], "%Y-%m-%d %H:%M")
profile = member["profile"].rstrip("/")
except (KeyError, TypeError, ValueError) as exc:
raise SponsorDataError(
"OpenCollective sponsors query returned an unexpected member record."
) from exc
if last_transaction_at < since_dt:
continue
slug = profile.split("/")[-1]
if slug == "github-sponsors":
# Listed separately under GitHub Sponsors.
continue
sponsors.append({
"name": member.get("name") or slug,
"profile": profile,
})
return sponsors
def render(
since: datetime.date,
gh_sponsors: typing.List[typing.Dict],
oc_sponsors: typing.List[typing.Dict],
) -> str:
lines = [f"## Sponsors since {since.isoformat()}", ""]
if gh_sponsors:
lines.append("### GitHub Sponsors")
for sponsor in gh_sponsors:
lines.append(
markdown_link(
sponsor["name"],
f"https://github.com/{sponsor['login']}",
)
)
lines.append("")
if oc_sponsors:
lines.append("### Open Collective")
for sponsor in oc_sponsors:
lines.append(markdown_link(sponsor["name"], sponsor["profile"]))
lines.append("")
if not gh_sponsors and not oc_sponsors:
lines.append("*No new sponsors in this period.*")
lines.append("")
return "\n".join(lines)
def markdown_link(text: str, url: str) -> str:
escaped_text = escape_markdown_text(text)
escaped_url = url.replace(")", "%29")
return f"- [{escaped_text}]({escaped_url})"
def escape_markdown_text(text: str) -> str:
escaped = text.replace("\\", "\\\\")
for char in r"`*_{}[]()#+-.!|>":
escaped = escaped.replace(char, f"\\{char}")
return escaped
def main() -> int:
parser = argparse.ArgumentParser(
description="Generate a sponsors section for GitHub release notes."
)
parser.add_argument(
"--since",
type=parse_date,
metavar="YYYY-MM-DD",
help="Include sponsors created on or after this date.",
)
parser.add_argument(
"--output",
metavar="FILE",
help="Write the section to FILE instead of stdout.",
)
parser.add_argument(
"--skip-opencollective",
action="store_true",
help="Skip OpenCollective backers if the members endpoint is unavailable.",
)
parser.add_argument(
"--opencollective-data",
metavar="FILE",
help="Take OpenCollective API reply from FILE.",
)
args = parser.parse_args()
try:
since = compute_since_date(args.since)
oc_sponsors = []
if not args.skip_opencollective:
manual_data = (
pathlib.Path(args.opencollective_data).read_text()) \
if args.opencollective_data \
else None
oc_sponsors = opencollective_sponsors(since, manual_data)
section = render(since, github_sponsors(since), oc_sponsors)
except SponsorDataError as exc:
print(f"error: {exc}", file=sys.stderr)
return 1
if args.output:
with open(args.output, "w", encoding="utf-8") as f:
f.write(section)
else:
print(section, end="")
return 0
if __name__ == "__main__":
sys.exit(main())

58
.github/workflows/add_version.yml vendored Normal file
View file

@ -0,0 +1,58 @@
name: Add versions
on:
workflow_dispatch: {}
schedule:
# Every N hours
- cron: '25 */4 * * *'
permissions:
contents: write
pull-requests: write
jobs:
add_cpython:
runs-on: ubuntu-slim
steps:
- uses: actions/checkout@v7
- uses: actions/setup-python@v7
with:
python-version: 3
cache: 'pip'
cache-dependency-path: plugins/python-build/scripts/requirements.txt
- run: pip install -r plugins/python-build/scripts/requirements.txt
- name: check for a release
run: |
python plugins/python-build/scripts/add_cpython.py --verbose >added_versions.lst && rc=$? || rc=$?
#0 means new version found, 1 not found, 2 another error
[[ $rc -gt 1 ]] && false
echo "rc=$rc" >> $GITHUB_ENV
- name: set PR properties
if: env.rc == 0
shell: python
run: |
import os
import sys
versions=[l.rstrip() for l in open("added_versions.lst")]
with open(os.environ['GITHUB_ENV'],'a') as f:
f.write(f'branch_name=auto_add_version/{"_".join(versions)}\n')
f.write(f'pr_name=Add CPython {", ".join(versions)}\n')
os.remove("added_versions.lst")
# https://github.com/peter-evans/create-pull-request/blob/main/docs/concepts-guidelines.md#authenticating-with-github-app-generated-tokens
- name: Generate Github token
if: env.rc == 0
uses: actions/create-github-app-token@v3
id: generate-token
with:
app-id: ${{ vars.PYENV_BOT_APP_ID }}
private-key: ${{ secrets.PYENV_BOT_PRIVATE_KEY }}
- name: Create Pull Request
uses: peter-evans/create-pull-request@v8
if: env.rc == 0
with:
branch: ${{ env.branch_name }}
title: ${{ env.pr_name }}
commit-message: ${{ env.pr_name }}
token: ${{ steps.generate-token.outputs.token }}

62
.github/workflows/build.yml vendored Normal file
View file

@ -0,0 +1,62 @@
name: build
on:
push:
branches: [master]
pull_request: {}
permissions:
contents: read
jobs:
discover_build_logic_change:
if: github.event_name == 'pull_request'
runs-on: ubuntu-slim
env:
FULL_OS_MATRIX: '[
"macos-14",
"macos-15",
"macos-15-intel",
"macos-26",
"macos-26-intel",
"ubuntu-22.04",
"ubuntu-22.04-arm",
"ubuntu-24.04",
"ubuntu-24.04-arm"
]'
outputs:
os: ${{ steps.detect.outputs.os }}
steps:
- uses: actions/checkout@v7
- run: git fetch origin "$GITHUB_BASE_REF"
- id: detect
shell: bash
run: |
if [[ -n $(git diff --name-only "origin/$GITHUB_BASE_REF" -- \
plugins/python-build/bin/python-build \
.github/actions/build-python/action.yml \
.github/workflows/build.yml) ]]
then
printf "%s\n" "os<<!" "$FULL_OS_MATRIX" "!" >> "$GITHUB_OUTPUT"
fi
build:
needs: discover_build_logic_change
# Run when the detection job succeeded *or was skipped* -- but not failed
if: ${{ !cancelled() && !failure() }}
strategy:
fail-fast: false
matrix:
os: ${{ fromJson(needs.discover_build_logic_change.outputs.os || '["macos-latest","ubuntu-latest"]') }}
python-version:
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- uses: ./.github/actions/build-python
with:
python-version: ${{ matrix.python-version }}

View file

@ -0,0 +1,304 @@
name: modified_scripts
on: [pull_request]
jobs:
discover_modified_scripts:
runs-on: ubuntu-slim
outputs:
versions: ${{steps.modified-versions.outputs.versions}}
versions_cpython_only: ${{steps.modified-versions.outputs.versions_cpython_only}}
versions_macos_build_exclude: ${{steps.modified-versions.outputs.versions_macos_build_exclude}}
steps:
- uses: actions/checkout@v7
- run: git fetch origin "$GITHUB_BASE_REF"
- shell: bash
run: >
versions=$(git diff "origin/$GITHUB_BASE_REF" --name-only -z
| perl -ne 'BEGIN {$\="\n";$/="\0";} chomp;
if (/^(plugins\/python-build\/share\/python-build\/)(?:([^\/]+)|patches\/([^\/]+)\/.*)$/ and -e $& )
{
print $2.$3;
if ( -e $1.$2.$3.t ) { print $2.$3.t; }
}' \
| sort -u);
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64);
echo "versions<<$EOF" >> $GITHUB_ENV;
echo "$versions" >> $GITHUB_ENV;
echo "$EOF" >> $GITHUB_ENV;
versions_cpython_only=$(grep -Ee '^[[:digit:]]' <<<"$versions")
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;
- run: pip install packaging
- name: Build exclusions JSON
shell: python
run: |
import os
import json
import random
import re
import subprocess
import packaging.version
result=[]
def exclude_macos_intel(result, python_version):
result.append({'os':'macos-15-intel','python-version':python_version})
result.append({'os':'macos-26-intel','python-version':python_version})
for line in os.environ['versions'].splitlines():
if m:=re.match(r'miniconda3-\d+\.\d+-(\d+\.\d+\.\d+)', line):
version = packaging.version.Version(m.group(1))
# Miniconda dropped MacOS x64 support
if version >= packaging.version.Version('25.9.1'):
exclude_macos_intel(result, line)
if m:=re.match(r'anaconda3-(\d+\.\d+)', line):
version = packaging.version.Version(m.group(1))
# Anaconda dropped MacOS x64 support
if version >= packaging.version.Version('2025.12'):
exclude_macos_intel(result, 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'):
exclude_macos_intel(result, line)
EOF = str(random.getrandbits(15*8))
with open(os.environ['GITHUB_ENV'],'w') as f:
f.write(f"versions_macos_build_exclude_json<<{EOF}\n")
json.dump(result, f)
f.write(f'\n{EOF}\n')
- 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
echo 'versions_macos_build_exclude=${{ env.versions_macos_build_exclude_json }}' >> $GITHUB_OUTPUT
macos_build:
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-14
- macos-15
- macos-15-intel
- macos-26
- macos-26-intel
exclude: ${{fromJson(needs.discover_modified_scripts.outputs.versions_macos_build_exclude)}}
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- 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 openssl readline sqlite3 xz tcl-tk@8 libb2 zstd
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 }} && rc=$? || rc=$?
if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi
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/*
macos_build_bundled_dependencies:
needs: discover_modified_scripts
if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]'
strategy:
fail-fast: false
matrix:
python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}}
os:
- macos-14
- macos-15
- macos-15-intel
- macos-26
- macos-26-intel
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- 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 tcl-tk@8 libb2 zstd
"$GITHUB_WORKSPACE/.github/workflows/scripts/brew-uninstall-cascade.sh" $(brew list | grep -E '^openssl(@|$)') readline
- run: |
#build
pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$?
if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi
pyenv global ${{ matrix.python-version }}
- run: |
#print version
python --version
python -m pip --version
- env:
EXPECTED_PYTHON: ${{ matrix.python-version }}
run: |
#check
python -c '
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'
ubuntu_build:
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-22.04
- ubuntu-22.04-arm
- ubuntu-24.04
- ubuntu-24.04-arm
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- 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
pyenv install-prerequisites
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 }} && rc=$? || rc=$?
if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi
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 break
- run: |
pyenv global system
rm -f "$(pyenv root)"/shims/*
ubuntu_build_tar_gz:
needs: discover_modified_scripts
if: needs.discover_modified_scripts.outputs.versions_cpython_only != '[""]'
strategy:
fail-fast: false
matrix:
python-version: ${{fromJson(needs.discover_modified_scripts.outputs.versions_cpython_only)}}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- 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_ENV
- run: |
#prerequisites
pyenv install-prerequisites
- run: |
#build
pyenv --debug install ${{ matrix.python-version }} && rc=$? || rc=$?
if [[ $rc -ne 0 ]]; then echo config.log:; cat $TMPDIR/python-build*/*/config.log; false; fi
pyenv global ${{ matrix.python-version }}
- run: |
#print version
python --version
python -m pip --version
- env:
EXPECTED_PYTHON: ${{ matrix.python-version }}
run: |
#check
python -c '
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'

30
.github/workflows/no-response.yml vendored Normal file
View file

@ -0,0 +1,30 @@
name: No Response
# Both `issue_comment` and `scheduled` event types are required for this Action
# to work properly.
on:
issue_comment:
types: [created]
schedule:
# Schedule for ten minutes after the hour, every 2 hours
- cron: '10 */2 * * *'
permissions: {}
jobs:
noResponse:
permissions:
issues: write # to update issues (lee-dohm/no-response)
runs-on: ubuntu-slim
steps:
- uses: lee-dohm/no-response@v0.5.0
with:
token: ${{ github.token }}
daysUntilClose: 30
responseRequiredLabel: need-feedback
closeComment: >
This issue has been automatically closed because there has been no response
to our request for more information from the original author. With only the
information that is currently in the issue, we don't have enough information
to take action. Please reach out if you have or find the answers we need so
that we can investigate further.

70
.github/workflows/publish_binary.yml vendored Normal file
View file

@ -0,0 +1,70 @@
name: Publish a binary package
on:
workflow_dispatch:
inputs:
version:
description: A CPython version accepted by `pyenv install`
required: true
type: string
permissions:
contents: read
jobs:
publish_ubuntu:
runs-on: ubuntu-24.04
env:
PYENV_ROOT: ${{ github.workspace }}
VERSION: ${{ inputs.version }}
steps:
- uses: actions/checkout@v7
- name: Install build prerequisites
run: ./bin/pyenv install-prerequisites
- name: Build package
env:
PYTHON_CONFIGURE_OPTS: --enable-optimizations
run: |
VERSION="${VERSION%%:*}"
entry="$(./bin/pyenv binary package-name "$VERSION")"
echo "entry=$entry" >> "$GITHUB_ENV"
mkdir dist
cd dist
"$GITHUB_WORKSPACE/bin/pyenv" binary package --verbose \
"$VERSION:$entry" \
--archive-base-url https://pyenv.github.io/pythons/binaries
- name: Generate GitHub token
uses: actions/create-github-app-token@v3
id: generate-token
with:
app-id: ${{ vars.PYENV_BOT_APP_ID }}
private-key: ${{ secrets.PYENV_BOT_PRIVATE_KEY }}
owner: ${{ github.repository_owner }}
repositories: pyenv.github.io
permission-contents: write
permission-pull-requests: write
- uses: actions/checkout@v7
with:
repository: pyenv/pyenv.github.io
token: ${{ steps.generate-token.outputs.token }}
path: site
- name: Update downloads
run: |
mkdir -p site/pythons/binaries
cp "dist/$entry.tar.gz" "dist/$entry.meta" "dist/$entry" \
site/pythons/binaries/
cd site/pythons
./update.sh
- name: Create Pull Request
uses: peter-evans/create-pull-request@v8
with:
path: site
branch: auto_add_binary/${{ env.entry }}
title: Add CPython ${{ env.entry }}
commit-message: Add CPython ${{ env.entry }}
body: |
Built from pyenv/pyenv@${{ github.sha }} with profile-guided optimization enabled.
Part of pyenv/pyenv#2334.
token: ${{ steps.generate-token.outputs.token }}

45
.github/workflows/pyenv_tests.yml vendored Normal file
View file

@ -0,0 +1,45 @@
name: pyenv_tests
on:
push:
branches: [master]
pull_request: {}
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
pyenv_tests:
strategy:
fail-fast: false
matrix:
os:
- ubuntu-22.04
- ubuntu-22.04-arm
- ubuntu-24.04
- ubuntu-24.04-arm
- macos-14
- macos-15
- macos-15-intel
- macos-26
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v7
- name: Install prerequisites
run: |
if test "$RUNNER_OS" == "macOS"; then
brew install coreutils fish
fi
- name: Run tests
run: |
make test
- env:
PYENV_NATIVE_EXT: 1
run: |
(cd src; ./configure; make)
bats/bin/bats test/{pyenv,hooks,versions}.bats
pyenv_tests_docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- run: |
make test-docker

View file

@ -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[@]}"

View file

@ -1,42 +0,0 @@
name: ubuntu_tests
on: [pull_request, push]
jobs:
ubuntu_tests:
strategy:
fail-fast: false
matrix:
python-version:
- 2.7.18
- 3.5.10
- 3.6.13
- 3.7.10
- 3.8.10
- 3.9.5
runs-on: Ubuntu-20.04
steps:
- uses: actions/checkout@v2
# Normally, we would use the superbly maintained...
# - uses: actions/setup-python@v2
# with:
# python-version: ${{ matrix.python-version }}
# ... but in the repo, we want to test pyenv builds on Ubuntu
- run: |
sudo apt-get install -y build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev python-openssl git
# https://github.com/pyenv/pyenv#installation
- run: pwd
- env:
PYENV_ROOT: /home/runner/work/pyenv/pyenv
run: |
echo $PYENV_ROOT
echo "$PYENV_ROOT/shims:$PYENV_ROOT/bin" >> $GITHUB_PATH
bin/pyenv install ${{ matrix.python-version }}
bin/pyenv global ${{ matrix.python-version }}
bin/pyenv rehash
- run: python --version
- run: python -m pip --version
- shell: python # Prove that actual Python == expected Python
env:
EXPECTED_PYTHON: ${{ matrix.python-version }}
run: import os, sys ; assert sys.version.startswith(os.getenv("EXPECTED_PYTHON"))

6
.gitignore vendored
View file

@ -6,5 +6,9 @@
/libexec/*.dylib
/src/Makefile
/src/*.o
/bats/
/bats
/bats-*/
/default-packages
.idea
*.un~
*.swp

View file

@ -1,83 +0,0 @@
# Two types of tests:
#
# 1. shell tests run using bats
# 2. build tests also run using bats
#
# Shell tests are run unconditionally on Linux (see jobs.include).
#
# Build tests can be skipped by starting the commit message with
# '[skip build]'.
#
# Build tests are run on platforms generated from all combinations
# of keys below.
language: c
os:
- linux
- osx
dist:
- focal
# https://docs.travis-ci.com/user/reference/osx/#macos-version
osx_image:
- xcode9.4.1 # macOS 10.13.6
- xcode10.3 # macOS 10.14.4
- xcode11.6 # macOS 10.15.7
- xcode12.2 # macOS 10.15.7
env:
- PYTHON_BUILD_VERSION=3.9.1
- PYTHON_BUILD_VERSION=3.7.5
before_install:
- date +%Y-%m-%dT%H:%M:%S
install: git clone --depth 1 --branch v1.2.0 https://github.com/bats-core/bats-core.git bats
# Default for auto-generated jobs.
script: make test-build
jobs:
include:
# Shell-based tests should execute every time.
- stage: test shell
script: make test
env: PYENV_NATIVE_EXT=1
after_script: []
os: linux
- stage: test shell
script: make test
env: PYENV_NATIVE_EXT=
after_script: []
os: linux
exclude:
# For each osx_image but one there should be an entry in the exclude
# list, to prevent duplicate Linux builds.
- os: linux
osx_image: xcode9.4
- os: linux
osx_image: xcode10
allow_failures:
- env: PYTHON_BUILD_VERSION=3.9.1
stages:
- test shell
- name: test
if: NOT (commit_message =~ /^\[skip build\]/)
# Default
notifications:
email:
on_success: never
deploy:
provider: releases
api_key:
secure: FLWevL09KYp7V1SjJUNEdWzuomuocXwNvPr1DSAFH7mmrjKTtjzwrjINAthSqzjlDrs5B//P47l1VLyHp5byEzy673W+bOmEg8swmqc7E9FrHLRyEByd/yca3DzkZgXEXgGdY/cl7tHhM4V2fYKEgAIWbFV+takmTFMK4WkEtNg=
on:
repo: pyenv/pyenv
tags: true

View file

@ -1,4 +1,888 @@
## Version History
# Version History
## Release v2.8.5
* pyenv-binary: record direct system dependencies in Linux/FreeBSD by @macayu17 in https://github.com/pyenv/pyenv/pull/3520
* tests: Fix "cd: null directory" in OpenSUSE by @native-api in https://github.com/pyenv/pyenv/pull/3524
* Test improvements by @native-api in https://github.com/pyenv/pyenv/pull/3525
* CI: test on all runners when the build logic changes by @sujeito-operator in https://github.com/pyenv/pyenv/pull/3522
* Add GraalPy 25.3.4.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3529
* Add CPython 3.15.0rc2 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3530
* pyenv-binary: support relocating macOS archives by @macayu17 in https://github.com/pyenv/pyenv/pull/3528
## Release v2.8.4
* CI: Add macos_26_intel by @native-api in https://github.com/pyenv/pyenv/pull/3514
* pyenv-binary: check FreeBSD system libraries by @macayu17 in https://github.com/pyenv/pyenv/pull/3511
* version-file: Fix infinite loop for a relative path argument by @fudianchn in https://github.com/pyenv/pyenv/pull/3515
* pyenv-binary: check patchelf early and add --verbose by @macayu17 in https://github.com/pyenv/pyenv/pull/3516
* CI: add ubuntu ARM images by @native-api in https://github.com/pyenv/pyenv/pull/3517
* Add CPython 3.10.21, 3.11.16, 3.12.14 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3518
* Add anaconda3-2026.07-1, miniconda3 26.5.3-2 by @native-api in https://github.com/pyenv/pyenv/pull/3519
## Release v2.8.3
* Add CPython 3.13.15, 3.14.7 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3512
## Release v2.8.2
* pyenv-binary: add the `package` subcommand; add `pyenv install --list --bare` by @macayu17 in https://github.com/pyenv/pyenv/pull/3498
* Add graalpy3.12-25.2.4 by @msimacek in https://github.com/pyenv/pyenv/pull/3502
* Bump actions/setup-python from 6 to 7 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3505
* add_cpython: refactor extra Requests logic by @anupamme in https://github.com/pyenv/pyenv/pull/3507
* Add CPython 3.15.0rc1 by @jsirois in https://github.com/pyenv/pyenv/pull/3510
* pyenv-binary: generate platform-specific package names by @macayu17 in https://github.com/pyenv/pyenv/pull/3504
## Release v2.8.1
* pyenv-binary: add the `generate-installer` subcommand by @macayu17 in https://github.com/pyenv/pyenv/pull/3488
* Add CPython 3.15.0b4 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3495
## Release v2.8.0
* CVE-2026-68939: Fix handling of glob characters in .python-version
* CI: add_version enhancements by @native-api in https://github.com/pyenv/pyenv/pull/3480
* Add miniforge3-26.3.2-2, 26.3.2-3 by @native-api in https://github.com/pyenv/pyenv/pull/3481
* rehash: fix race condition in landlock writability check by @Sheile in https://github.com/pyenv/pyenv/pull/3483
* Add script to generate sponsors section for release notes by @macayu17 in https://github.com/pyenv/pyenv/pull/3478
* install: Add an ability to install a version under an alias by @macayu17 in https://github.com/pyenv/pyenv/pull/3484
* Add graalpy-3.12-25.1.3 by @msimacek in https://github.com/pyenv/pyenv/pull/3485
* Bump actions/checkout from 6 to 7 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3486
* Add an experimental pyenv-binary plugin with a save command by @macayu17 in https://github.com/pyenv/pyenv/pull/3487
* CI: dependabot: set cooldown by @orbisai0security in https://github.com/pyenv/pyenv/pull/3489
* Fix typos in docs, scripts, and tests by @maxtaran2010 in https://github.com/pyenv/pyenv/pull/3490
* Add miniconda3 26.5.3-1 by @native-api in https://github.com/pyenv/pyenv/pull/3491
* version-name: skip redundant checks by @native-api in https://github.com/pyenv/pyenv/pull/3492
## Release v2.7.3
* CI: add_version enhancements by @macayu17 in https://github.com/pyenv/pyenv/pull/3475
* Add CPython 3.15.0b3 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3479
## Release v2.7.2
* fix(rehash): prevent terminal hang caused by stale or sandbox-blocked lock file by @anupddas in https://github.com/pyenv/pyenv/pull/3469
* 3.6.x: Fix verify_* calls by @native-api in https://github.com/pyenv/pyenv/commit/6c0c5cfa9619e4a7a90102d8bee6c771c4739836
* Add CPython 3.14.6 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3472
* Add CPython 3.13.14 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3473
## Release v2.7.1
* Support 3.9 EOL Pip URL, consolidate tests by @native-api in https://github.com/pyenv/pyenv/pull/3465
* Update URLs for PyPy nightly; Remove pypy3.5 and pypy3.7 nightly by @native-api in https://github.com/pyenv/pyenv/pull/3466
* Add CPython 3.15.0b2 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3467
* init: add --install for shell setup by @macayu17 in https://github.com/pyenv/pyenv/pull/3454
* realpath.c: fix obsolete syntax warning by @native-api in https://github.com/pyenv/pyenv/pull/3468
## Release v2.6.32
* Add miniconda3 26.3.2-2, miniforge3 26.3.2-0, 26.3.2-1 by @native-api in https://github.com/pyenv/pyenv/pull/3445
* miniforge3 26.1, 26.3, add_miniforge: exclude .pkg installers by @native-api in https://github.com/pyenv/pyenv/pull/3446
* miniforge 26, CI: switch check to 3.13 by @native-api in https://github.com/pyenv/pyenv/pull/3447
* 2.7, 3.4: force C99 standard; 2.7.14-18: force OpenSSL 1 formula by @native-api in https://github.com/pyenv/pyenv/pull/3448
* rehash: detect and remove a stale lockfile by @native-api in https://github.com/pyenv/pyenv/pull/3450
* Add GraalPy 25.0.3 by @msimacek in https://github.com/pyenv/pyenv/pull/3452
* 3.11.0+: Use the `--with-openssl-rpath' Configure option when possible by @native-api in https://github.com/pyenv/pyenv/pull/3458
* python_build: Make `verify_python` verify `pythonX.Y' suffix by @native-api in https://github.com/pyenv/pyenv/pull/3459
* Add micropython 1.22.0 to 1.28.0; add downstream patches to fix compilation errors by @native-api in https://github.com/pyenv/pyenv/pull/3460
* Fix linking against a keg_only Homebrew OpenSSL when a a non-keg_only one is also installed by @native-api in https://github.com/pyenv/pyenv/pull/3462
* Add missing CPython 3.14.2t by @native-api in https://github.com/pyenv/pyenv/pull/3464
* 3.14.0-5: Support building against OpenSSL 4 by @native-api in https://github.com/pyenv/pyenv/pull/3463
## Release v2.6.31
* CI: add_cpython: Support prereleases for non-initial CPython releases by @native-api in https://github.com/pyenv/pyenv/pull/3443
* Add CPython 3.14.5 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3444
## Release v2.6.30
* Add CPython 3.16-dev, switch 3.15-dev to maintenance branch by @nedbat in https://github.com/pyenv/pyenv/pull/3442
## Release v2.6.29
* Add PyPy v7.3.22 by @jsirois in https://github.com/pyenv/pyenv/pull/3438
* CI: Add timeouts to CPython release metadata fetches by @orbisai0security in https://github.com/pyenv/pyenv/pull/3439
* Add CPython 3.15.0b1 by @jsirois in https://github.com/pyenv/pyenv/pull/3440
* Add CPython 3.14.5rc1 by @native-api in https://github.com/pyenv/pyenv/pull/3441
## Release v2.6.28
* pyenv-latest: fast path for when there is an exact match by @native-api in https://github.com/pyenv/pyenv/pull/3437
## Release v2.6.27
* commands: fast path for --sh, replace sort|uniq with sort -u by @jakelodwick in https://github.com/pyenv/pyenv/pull/3423
* which: update the `pyenv help global` tip by @native-api in https://github.com/pyenv/pyenv/pull/3424
* Bump actions/create-github-app-token from 2 to 3 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3428
* python-build: advise user with no c compiler by @exurd in https://github.com/pyenv/pyenv/pull/3294
* Add CPython 3.13.13, 3.14.4, 3.15.0a8 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3432
* Add miniforge3 26.1.1-2, 26.1.1-3 by @native-api in https://github.com/pyenv/pyenv/pull/3433
## Release v2.6.26
* versions: fast path for --bare --skip-aliases by @jakelodwick in https://github.com/pyenv/pyenv/pull/3411
* Fix MacPorts OpenSSL formula detection by @tekintian in https://github.com/pyenv/pyenv/pull/3417
* rehash: streamline executables discovery; fix regression by @native-api in https://github.com/pyenv/pyenv/pull/3418
* rehash: simplify source.bash pipeline by @jakelodwick in https://github.com/pyenv/pyenv/pull/3419
* Add CPython 3.15.0a7 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3421
## Release v2.6.25
* Add miniforge3-26.1.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3413
* Add CPython 3.12.13 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3414
## Release v2.6.24
* CI: add_version: use Github App token to create PR by @native-api in https://github.com/pyenv/pyenv/pull/3406
* Add Anaconda3-2025.12-2 by @binbjz in https://github.com/pyenv/pyenv/pull/3408
* rehash: Drop redundant sort -u from make_shims call by @jakelodwick in https://github.com/pyenv/pyenv/pull/3410
* Add CPython 3.10.20, 3.11.15 by @pyenv-bot[bot] in https://github.com/pyenv/pyenv/pull/3412
## Release v2.6.23
* Add CPython 3.15.0a6 by @native-api in https://github.com/pyenv/pyenv/pull/3403
## 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
* 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
* Add PowerShell support by @fblanchetNaN in https://github.com/pyenv/pyenv/pull/2749
* rehash: support older BSD `mktemp` by @native-api in https://github.com/pyenv/pyenv/pull/3376
* rehash: report final lock acquisition error while silencing provisional ones; init: don't silence automatic rehash by @native-api in https://github.com/pyenv/pyenv/pull/3377
* pyenv launcher: introduce and export _PYENV_INSTALL_PREFIX by @rockandska in https://github.com/pyenv/pyenv/pull/3334
* README: Document how to change Python version in a shell spawned from a Python-based program (e.g. Jupyter) by @native-api in https://github.com/pyenv/pyenv/pull/3380
* Recognize an argument to -j in MAKEFLAGS when building extensions in 3.10-3.11 and latest 3.5-3.9 by @native-api in https://github.com/pyenv/pyenv/pull/3379
* CI: add a script to autogenerate CPython build scripts by @native-api in https://github.com/pyenv/pyenv/pull/3358
* Add miniconda3-25.11.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3382
* CI: exclude unsupported MacOS-x64 for recent Miniconda versions by @binbjz in https://github.com/pyenv/pyenv/pull/3385
* Auto-accept TOS for miniconda3-25+ by @native-api in https://github.com/pyenv/pyenv/pull/3386
* Add anaconda-2025.12-1 by @native-api in https://github.com/pyenv/pyenv/pull/3387
* CI: automatically check for CPython releases and generate PRs by @native-api in https://github.com/pyenv/pyenv/pull/3388
## Release v2.6.17
* Add miniforge 25.9.1-0, 25.11.0-1 by @13steinj in https://github.com/pyenv/pyenv/pull/3371
* miniconda3-latest: auto accept TOS by @native-api in https://github.com/pyenv/pyenv/pull/3373
* Add CPython 3.15.0a3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3374
## Release v2.6.16
* rehash: Fix hanging for 60 seconds when shims directory is not writable due to Linux Landlock by @native-api in https://github.com/pyenv/pyenv/pull/3367
* Add Miniconda3-25.9.1-3 by @binbjz in https://github.com/pyenv/pyenv/pull/3368
* sh-rehash: Fix erroneously executing rather than printing a command by @native-api in https://github.com/pyenv/pyenv/pull/3369
* Add CPython 3.13.11, 3.14.2 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/3370
## Release v2.6.15
* Add CPython 3.13.10 by @jsirois in https://github.com/pyenv/pyenv/pull/3364
## Release v2.6.14
* CI: Bump actions/checkout from 5 to 6 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3360
* Fix "ld: symbol(s) not found" for C system calls in some MacOS versions if XCode is for a newer major MacOS version by @native-api in https://github.com/pyenv/pyenv/pull/3362
* Add CPython 3.14.1 by @nedbat in https://github.com/pyenv/pyenv/pull/3363
## Release v2.6.13
* CI: Replace macos-13 with macos-15-intel by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3356
* Add Miniconda3-25.9.1-1 by @binbjz in https://github.com/pyenv/pyenv/pull/3357
* Add CPython 3.15.0a2 by @nedbat in https://github.com/pyenv/pyenv/pull/3359
## Release v2.6.12
* Add graalpy-25.0.1 by @msimacek in https://github.com/pyenv/pyenv/pull/3350
* Add CPython 3.9.25 by @nedbat in https://github.com/pyenv/pyenv/pull/3355
## Release v2.6.11
* Support building against Homebrew Tcl/Tk 9 by @native-api in https://github.com/pyenv/pyenv/pull/3343
* Add CPython 3.13.9 by @nedbat in https://github.com/pyenv/pyenv/pull/3346
* Add CPython 3.15.0a1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3347
## Release v2.6.10
* Add CPython 3.12.12, 3.11.14, 3.10.19, 3.9.24 by @nedbat in https://github.com/pyenv/pyenv/pull/3344
## Release v2.6.9
* CI: modified-scripts-build: fix CPython-specific jobs never firing by @tuzi3040 in https://github.com/pyenv/pyenv/pull/3338
* CI: modified-scripts-build: fix output variable for CPython-specific workflows by @native-api in https://github.com/pyenv/pyenv/pull/3340
* Add CPython 3.14.0 by @SnoopJ in https://github.com/pyenv/pyenv/pull/3339
* Add CPython 3.13.8 by @jsirois in https://github.com/pyenv/pyenv/pull/3341
## Release v2.6.8
* Use Zlib from XCode SDK in a way compatible with XCode 16 and CLT by @JarheadStever in https://github.com/pyenv/pyenv/pull/3301
* Add miniforge 25.3.0-1, 25.3.0-2, 25.3.0-3, 25.3.1-0, skip miniforge 25.3.0-0 by @native-api in https://github.com/pyenv/pyenv/pull/3306
* Fix Readline and OpenSSL detection for MacPorts without the corresponding package by @native-api in https://github.com/pyenv/pyenv/pull/3317
* Bump actions/checkout from 4 to 5 in the github-actions group by @dependabot[bot] in https://github.com/pyenv/pyenv/pull/3318
* Fix rehash hook for pipx/pipx.x/pipx.xx by @rockandska in https://github.com/pyenv/pyenv/pull/3320
* Add miniconda 25.7.0-2 by @native-api in https://github.com/pyenv/pyenv/pull/3323
* Support curl from a snap by @native-api in https://github.com/pyenv/pyenv/pull/3329
* CI: Bats test suite in docker by @rockandska in https://github.com/pyenv/pyenv/pull/3324
* Add GraalPy 25.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/3331
* Upgrade pip detetcion in pip-rehash to accept multiple variations by @rockandska in https://github.com/pyenv/pyenv/pull/3330
* Add CPython 3.14.0rc3 by @nedbat in https://github.com/pyenv/pyenv/pull/3333
* Use TCLTK_* and pkg-config for 3.11+ linking with Homebrew Tcl/Tk; add PYTHON_BUILD_TCLTK_FORMULA envvar by @native-api in https://github.com/pyenv/pyenv/pull/3327
## Release v2.6.7
* Skip Zlib from XCode for XCode 16+ by @native-api in https://github.com/pyenv/pyenv/pull/3298
* Don't fail the build if `xcodebuild` fails by @native-api in https://github.com/pyenv/pyenv/pull/3302
* Add CPython 3.14.0rc2 and 3.13.7 by @nedbat in https://github.com/pyenv/pyenv/pull/3303
## Release v2.6.6
* Add anaconda3-2025.06-0, anaconda3-2025.06-1, miniconda3-25.3.1-1, miniconda3-25.5.1-0, miniconda3-25.5.1-1 by @native-api in https://github.com/pyenv/pyenv/pull/3295
* Add CPython 3.13.6 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/3297
## Release v2.6.5
* Bump OpenSSL to 3.5.1 in the latest releases and branch tips in CPython 3.12 - 3.15 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3287
* Add Jython 2.7.4 by @cesarcoatl in https://github.com/pyenv/pyenv/pull/3290
* Add CPython 3.14.0rc1 by @nedbat in https://github.com/pyenv/pyenv/pull/3293
* Add GraalPy 24.2.2 by @msimacek in https://github.com/pyenv/pyenv/pull/3291
## Release v2.6.4
* Backport bpo_36106 to 3.5.10 and 3.6.15 by @native-api in https://github.com/pyenv/pyenv/pull/3280
* (regression) Use Zlib from XCode SDK in MacOS without Homebrew or Macports by @native-api in https://github.com/pyenv/pyenv/pull/3282
* Add PyPy v7.3.20 by @jsirois in https://github.com/pyenv/pyenv/pull/3284
* Add CPython 3.14.0b4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/3285
## Release v2.6.3
* README: Re-promote "Python versions with extended support" to a section by @native-api in https://github.com/pyenv/pyenv/pull/3276
* Support linking to MacPorts ports installed from binary archives by @0916dhkim in https://github.com/pyenv/pyenv/pull/3272
* Add CPython 3.14.0b3 by @nedbat in https://github.com/pyenv/pyenv/pull/3278
## Release v2.6.2
* Add CPython 3.13.5 by @nedbat in https://github.com/pyenv/pyenv/pull/3269
## Release v2.6.1
* Add CPython 3.9.23, 3.10.18, 3.11.13, 3.12.11, 3.13.4 by @nedbat in https://github.com/pyenv/pyenv/pull/3266
## Release v2.6.0
* python-build: Support patch paths with spaces/special characters by @native-api in https://github.com/pyenv/pyenv/pull/3251
* Add CODEOWNERS file by @native-api in https://github.com/pyenv/pyenv/pull/3247
* README: make fish PATH add conditional on the directory existing by @BooleanCat in https://github.com/pyenv/pyenv/pull/2786
* Add --bare option to `pyenv version` by @jjwatt in https://github.com/pyenv/pyenv/pull/2783
* README: Add shell setup instructions for nushell by @jordanst3wart in https://github.com/pyenv/pyenv/pull/2916
* Add MacPorts support for python-build by @studnitskiy in https://github.com/pyenv/pyenv/pull/3186
* python-build: fix `has_broken_mac_readline` when Readline is explicitly configured by @fofoni in https://github.com/pyenv/pyenv/pull/3254
* Add CPython 3.14.0b2 by @nedbat in https://github.com/pyenv/pyenv/pull/3259
## 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
* [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
* 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
* 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
* 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
* 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
* 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 - <shell>` 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
* 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
* 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
## 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
## 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
## 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
* 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
## 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
## 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
## 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
* 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/
## 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
## 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
## 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
* 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
* Document default build configuration customizations by @native-api in https://github.com/pyenv/pyenv/pull/2911
* Use Homebrew in Linux if Pyenv is installed 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
* 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
* 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
## 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
* 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
* 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
## 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
* 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
* 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
* 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
* fix a typo in README.md by @xzmeng in https://github.com/pyenv/pyenv/pull/2769
* use -I with ensurepip by @xaocon in https://github.com/pyenv/pyenv/pull/2764
* Add CPython 3.12.0rc2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2778
## Release v2.3.25
* Add CPython 3.8.18, 3.9.18, 3.10.13, 3.11.5 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2763
## Release v2.3.24
* README update: Added UNIX reference near Automatic installer by @VictorieeMan in https://github.com/pyenv/pyenv/pull/2744
* Fix FreeBSD tests in MacOS CI by @native-api in https://github.com/pyenv/pyenv/pull/2748
* Add CPython 3.12.0rc1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2752
* [Add an updated Anaconda and Miniconda installers](https://github.com/pyenv/pyenv/commit/db871427c7a232e18ee7a6dc0182989a646ccca9)
## Release v2.3.23
* Add CPython 3.12.0b4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2741
* Add new anaconda and miniconda definitions by @aphedges in https://github.com/pyenv/pyenv/pull/2742
## Release v2.3.22
* Add CPython 3.12.0b3 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2730
* Add Cinder 3.10 and Cinder configure patches by @filips123 in https://github.com/pyenv/pyenv/pull/2739
## Release v2.3.21
* Add graalpy-23.0.0 by @msimacek in https://github.com/pyenv/pyenv/pull/2724
* Add PyPy 7.3.12 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2726
* Fix occasional 'libexec/pyenv-latest: line 39: printf: write error: Broken pipe' by @native-api in https://github.com/pyenv/pyenv/pull/2729
## Release v2.3.20
* Backport bpo-42351 to 3.5.10 by @native-api in https://github.com/pyenv/pyenv/pull/2717
* Add missing patches for Python 3.7/3.8/3.9 by @tomkins in https://github.com/pyenv/pyenv/pull/2718
## Release v2.3.19
* Add CPython 3.7.17, 3.8.17 and 3.9.17 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2711
* Add CPython 3.11.4 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2715
* Add CPython 3.10.12 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2714
* Add CPython 3.12.0b2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2713
## Release 2.3.18
* Fix not showing symlink contents for unselected versions in `pyenv versions` by @native-api in https://github.com/pyenv/pyenv/pull/2675
* Correct link in has_tar_xz_support else branch of 3.10.11 and 3.11.3 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2677
* Fix #2682: Correct pyenv_user_setup.bash file by @tomschr in https://github.com/pyenv/pyenv/pull/2687
* fix: updating heredoc delimiter to be random and unique by @aviadhahami in https://github.com/pyenv/pyenv/pull/2691
* Support ksh alternative names by @kpschoedel in https://github.com/pyenv/pyenv/pull/2697
* Add CPython 3.12.0b1 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2701
* Update 3.12-dev and add 3.13-dev by @t0b3 in https://github.com/pyenv/pyenv/pull/2703
## Release 2.3.17
* Try locate `readlink` first in pyenv-hooks, fix #2654 by @Harry-Chen in https://github.com/pyenv/pyenv/pull/2655
* Add CPython 3.12.0a7 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2668
* Add CPython 3.11.3 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2671
* Add CPython 3.10.11 by @mirekdlugosz in https://github.com/pyenv/pyenv/pull/2670
## Release 2.3.16
* Add Miniforge3-22.11.1-4 by @jlec in https://github.com/pyenv/pyenv/pull/2642
* Add Anaconda3-2023.03 by @anton-petrov in https://github.com/pyenv/pyenv/pull/2648
## Release 2.3.15
* Add miniconda 23.1.0-1 by @aphedges in https://github.com/pyenv/pyenv/pull/2635
* Add CPython 3.12.0a6 by @saaketp in https://github.com/pyenv/pyenv/pull/2638
## Release 2.3.14
* Fix indentation by @rafrafek in https://github.com/pyenv/pyenv/pull/2620
* Support for "BusyBox version" of "head" by @schuellerf in https://github.com/pyenv/pyenv/pull/2629
* bpo-27987 for v3.5.10 and v3.6.15: align by 16bytes on 64bit platforms by @chaimleib in https://github.com/pyenv/pyenv/pull/2630
* bpo-36231 for v3.5.10: fix Unsupported MacOS X CPU type in ffi.h by @chaimleib in https://github.com/pyenv/pyenv/pull/2633
* README: clarify behavior of `pyenv latest` by @mrienstra in https://github.com/pyenv/pyenv/pull/2634
## Release 2.3.13
* Fix pyenv-latest to ignore virtualenvs by @native-api in https://github.com/pyenv/pyenv/pull/2608
* Show symlink contents in non-bare `pyenv versions' by @native-api in https://github.com/pyenv/pyenv/pull/2609
* Ignore virtualenvs in `pyenv latest' in a clean way by @native-api in https://github.com/pyenv/pyenv/pull/2610
* Fix link resolving in pyenv-versions by @laggardkernel in https://github.com/pyenv/pyenv/pull/2612
* Add CPython 3.11.2 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2615
* Add CPython 3.10.10 by @edgarrmondragon in https://github.com/pyenv/pyenv/pull/2616
* Add CPython 3.12.0a5 by @Afront in https://github.com/pyenv/pyenv/pull/2614
## Release 2.3.12
* Undefined name: do not forget self when accessing flavor by @cclauss in https://github.com/pyenv/pyenv/pull/2595
* Fix wrong libpython being linked to in MacOS by @native-api in https://github.com/pyenv/pyenv/pull/2596
* Fix `:latest` by @native-api in https://github.com/pyenv/pyenv/pull/2599
* Fix `pyenv which` to support auto-resolved prefixes by @native-api in https://github.com/pyenv/pyenv/pull/2601
* Add more recent build of nogil Python. by @colesbury in https://github.com/pyenv/pyenv/pull/2602
## Release 2.3.11
* Add CPython 3.12.0a4 by @Afront in https://github.com/pyenv/pyenv/pull/2590
* Add a script to add the latest miniforge and mambaforge versions by @smcgivern in https://github.com/pyenv/pyenv/pull/2560
* Add missing Miniforge/Mambaforge versions (4.10.2-0 - 22.9.0-3) by @smcgivern in https://github.com/pyenv/pyenv/pull/2591
* Fix using dependencies from Ports in FreeBSD that are not searched with pkg-config by @native-api in https://github.com/pyenv/pyenv/pull/2593
* Fix priority for user-supplied configure and make flags by (**_only set --enable-shared if user hasn't supplied --disable-shared_**) @native-api in https://github.com/pyenv/pyenv/pull/2592
* Fix a compilation error in 3.8.10+ and 3.9.5+ when linking against Op… by @native-api in https://github.com/pyenv/pyenv/pull/2594
## Release 2.3.10
* Remove stray newline after python-build installation by @tklauser in https://github.com/pyenv/pyenv/pull/2566
* Allow multiple versions for pyenv-install by @rockandska in https://github.com/pyenv/pyenv/pull/2568
* --enable-shared by default by @anton-petrov in https://github.com/pyenv/pyenv/pull/2554
* Fix non-bash output while detecting shell by @ianchen-tw in https://github.com/pyenv/pyenv/pull/2561
* add pypy 7.3.11 release by @dand-oss in https://github.com/pyenv/pyenv/pull/2576
* Mention how to build for maximum performance by @hauntsaninja in https://github.com/pyenv/pyenv/pull/2579
* Add miniconda 22.11.1-1 by @aphedges in https://github.com/pyenv/pyenv/pull/2583
* Add Fig as autocomplete suggestion by @brendanfalk in https://github.com/pyenv/pyenv/pull/2574
* Fix using dependencies from Ports in BSD with no pkg-config by @native-api in https://github.com/pyenv/pyenv/pull/2586
## Release 2.3.9
* Add -latest suffix to miniforge3 by @nwh in https://github.com/pyenv/pyenv/pull/2551
* Add PyPy 7.3.10 by @dand-oss in https://github.com/pyenv/pyenv/pull/2553
* Add miniforge3 and mambaforge 22.9.0-2 by @smcgivern in https://github.com/pyenv/pyenv/pull/2559
* Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.16 by @lisbethw1130 in https://github.com/pyenv/pyenv/pull/2558
* Add `openssl` patches for 3.7.15, 3.7.16, and 3.8.16 by @samdoran in https://github.com/pyenv/pyenv/pull/2564
* Add support for Anaconda3-2022.10 by @huypn12 in https://github.com/pyenv/pyenv/pull/2565
## Release 2.3.8
* Export detected shell environment in pyenv-init by @ianchen-tw in https://github.com/pyenv/pyenv/pull/2540
* Add CPython 3.12.0a3 by @saaketp in https://github.com/pyenv/pyenv/pull/2545
* Add CPython 3.11.1 by @anton-petrov in https://github.com/pyenv/pyenv/pull/2549
* Add CPython 3.10.9 by @rudisimo in https://github.com/pyenv/pyenv/pull/2544
* Add 3.7.16, 3.8.16, 3.9.16 by @chadac in https://github.com/pyenv/pyenv/pull/2550
## Release 2.3.7
* Add Python version 3.11 to the macOS build by @jbkkd in https://github.com/pyenv/pyenv/pull/2510
* Don't use Zlib from XCode SDK if a custom compiler is used by @native-api in https://github.com/pyenv/pyenv/pull/2516
* Change line endings from CRLF to LF by @hoang-himself in https://github.com/pyenv/pyenv/pull/2517
* Fix resolution of a name that's a prefix of another name by @native-api in https://github.com/pyenv/pyenv/pull/2521
* GitHub Workflows security hardening by @sashashura in https://github.com/pyenv/pyenv/pull/2511
* Add nushell to activate list by @theref in https://github.com/pyenv/pyenv/pull/2524
* Fix compilation error when building OpenSSL 1.1.1q in MacOS 11+ for 3.9.15 and 3.8.15 by @twangboy in https://github.com/pyenv/pyenv/pull/2520
* Add simple `.editorconfig` file by @aphedges in https://github.com/pyenv/pyenv/pull/2518
* Support `aria2c` being a snap by @native-api in https://github.com/pyenv/pyenv/pull/2528
* Add CPython 3.12.0a2 by @saaketp in https://github.com/pyenv/pyenv/pull/2527
* Add --no-push-path option by @isaacl in https://github.com/pyenv/pyenv/pull/2526
* Fix typo in README.md by @weensy in https://github.com/pyenv/pyenv/pull/2535
* Copy auto installer oneliner to readme by @spookyuser in https://github.com/pyenv/pyenv/pull/2538
## Release 2.3.6
* Add CPython 3.10.8 (#2480)
* Add CPython 3.7.15, 3.8.15, and 3.9.15 (#2482)
* Add CPython 3.11.0 (#2493)
* Add CPython 3.12.0a1 (#2495)
* Add graalpy-22.3.0 (#2497)
* Auto-resolve prefixes to the latest version (#2487)
* It must be a full prefix -- the actual searched prefix is `<prefix>[-.]`
* Other flavors are likely sorted incorrectly atm
* Prereleases and versions with some suffixes (`-dev`, `-src`, `-latest`) are not searched
* `pyenv uninstall` has been excluded from the resolution feature: deleting a dynamically selected installation could be problematic
* Fix OpenSSL 1.1.1q compilation error in MacOS 11+ (#2500)
* Link to Tcl/Tk from Homebrew via pkgconfig for 3.11+ (#2501)
* Fix syntax error in `pyenv init -` if PYENV_ROOT has spaces (#2506)
## Release 2.3.5
* Add CPython 3.10.7 (#2454)
* Docs: update Fish PATH update (#2449)
* Add CPython 3.7.14, 3.8.14 and 3.9.14 (#2456)
* Update miniconda3-3.9-4.12.0 (#2460)
* Add CPython 3.11.0rc2 (#2459)
* Add patches for 3.7.14 to support Apple Silicon (#2463)
* Add ability to skip all use of Homebrew (#2464)
* Drop Travis integration (#2468)
* Build CPython 3.12+ with --with-dsymutil in MacOS (#2471)
* Add Pyston 2.3.5 (#2476)
## Release 2.3.4
* Add CPython 3.11.0rc1 (#2434)
* Add support for multiple versions in `pyenv uninstall` (#2432)
* Add micropython 1.18 and 1.19.1 (#2443)
* CI: support Micropython, deleted scripts; build with -v (#2447)
* Re-allow paths in .python-version while still preventing CVE-2022-35861 (#2442)
* CI: Bump OS versions (#2448)
* Add Cinder 3.8 (#2433)
## Release 2.3.3
* Use version sort in `pyenv versions` (#2405)
* Add CPython 3.11.0b4 (#2411)
* Python-build: Replace deprecated git protocol use with https in docs (#2413)
* Fix relative path traversal due to using version string in path (#2412)
* Allow pypy2 and pypy3 patching (#2421, #2419)
* Add CPython 3.11.0b5 (#2420)
* Add GraalPython 22.2.0 (#2425)
* Add CPython 3.10.6 (#2428)
## Release 2.3.2
* Add CPython 3.11.0b2 (#2380)
* Honor CFLAGS_EXTRA for MicroPython #2006 (#2007)
* Add post-install checks for curses, ctypes, lzma, and tkinter (#2353)
* Add CPython 3.11.0b3 (#2382)
* Add flags for Homebrew into `python-config --ldflags` (#2384)
* Add CPython 3.10.5 (#2386)
* Add Anaconda 2019.10, 2021.04, 2022.05; support Anaconda in add_miniconda.py (#2385)
* Add Pyston-2.3.4 (#2390)
* Update anaconda3-2022.05 MacOSX arm64 md5 (#2391)
## Release 2.3.1
* Version file read improvements (#2269)
* Add CPython 3.11.0b1 (#2358)
* Update 3.11-dev and add 3.12-dev (#2361)
* Add CPython 3.9.13 (#2372)
* Add miniconda 4.12.0 (#2371)
* Fix endless loop in `pyenv init -` under SSH in some shell setups (#2374)
* CI: Add tests for modified Python build scripts (#2286)
## Release 2.3.0
* Bump openssl 1.1 to 1.1.1n for CPython 3.7 3.8 3.9 (#2276)
* Doc Fix: Escape a hash character causing unwanted GitHub Issue linking (#2282)
* Add CPython 3.9.12 (#2296)
* Add CPython 3.10.4 (#2295)
* Add patch for 3.6.15 to support Xcode 13.3 (#2288)
* Add patch for 3.7.12 to support Xcode 13.3 (#2292)
* Add CONTRIBUTING.md (#2287)
* Add PyPy 7.3.9 release 2022-03-30 (#2308)
* Add Pyston 2.3.3 (#2316)
* Add CPython 3.11.0a7 (#2315)
* Add "nogil" Python v3.9.10 (#2342)
* Support XCode 13.3 in all releases that officially support MacOS 11 (#2344)
* Add GraalPython 22.1.0 (#2346)
* Make PYENV_DEBUG imply -v for `pyenv install` (#2347)
* Simplify init scheme (#2310)
* Don't use Homebrew outside of MacOS (#2349)
* Add `:latest` syntax to documentation for the `install` command (#2351)
## Release 2.2.5
* Add CPython 3.10.3
* Add CPython 3.9.11
* Add CPython 3.8.13
* Add CPython 3.7.13
* Add CPython 3.11.0a6 (#2266)
* Add PyPy 7.3.8 (#2253)
* Add miniconda3-3.7-4.11.0, miniconda3-3.8-4.11.0, miniconda3-3.9-4.11.0 (#2268)
* Add pyston-2.3.2 (#2240)
* Fix UnicodeDecodeError for CPython 3.6.15 and 3.7.12 (#2237)
* python-build: add URL for get-pip for Python 3.6 (#2238)
* Bump openssl to 1.1.1n for CPython 3.10.x
## Release 2.2.4
* Added docstrings to several undocumented functions (#2197)
* Fix incorrect pypy 2.7-7.3.6 sha256 hashes (#2208)
* Fix a regression in include paths when compiling ctypes in 3.6.15/3.7.12 (#2209)
* Revert "Disable coreutils on M1 Apple Silicon with arm64 (#2020)" (#2212)
* CPython 3.11.0a4 (#2217)
* CPython 3.9.10 and 3.10.2 (#2219)
* miniconda3-latest: added Linux-aarch64 (#2221)
* Add GraalPython 22.0.0 (#2226)
## Release 2.2.3
* Add new pypy versions (pypy2.7-7.3.2~7.3.5) to the version list (#2194)
* Fix Python 3.7.12 compilation on macOS arm64/M1. (#2190)
* Fix Python 3.6.15 compilation on macOS arm64/M1. (#2189)
* Add Anaconda3-2021.11 (#2193)
* CPython 3.11.0a3 (#2187)
* Fix errant "echo" in README install instructions (#2185)
* Add Miniforge and Mambaforge 4.10.3-10 (#2184)
* Add CPython 3.10.1 (#2183)
* Fix 3.6.15 build on macOS (#2182)
## Release 2.2.2
* Add support for macOS Apple M1 (#2164)
## Release 2.2.1
* Add CPython 3.9.9 (#2162)
* Add CPython 3.9.8 (#2152)
* Add Add micropython 1.17 (#2158)
* Add Add micropython 1.16 (#2158)
* Patch 3.10.0 configure, fixes https://bugs.python.org/issue45350 (#2155)
* Use command and type instead of which (#2144)
* Add definition of pyenv help in COMMANDS.md #2139
* Use OpenSSL 1.0 for CPython 2.7.18
## Release 2.2.0
* Adding PyPy release 7.3.7 (Python 3.7 and 3.8). (#2132)
* Append Homebrew custom prefix to search path (#1957)
* Add documentation for init command (#2125)
* Add setup instructions for the case when one installs Pyenv as part of a batch job (#2127)
* Add documentation for completions command (#2126)
* Default --with-universal-archs to universal2 on Apple Silicon (#2122)
* Update README.md (#2120)
* Add GraalPython 21.3.0 (#2117)
* Pypy ver 7.3.6 - python 3.7 and python 3.8 (#2111)
* Discover Tcl/Tk reliably and use active version (#2106)
* Fish installation instructions (#2104)
* Add CPython 3.11.0a1 (#2099)
## Release 2.1.0
* Fix mambaforge-pypy3 build (#2096)
* Add Python 3.10.0 (#2093)
* Add documentation for exec command (#2090)
* Add documentation for shims command (#2091)
* Add documentation for hooks command (#2089)
* Add documentation for root command (#2088)
* Add documentation for prefix command (#2087)
* Update to Pyston's v2 package of the 2.3.1 release (#2078)
* Add pyston-2.3.1 support (#2075)
* Don't update conda when installing pip (#2074)
* Improve `add_miniconda.py` (#2072)
* GitHub actions tests (#2073)
* Fix sed commands (#2071)
* macOS: fix the build of Python 2.7.18 on macOS 11.5.2 (Big Sur) + Apple Silicon (#2061)
## Release 2.0.7
* Update setup instructions in the Readme (#2067)
* Allow tcl-tk as argument or try with homebrew by default (#1646)
* Allow system Python in sbin (#2065)
* Prevent addition of duplicate plugin dirs to PATH (#2045)
* Disable coreutils on M1 Apple Silicon with arm64 (#2020)
* Add Python 3.10.0rc2 (#2053)
* Add space after `yes/no` prompt (#2040)
* Add CPython v3.6.15 and v3.7.12 (#2052)
* Add missing Python 2.6.x definitions and patches (#2051)
* Fix build of ossaudiodev in Linux/FreeBSD for Python 2.6 (#2049)
* Fix build of ossaudiodev in Linux/FreeBSD for Python 3.1 (#2047)
## Release 2.0.6
* Add CPython 3.9.7 (#2044)
* Add CPython v3.8.12 (#2043)
* Adapt conda.bash for bash associative array (#2037)
## Release 2.0.5
* Move man page to location where it can be automatically found by man (#2032)
* Update checksums for CPython 3.10.0rc1 (#2025)
* Remove 3.9.3 (#2022)
* Add CPython 3.10.0rc1(#2023)
## Release 2.0.4
- Added scripts for rolling releases of Miniforge (#2019)
- Update pyston-2.3 (#2017)
- Add GraalPython 21.2.0 (#2018)
- Add CPython 3.10.0b4 (#2013), (#2005)
- Add Pyston 2.3 (#2012)
## Release 2.0.3
* Remove PATH warning (#2001)
* Add Python 3.6.14, 3.7.11, 3.8.11, and 3.9.6 (#1996)
* Miniforge minor update to 4.10.1-5 (#1992)
* Suggest that fish users init in interactive mode (#1991)
## Release 2.0.2
* Miniforge minor update to 4.10.1-5 (#1992)
* Suggest that fish users init in interactive mode (#1991)
* Add 3.10.0b3 (#1988)
* Revert "Drop inferring version to install from `pyenv local`" (#1984)
* Use system Python3 for tests (#1979)
* Check for shims in path with pure Bash (#1978)
* Update setup instructions for debian, ubuntu etc. (#1977)
## Release 2.0.1
* Drop inferring version to install from `pyenv local` (#1907)
* Create mambaforge-4.10.1-4 (#1971)
* Add 3.10.0b2 recipe (#1966)
* Fix .bashrc `echo` install syntax error (#1965)
* Add explicit Zsh instructions for MacOS (#1964)
* Install pip with pyston (#1955)
* Mention log file if an error happened before building, too (#1537)
* Add pypy3.7-7.3.5 (#1950)
## Release 2.0.0
@ -669,7 +1553,7 @@
* pyenv: Prefer gawk over awk if both are available.
* python-build: Add new PyPy release; pypy-2.3, pypy-2.3-src (#162)
* python-build: Add new Anaconda release; anaconda-1.9.2 (#155)
* python-build: Add new Miniconda releases; miniconda-3.3.0, minoconda-3.4.2, miniconda3-3.3.0, miniconda3-3.4.2
* python-build: Add new Miniconda releases; miniconda-3.3.0, miniconda-3.4.2, miniconda3-3.3.0, miniconda3-3.4.2
* python-build: Add new Stackless releases; stackless-2.7.3, stackless-2.7.4, stackless-2.7.5, stackless-2.7.6, stackless-3.2.5, stackless-3.3.5 (#164)
* python-build: Add IronPython versions (setuptools and pip will work); ironpython-2.7.4, ironpython-dev
* python-build: Add new Jython beta release; jython-2.7-beta2

View file

@ -5,6 +5,7 @@ first argument.
The most common subcommands are:
* [`pyenv help`](#pyenv-help)
* [`pyenv commands`](#pyenv-commands)
* [`pyenv local`](#pyenv-local)
* [`pyenv global`](#pyenv-global)
@ -16,6 +17,18 @@ The most common subcommands are:
* [`pyenv versions`](#pyenv-versions)
* [`pyenv which`](#pyenv-which)
* [`pyenv whence`](#pyenv-whence)
* [`pyenv exec`](#pyenv-exec)
* [`pyenv root`](#pyenv-root)
* [`pyenv prefix`](#pyenv-prefix)
* [`pyenv latest`](#pyenv-latest)
* [`pyenv hooks`](#pyenv-hooks)
* [`pyenv shims`](#pyenv-shims)
* [`pyenv init`](#pyenv-init)
* [`pyenv completions`](#pyenv-completions)
## `pyenv help`
List all available pyenv commands along with a brief description of what they do. Run `pyenv help <command>` for information on a specific command. For full documentation, see: https://github.com/pyenv/pyenv#readme
## `pyenv commands`
@ -27,9 +40,8 @@ Lists all available pyenv commands.
Sets a local application-specific Python version by writing the version
name to a `.python-version` file in the current directory. This version
overrides the global version, and can be overridden itself by setting
the `PYENV_VERSION` environment variable or with the `pyenv shell`
command.
overrides the [global version](#pyenv-global), and can be overridden
itself with the [`pyenv shell`](#pyenv-shell) command.
$ pyenv local 2.7.6
@ -78,12 +90,15 @@ 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
the version name to the `~/.pyenv/version` file. This version can be
overridden by an application-specific `.python-version` file, or by
setting the `PYENV_VERSION` environment variable.
the version name to the `$PYENV_ROOT/version` file. This version can be
overridden with [`pyenv local`](#pyenv-local) or [`pyenv shell`](#pyenv-shell).
$ pyenv global 2.7.6
@ -187,8 +202,8 @@ or, if you prefer 3.3.3 over 2.7.6,
Install a Python version (using [`python-build`](https://github.com/pyenv/pyenv/tree/master/plugins/python-build)).
Usage: pyenv install [-f] [-kvp] <version>
pyenv install [-f] [-kvp] <definition-file>
Usage: pyenv install [-f] [-kvp] <version>[:<alias>]
pyenv install [-f] [-kvp] <definition-file>[:<alias>]
pyenv install -l|--list
-l/--list List all available versions
@ -216,11 +231,23 @@ Then install the desired versions:
2.6.8
* 2.7.6 (set by /home/yyuu/.pyenv/version)
You can also install the latest version of Python in a specific version line by supplying a prefix instead of a complete name:
$ pyenv install 3.10
$ pyenv install 3
See the [`pyenv latest` documentation](#pyenv-latest) for details on prefix resolution.
An older option is to use the `:latest` syntax. For example, to install the latest patch version for Python 3.8 you could do:
pyenv install 3.8:latest
## `pyenv uninstall`
Uninstall a specific Python version.
Uninstall Python versions.
Usage: pyenv uninstall [-f|--force] <version>
Usage: pyenv uninstall [-f|--force] <version> ...
-f Attempt to remove the specified version without prompting
for confirmation. If the version does not exist, do not
@ -241,8 +268,15 @@ version of Python, or install a package that provides binaries.
Displays the currently active Python version, along with information on
how it was set.
Usage: pyenv version [--bare]
--bare show just the version name. An alias to `pyenv version-name'
$ pyenv version
2.7.6 (set by /home/yyuu/.pyenv/version)
$ pyenv version --bare
2.7.6
## `pyenv versions`
@ -278,3 +312,100 @@ Lists all Python versions with the given command installed.
2.6.8
2.7.6
3.3.3
## `pyenv exec`
Usage: pyenv exec <command> [arg1 arg2...]
Runs an executable by first preparing PATH so that the selected Python
version's `bin` directory is at the front.
For example, if the currently selected Python version is 3.9.7:
pyenv exec pip install -r requirements.txt
is equivalent to:
PATH="$PYENV_ROOT/versions/3.9.7/bin:$PATH" pip install -r requirements.txt
## `pyenv root`
Displays the root directory where versions and shims are kept.
$ pyenv root
/home/user/.pyenv
## `pyenv prefix`
Displays the directories where the given Python versions are installed,
separated by colons. If no version is given, `pyenv prefix` displays the
locations of the currently selected versions.
$ pyenv prefix 3.9.7
/home/user/.pyenv/versions/3.9.7
## `pyenv latest`
Displays the latest installed or known version with the given prefix
Usage: pyenv latest [-k|--known] <prefix>
-k/--known Select from all known versions instead of installed
Only full prefixes are searched: in the actual name, the given prefix must be followed by a dot or a dash.
Prereleases and versions with specific suffixes (e.g. `-src`) are ignored.
## `pyenv hooks`
Lists installed hook scripts for a given pyenv command.
Usage: pyenv hooks <command>
## `pyenv shims`
List existing pyenv shims.
Usage: pyenv shims [--short]
$ pyenv shims
/home/user/.pyenv/shims/2to3
/home/user/.pyenv/shims/2to3-3.9
/home/user/.pyenv/shims/idle
/home/user/.pyenv/shims/idle3
/home/user/.pyenv/shims/idle3.9
/home/user/.pyenv/shims/pip
/home/user/.pyenv/shims/pip3
/home/user/.pyenv/shims/pip3.9
/home/user/.pyenv/shims/pydoc
/home/user/.pyenv/shims/pydoc3
/home/user/.pyenv/shims/pydoc3.9
/home/user/.pyenv/shims/python
/home/user/.pyenv/shims/python3
/home/user/.pyenv/shims/python3.9
/home/user/.pyenv/shims/python3.9-config
/home/user/.pyenv/shims/python3.9-gdb.py
/home/user/.pyenv/shims/python3-config
/home/user/.pyenv/shims/python-config
## `pyenv init`
Configure the shell environment for pyenv
Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--no-rehash] [<shell>])"
pyenv init --install [<shell>]
pyenv init --detect-shell [<shell>]
- Initialize shims directory, print PYENV_SHELL variable, completions path
and shell function
--path Print shims path
--install Configure detected shell startup files
--no-push-path Do not push shim to the start of PATH if they're already there
--detect-shell Print shell startup files detected for the current shell
--no-rehash Add no rehash command to output
## `pyenv completions`
Lists available completions for a given pyenv command.
Usage: pyenv completions <command> [arg1 arg2...]

103
CONTRIBUTING.md Normal file
View file

@ -0,0 +1,103 @@
General guidance
================
* The usual principles of respecting existing conventions and making sure that your changes
are in line with the overall product design apply when contributing code to Pyenv.
* We are limited to Bash 3.2 features
That's because that's the version shipped with MacOS.
(They didn't upgrade past it and switched to Zsh because later versions
are covered by GPLv3 which has additional restrictions unacceptable for Apple.)
You can still add performance optimizations etc that take advantage of newer Bash features
as long as there is a fallback execution route for Bash 3.
Formatting PRs
==============
We strive to keep commit history one-concern-per-commit to keep it meaningful and easy to follow.
If a pull request (PR) addresses a single concern (the typical case), we usually squash commits
from it together when merging so its commit history doesn't matter.
If however a PR addresses multiple separate concerns, each of them should be presented as a separate commit.
Adding multiple new Python releases of the same flavor is okay with either a single or multiple commits.
Authoring installation scripts
==============================
Adding new Python release support
---------------------------------
The easiest way to add support for a new Python release is to copy the script from the previous one
and adjust it as necessary. In many cases, just changing version numbers, URLs and hashes is enough.
Do pay attention to other "magic numbers" that may be present in a script --
e.g. the set of architectures and OS versions supported by a release -- since those change from time to time, too.
Make sure to also copy any patches for the previous release that still apply to the new one.
Typically, a patch no longer applies if it addresses a problem that's already fixed in the new release.
For prereleases, we only create an entry for the latest prerelease in a specific version line.
When submitting a newer prerelease, replace the older one.
Adding version-specific fixes/patches
-------------------------------------
We accept fixes to issues in specific Python releases that prevent users from using them with Pyenv.
In the default configuration for a Python release, we strive to provide as close to vanilla experience as practical,
to maintain [the principle of the least surprise](https://en.wikipedia.org/wiki/Principle_of_least_astonishment).
As such, any such fixes:
* Must not break or degrade (e.g. disable features) the build in any of the environments that the release officially supports
* Must not introduce incompatibilities with the vanilla release (including binary incompatibilities)
* Should not patch things unnecessarily, to minimize the risk of the aforementioned undesirable side effects.
* E.g. if the fix is for a specific environment, its logic ought to only fire in this specific environment and not touch execution paths for other environments.
* As such, it's advisable to briefly explain in the PR what each added patch does and why it is necessary to fix the declared problem
Generally, version-specific fixes belong in the scripts for the affected releases and/or patches for them -- this guarantees that their effect is limited to only those releases.
<h3>Backporting upstream patches</h3>
Usually, this is the easiest way to backport a fix for a problem that is fixed in a newer release.
* Clone Python, check out the tag for the appropriate release and create a branch
* Apply existing patches if there are any (with either `patch` or `git am`) and commit
* Cherry-pick the upstream commit that fixes the problem in a newer release
* Commit and `git format-patch`
* Commit the generated patch file into Pyenv, test your changes and submit a PR
Deprecation policy
------------------
We do not provide official support for EOL releases and environments or otherwise provide any kind of extended support for old Python releases.
We do however accept fixes from interested parties that would allow running older, including EOL, releases in environments that they do not officially support.
In addition to the above requirements for release-specific fixes,
* Such a fix must not add maintenance burden (e.g. add new logic to `python-build` that has to be kept there indefinitely)
* Unless the added logic is useful for both EOL and non-EOL releases. In this case, it will be considered as being primarily an improvement for non-EOL releases.
* Support is provided on a "best effort" basis: we do not actively maintain these fixes but won't actively break them, either, and will accept any corrections.
Since old releases never change, it's pretty safe to assume that the fixes will continue to work until a later version
of an environment introduces further incompatible changes.
Advanced changes / adding new Python flavor support
---------------------------------------------------
An installation script is sourced from `python-build`. All installation scripts are based on the same logic:
1. Select the source to download and other variable parameters as needed.
This includes showing an error if the user's environment (OS, architecture) is not supported by the release.
Binary releases that only officially support specific distro(s) typically show a warning in other distros instead.
2. Run one of the `install_*` shell functions
`install_*` shell functions defined in `python-build` install Python from different kinds of sources -- compressed package (binary or source), upstream installation script, VCS checkout. Pick one that's the most appropriate for your packaging.
Each of them accepts a couple of function-specific arguments which are followed by arguments that constitute the build sequence. Each `<argument>` in the build sequence corresponds to the `install_*_<argument>` function in `python-build`. Check what's available and add any functions with logic specific to your flavor if needed.
We strive to keep out of `python-build` parts of build logic that are release-specific and/or tend to change abruptly between releases -- e.g. sets of supported architectures and other software's versions. This results in logic duplication between installation scripts -- but since old releases never change once released, this doesn't really add to the maintenance burden. As a rule of thumb, `python-build` can host parts of logic that are expected to stay the same for an indefinite amount of time -- for an entire Python flavor or release line.

View file

@ -1,35 +0,0 @@
FROM ubuntu:18.04
LABEL maintainer="Chris L. Barnes <chrislloydbarnes@gmail.com>"
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update -y \
&& apt-get install -y \
make \
build-essential \
libssl-dev \
zlib1g-dev \
libbz2-dev \
libreadline-dev \
libsqlite3-dev \
wget \
curl \
llvm \
libncurses5-dev \
libncursesw5-dev \
xz-utils \
tk-dev \
libffi-dev \
liblzma-dev \
python-openssl \
git \
&& rm -rf /var/lib/apt/lists/*
ENV PYENV_ROOT "/pyenv"
ENV PATH "$PYENV_ROOT/bin:$PATH"
COPY . /pyenv
RUN eval "$(pyenv init -)"

25
MAINTENANCE.md Normal file
View file

@ -0,0 +1,25 @@
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.
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)
* Add a sponsors section to the release notes by running:
```bash
.github/scripts/generate_release_notes_sponsors.py
```
Paste the output at the end of the release notes.
* This lists new GitHub Sponsors and OpenCollective backers since the last release or within the last month, whichever is longer.
* The GitHub Sponsors query requires the `gh` CLI with the `read:user` scope.
* If OpenCollective is unavailable, pass `--skip-opencollective` and add those backers manually.
* Update `CHANGELOG.md` with the new version number and the edited summary (only the changes section)
* Push the version number in `libexec/pyenv---version` and `plugins/python-build/bin/python-build`
* 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
* Commit the changes locally into `master`
* 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.

177
Makefile
View file

@ -1,25 +1,170 @@
.PHONY: test test-build
TEST_BATS_VERSION = v1.10.0
TEST_BASH_VERSIONS = 3.2.57 4.1.17
TEST_UNIT_DOCKER_PREFIX = test-unit-docker
TEST_UNIT_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_UNIT_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_UNIT_DOCKER_PREFIX)))
TEST_PYTHON_BUILD_DOCKER_PREFIX = test-python-build-docker
TEST_PYTHON_BUILD_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_PYTHON_BUILD_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_PYTHON_BUILD_DOCKER_PREFIX)))
TEST_BINARY_DOCKER_PREFIX = test-binary-docker
TEST_BINARY_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_BINARY_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_BINARY_DOCKER_PREFIX)))
TEST_LINK_DOCKER_PREFIX = test-link-docker
TEST_LINK_DOCKER_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_LINK_DOCKER_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_LINK_DOCKER_PREFIX)))
TEST_BATS_IMAGE_PREFIX = test-pyenv-docker-image
TEST_BATS_IMAGE_TARGETS = $(foreach bash,$(TEST_BASH_VERSIONS),$(addsuffix -$(bash),$(TEST_BATS_IMAGE_PREFIX)) $(addsuffix -gnu-$(bash),$(TEST_BATS_IMAGE_PREFIX)))
.PHONY: test-docker
test-docker: $(TEST_UNIT_DOCKER_PREFIX) $(TEST_PYTHON_BUILD_DOCKER_PREFIX) $(TEST_BINARY_DOCKER_PREFIX) $(TEST_LINK_DOCKER_PREFIX)
.PHONY: $(TEST_UNIT_DOCKER_PREFIX)
$(TEST_UNIT_DOCKER_PREFIX): $(TEST_UNIT_DOCKER_TARGETS)
# Run each unit test under bats docker
.PHONY: $(TEST_UNIT_DOCKER_TARGETS)
$(TEST_UNIT_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX)
$(TEST_UNIT_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False)
$(TEST_UNIT_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@))
$(TEST_UNIT_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU)
$(TEST_UNIT_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti)
$(TEST_UNIT_DOCKER_TARGETS): $(TEST_UNIT_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-%
$(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)')
docker run \
--init \
-v $(PWD):/code:ro \
-v /etc/passwd:/etc/passwd:ro \
-v /etc/group:/etc/group:ro \
-u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \
$${BATS_TEST_FILTER:+-e BATS_TEST_FILTER="$${BATS_TEST_FILTER}"} \
$${BATS_FILE_FILTER:+-e BATS_FILE_FILTER="$${BATS_FILE_FILTER}"} \
$${CI+-e CI="$${CI}"} \
$(INTERACTIVE) \
$(DOCKER_IMAGE):$(DOCKER_TAG) \
test/run
.PHONY: $(TEST_PYTHON_BUILD_DOCKER_PREFIX)
$(TEST_PYTHON_BUILD_DOCKER_PREFIX): $(TEST_PYTHON_BUILD_DOCKER_TARGETS)
# Run each plugin test under bats docker
.PHONY: $(TEST_PYTHON_BUILD_DOCKER_TARGETS)
$(TEST_PYTHON_BUILD_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX)
$(TEST_PYTHON_BUILD_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False)
$(TEST_PYTHON_BUILD_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@))
$(TEST_PYTHON_BUILD_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU)
$(TEST_PYTHON_BUILD_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti)
$(TEST_PYTHON_BUILD_DOCKER_TARGETS): $(TEST_PYTHON_BUILD_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-%
$(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)')
docker run \
--init \
-v $(PWD):/code:ro \
-v /etc/passwd:/etc/passwd:ro \
-v /etc/group:/etc/group:ro \
-u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \
$${CI+-e CI="$${CI}"} \
$(INTERACTIVE) \
$(DOCKER_IMAGE):$(DOCKER_TAG) \
bats $${CI:+-F "/code/test/libexec/bats-format-tap-suite"} \
$${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} plugins/python-build/test/$${BATS_FILE_FILTER}
.PHONY: $(TEST_BINARY_DOCKER_PREFIX)
$(TEST_BINARY_DOCKER_PREFIX): $(TEST_BINARY_DOCKER_TARGETS)
.PHONY: $(TEST_BINARY_DOCKER_TARGETS)
$(TEST_BINARY_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX)
$(TEST_BINARY_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False)
$(TEST_BINARY_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@))
$(TEST_BINARY_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU)
$(TEST_BINARY_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti)
$(TEST_BINARY_DOCKER_TARGETS): $(TEST_BINARY_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-%
$(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)')
docker run \
--init \
-v $(PWD):/code:ro \
-v /etc/passwd:/etc/passwd:ro \
-v /etc/group:/etc/group:ro \
-u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \
$${CI+-e CI="$${CI}"} \
$(INTERACTIVE) \
$(DOCKER_IMAGE):$(DOCKER_TAG) \
bats $${CI:+-F "/code/test/libexec/bats-format-tap-suite"} \
$${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} plugins/pyenv-binary/test/$${BATS_FILE_FILTER}
.PHONY: $(TEST_LINK_DOCKER_PREFIX)
$(TEST_LINK_DOCKER_PREFIX): $(TEST_LINK_DOCKER_TARGETS)
.PHONY: $(TEST_LINK_DOCKER_TARGETS)
$(TEST_LINK_DOCKER_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX)
$(TEST_LINK_DOCKER_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False)
$(TEST_LINK_DOCKER_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@))
$(TEST_LINK_DOCKER_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU)
$(TEST_LINK_DOCKER_TARGETS): INTERACTIVE = $(if $(findstring true,$(CI)),,-ti)
$(TEST_LINK_DOCKER_TARGETS): $(TEST_LINK_DOCKER_PREFIX)-% : $(TEST_BATS_IMAGE_PREFIX)-%
$(info Running test with docker image '$(DOCKER_IMAGE):$(DOCKER_TAG)')
docker run \
--init \
-v $(PWD):/code:ro \
-v /etc/passwd:/etc/passwd:ro \
-v /etc/group:/etc/group:ro \
-u "$$(id -u $$(whoami)):$$(id -g $$(whoami))" \
$${CI+-e CI="$${CI}"} \
$(INTERACTIVE) \
$(DOCKER_IMAGE):$(DOCKER_TAG) \
bats $${CI:+-F "/code/test/libexec/bats-format-tap-suite"} \
$${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} plugins/pyenv-link/test/$${BATS_FILE_FILTER}
# Build all images needed for bats under docker
.PHONY: $(TEST_BATS_IMAGE_PREFIX)
$(TEST_BATS_IMAGE_PREFIX): $(TEST_BATS_IMAGE_TARGETS)
# Build each image needed for bats under docker
.PHONY: $(TEST_BATS_IMAGE_TARGETS)
$(TEST_BATS_IMAGE_TARGETS): DOCKER_IMAGE = $(TEST_BATS_IMAGE_PREFIX)
$(TEST_BATS_IMAGE_TARGETS): GNU = $(if $(findstring -gnu-,$@),True,False)
$(TEST_BATS_IMAGE_TARGETS): BASH = $(filter $(TEST_BASH_VERSIONS),$(subst -, ,$@))
$(TEST_BATS_IMAGE_TARGETS): DOCKER_TAG = bash-$(BASH)-gnu-$(GNU)
$(TEST_BATS_IMAGE_TARGETS):
if [ -z "$$(docker images -q '$(DOCKER_IMAGE):$(DOCKER_TAG)')" ]]; then \
docker build \
--quiet \
-f "$(PWD)/test/Dockerfile" \
--build-arg GNU="$(GNU)" \
--build-arg BASH="$(BASH)" \
--build-arg BATS_VERSION="$(TEST_BATS_VERSION)" \
-t $(DOCKER_IMAGE):$(DOCKER_TAG) \
./ ; \
fi
.PHONY: test test-unit test-python-build test-binary test-link
# Do not pass in user flags to build tests.
unexport PYTHON_CFLAGS
unexport PYTHON_CONFIGURE_OPTS
test: bats
test: test-unit test-python-build test-binary test-link
test-unit: bats
PATH="./bats/bin:$$PATH" test/run
cd plugins/python-build && $(PWD)/bats/bin/bats $${CI:+--tap} test
test-python-build: bats
cd plugins/python-build && $(PWD)/bats/bin/bats $${CI:+-F "$(PWD)/test/libexec/bats-format-tap-suite"} \
$${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} test/$${BATS_FILE_FILTER}
PYTHON_BUILD_ROOT := $(CURDIR)/plugins/python-build
PYTHON_BUILD_OPTS ?= --verbose
PYTHON_BUILD_VERSION ?= 3.8-dev
PYTHON_BUILD_TEST_PREFIX ?= $(PYTHON_BUILD_ROOT)/test/build/tmp/dist
test-binary: bats
cd plugins/pyenv-binary && $(PWD)/bats/bin/bats $${CI:+-F "$(PWD)/test/libexec/bats-format-tap-suite"} \
$${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} test/$${BATS_FILE_FILTER}
test-build:
$(RM) -r $(PYTHON_BUILD_TEST_PREFIX)
$(PYTHON_BUILD_ROOT)/bin/python-build $(PYTHON_BUILD_OPTS) $(PYTHON_BUILD_VERSION) $(PYTHON_BUILD_TEST_PREFIX)
[ -e $(PYTHON_BUILD_TEST_PREFIX)/bin/python ]
$(PYTHON_BUILD_TEST_PREFIX)/bin/python -V
[ -e $(PYTHON_BUILD_TEST_PREFIX)/bin/pip ]
$(PYTHON_BUILD_TEST_PREFIX)/bin/pip -V
test-link: bats
cd plugins/pyenv-link && $(PWD)/bats/bin/bats $${CI:+-F "$(PWD)/test/libexec/bats-format-tap-suite"} \
$${BATS_TEST_FILTER:+--filter "$${BATS_TEST_FILTER}"} test/$${BATS_FILE_FILTER}
bats:
git clone --depth 1 --branch v1.2.0 https://github.com/bats-core/bats-core.git bats
.SECONDARY: bats-$(TEST_BATS_VERSION)
bats-$(TEST_BATS_VERSION):
git clone --depth 1 --branch $(TEST_BATS_VERSION) https://github.com/bats-core/bats-core.git bats-$(TEST_BATS_VERSION)
.PHONY: bats
bats: bats-$(TEST_BATS_VERSION)
if [ \( ! -L bats \) -o \( "x$$(readlink bats)" != "xbats-$(TEST_BATS_VERSION)" \) ]; then \
rm -rf bats; ln -s bats-$(TEST_BATS_VERSION) bats; \
fi

1008
README.md

File diff suppressed because it is too large Load diff

17
completions/pyenv.pwsh Normal file
View file

@ -0,0 +1,17 @@
$scriptblock = {
param($wordToComplete, $commandAst, $cursorPosition)
$words = $commandAst.ToString()
if ( $wordToComplete ) {
$matches = (($words[0..$cursorPosition] -join '') | Select-String -Pattern "\s+" -AllMatches).Matches
if ( $matches ) {
$cursorPosition = $matches[-1].Index - 1
}
}
$words = $words[0..$cursorPosition] -join '' -split "\s+"
if ( $words.Count -ge 2 ) {
pyenv completions $words[1] | where { $_ -match $wordToComplete }
} else {
pyenv commands | where { $_ -match $wordToComplete }
}
}
Register-ArgumentCompleter -Native -CommandName pyenv -ScriptBlock $scriptblock

BIN
install_local_python.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 KiB

View file

@ -29,7 +29,7 @@ if enable -f "${BASH_SOURCE%/*}"/../libexec/pyenv-realpath.dylib realpath 2>/dev
else
[ -z "$PYENV_NATIVE_EXT" ] || abort "failed to load \`realpath' builtin"
READLINK=$(type -P greadlink readlink | head -1)
READLINK=$(type -P readlink)
[ -n "$READLINK" ] || abort "cannot find readlink - are you missing GNU coreutils?"
resolve_link() {
@ -76,21 +76,29 @@ export PYENV_DIR
shopt -s nullglob
bin_path="$(abs_dirname "$0")"
for plugin_bin in "${bin_path%/*}"/plugins/*/bin; do
_PYENV_INSTALL_PREFIX="$(abs_dirname "$0")"
_PYENV_INSTALL_PREFIX="${_PYENV_INSTALL_PREFIX%/*}"
export _PYENV_INSTALL_PREFIX
for plugin_bin in "${_PYENV_INSTALL_PREFIX}"/plugins/*/bin; do
PATH="${plugin_bin}:${PATH}"
done
for plugin_bin in "${PYENV_ROOT}"/plugins/*/bin; do
PATH="${plugin_bin}:${PATH}"
done
export PATH="${bin_path}:${PATH}"
# PYENV_ROOT can be set to anything, so it may happen to be equal to the base path above,
# resulting in duplicate PATH entries
if [ "${_PYENV_INSTALL_PREFIX}" != "$PYENV_ROOT" ]; then
for plugin_bin in "${PYENV_ROOT}"/plugins/*/bin; do
PATH="${plugin_bin}:${PATH}"
done
fi
export PATH="${_PYENV_INSTALL_PREFIX}/libexec:${PATH}"
PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${PYENV_ROOT}/pyenv.d"
if [ "${bin_path%/*}" != "$PYENV_ROOT" ]; then
if [ "${_PYENV_INSTALL_PREFIX}" != "$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"
PYENV_HOOK_PATH="${PYENV_HOOK_PATH}:${_PYENV_INSTALL_PREFIX}/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

View file

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

View file

@ -3,19 +3,19 @@
# Usage: pyenv commands [--sh|--no-sh]
set -e
[ -n "$PYENV_DEBUG" ] && set -x
[[ -n $PYENV_DEBUG ]] && set -x
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
if [[ $1 = "--complete" ]]; then
echo --sh
echo --no-sh
exit
fi
if [ "$1" = "--sh" ]; then
if [[ $1 = "--sh" ]]; then
sh=1
shift
elif [ "$1" = "--no-sh" ]; then
elif [[ $1 = "--no-sh" ]]; then
nosh=1
shift
fi
@ -24,20 +24,25 @@ IFS=: paths=($PATH)
shopt -s nullglob
{ for path in "${paths[@]}"; do
for command in "${path}/pyenv-"*; do
command="${command##*pyenv-}"
if [ -n "$sh" ]; then
if [ "${command:0:3}" = "sh-" ]; then
echo "${command##sh-}"
fi
elif [ -n "$nosh" ]; then
if [ "${command:0:3}" != "sh-" ]; then
echo "${command##sh-}"
fi
else
echo "${command##sh-}"
fi
{
if [[ -n $sh ]]; then
for path in "${paths[@]}"; do
for command in "${path}"/pyenv-sh-*; do
echo "${command##*/pyenv-sh-}"
done
done
done
} | sort | uniq
else
for path in "${paths[@]}"; do
for command in "${path}"/pyenv-*; do
command="${command##*/pyenv-}"
if [[ -n $nosh ]]; then
if [[ ${command:0:3} != "sh-" ]]; then
echo "$command"
fi
else
echo "${command##sh-}"
fi
done
done
fi
} | sort -u

View file

@ -8,10 +8,10 @@
# version's `bin' directory is at the front.
#
# For example, if the currently selected Python version is 2.7.6:
# pyenv exec pip install -rrequirements.txt
# pyenv exec pip install -r requirements.txt
#
# is equivalent to:
# PATH="$PYENV_ROOT/versions/2.7.6/bin:$PATH" pip install -rrequirements.txt
# PATH="$PYENV_ROOT/versions/2.7.6/bin:$PATH" pip install -r requirements.txt
set -e
[ -n "$PYENV_DEBUG" ] && set -x
@ -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,10 +29,19 @@ if [ -z "$PYENV_COMMAND" ]; then
exit 1
fi
export PYENV_VERSION
if [[ -n $_PYENV_SHIM_PATH ]]; then
PROGRAM="$(echo "$PYENV_COMMAND" | tr a-z- A-Z_ | sed 's/[^A-Z0-9_]/_/g')"
NR_PYENV_SHIM_PATHS_PROGRAM="_PYENV_SHIM_PATHS_${PROGRAM}"
export -- "$NR_PYENV_SHIM_PATHS_PROGRAM=$_PYENV_SHIM_PATH${!NR_PYENV_SHIM_PATHS_PROGRAM:+:${!NR_PYENV_SHIM_PATHS_PROGRAM}}"
unset PROGRAM NR_PYENV_SHIM_PATHS_PROGRAM
unset _PYENV_SHIM_PATH
fi
PYENV_COMMAND_PATH="$(pyenv-which "$PYENV_COMMAND")"
PYENV_BIN_PATH="${PYENV_COMMAND_PATH%/*}"
export PYENV_VERSION
OLDIFS="$IFS"
IFS=$'\n' scripts=(`pyenv-hooks exec`)
IFS="$OLDIFS"

View file

@ -36,12 +36,16 @@ if [ -n "$versions" ]; then
pyenv-version-file-write "$PYENV_VERSION_FILE" "${versions[@]}"
else
OLDIFS="$IFS"
# VAR=() of unquoted value does glob expansion (against the current dir's contents) after IFS-splitting
# which is undesired
set -f
IFS=: versions=($(
pyenv-version-file-read "$PYENV_VERSION_FILE" ||
pyenv-version-file-read "${PYENV_ROOT}/global" ||
pyenv-version-file-read "${PYENV_ROOT}/default" ||
echo system
))
set +f
IFS="$OLDIFS"
for version in "${versions[@]}"; do
echo "$version"

View file

@ -44,8 +44,9 @@ extract_initial_comment_block() {
}
collect_documentation() {
# shellcheck disable=SC2016
$(type -P gawk awk | head -1) '
# `tail` prevents "broken pipe" errors due to `head` closing the pipe without reading everything
# https://superuser.com/questions/554855/how-can-i-fix-a-broken-pipe-error/642932#642932
$(type -P gawk awk | tail -n +1 | head -n1) '
/^Summary:/ {
summary = substr($0, 10)
next

View file

@ -26,7 +26,7 @@ if ! enable -f "${BASH_SOURCE%/*}"/pyenv-realpath.dylib realpath 2>/dev/null; th
echo "pyenv: failed to load \`realpath' builtin" >&2
exit 1
fi
READLINK=$(type -P greadlink readlink | head -1)
READLINK=$(type -P readlink)
if [ -z "$READLINK" ]; then
echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
exit 1

View file

@ -1,6 +1,8 @@
#!/usr/bin/env bash
# Summary: Configure the shell environment for pyenv
# Usage: eval "$(pyenv init [-|--path] [--no-rehash] [<shell>])"
# Usage: eval "$(pyenv init [-|--path] [--no-push-path] [--no-rehash] [<shell>])"
# pyenv init --install [<shell>]
# pyenv init --detect-shell [<shell>]
set -e
[ -n "$PYENV_DEBUG" ] && set -x
@ -9,37 +11,54 @@ set -e
if [ "$1" = "--complete" ]; then
echo -
echo --path
echo --install
echo --no-push-path
echo --no-rehash
echo --detect-shell
echo bash
echo fish
echo ksh
echo pwsh
echo zsh
exit
fi
mode="help"
no_rehash=""
for args in "$@"
do
if [ "$args" = "-" ]; then
mode="print"
shift
fi
if [ "$args" = "--path" ]; then
mode="path"
shift
fi
if [ "$args" = "--no-rehash" ]; then
no_rehash=1
shift
fi
while [ "$#" -gt 0 ]; do
case "$1" in
-)
mode="print"
;;
--path)
mode="path"
;;
--install)
mode="install"
;;
--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)"
if shell=$(tr '\0' ' ' 2>/dev/null </proc/"$PPID"/cmdline);then
:
else
shell=$(ps p "$PPID" -o 'args=' 2>/dev/null || true)
fi
shell="${shell%% *}"
shell="${shell##-}"
shell="${shell:-$SHELL}"
@ -47,8 +66,6 @@ if [ -z "$shell" ]; then
shell="${shell%%-*}"
fi
root="${0%/*}/.."
function main() {
case "$mode" in
"help")
@ -57,129 +74,336 @@ function main() {
;;
"path")
print_path
print_rehash
exit 0
;;
"print")
init_dirs
warn_path
print_path
print_env
print_completion
print_rehash
print_shell_function
exit 0
;;
"detect-shell")
detect_profile
print_detect_shell
exit 0
;;
"install")
install_shell_startup_files
exit 0
;;
esac
# should never get here
exit 2
}
function help_() {
function detect_profile() {
case "$shell" in
bash )
profile='~/.bash_profile'
if [ -e "${HOME}/.bash_profile" ]; then
profile='~/.bash_profile'
else
profile='~/.profile'
fi
profile_explain="~/.bash_profile if it exists, otherwise ~/.profile"
rc='~/.bashrc'
;;
fish )
profile='~/.config/fish/config.fish'
rc='~/.config/fish/config.fish'
;;
pwsh )
profile='~/.config/powershell/profile.ps1'
rc='~/.config/powershell/profile.ps1'
;;
zsh )
profile='~/.zprofile'
rc='~/.zshrc'
;;
ksh )
ksh | ksh93 | mksh )
# There are two implementations of Korn shell: AT&T (ksh93) and Mir (mksh).
# Systems may have them installed under those names, or as ksh, so those
# are recognized here. The obsolete ksh88 (subsumed by ksh93) and pdksh
# (subsumed by mksh) are not included, since they are unlikely to still
# be in use as interactive shells anywhere.
profile='~/.profile'
rc='~/.profile'
;;
* )
profile='your shell'\''s login startup file'
rc='your shell'\''s interactive startup file'
profile=
rc=
profile_explain='your shell'\''s login startup file'
rc_explain='your shell'\''s interactive startup file'
;;
esac
}
function print_detect_shell() {
echo "PYENV_SHELL_DETECT=$shell"
echo "PYENV_PROFILE_DETECT=$profile"
echo "PYENV_RC_DETECT=$rc"
}
function help_() {
detect_profile
{
echo
echo '# (The below instructions are intended for common'
echo '# shell setups. See the README for more guidance'
echo '# if they don'\''t apply and/or don'\''t work for you.)'
echo
case "$shell" in
fish )
echo "# Add pyenv executable to PATH by running"
echo "# the following interactively:"
echo
echo 'set -Ux PYENV_ROOT $HOME/.pyenv'
echo 'set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths'
print_fish_user_path_setup
echo
echo "# Load pyenv automatically by appending"
echo "# the following to ~/.config/fish/config.fish:"
echo
echo 'status is-login; and pyenv init --path | source'
echo 'pyenv init - | source'
print_fish_shell_setup
echo
echo "# If fish is not your login shell,"
echo "# add the following to ~/.profile:"
echo
echo 'export PYENV_ROOT="$HOME/.pyenv"'
echo 'export PATH="$PYENV_ROOT/bin:$PATH"'
echo 'eval "$(pyenv init --path)"'
;;
pwsh )
echo '# Load pyenv automatically by appending'
echo "# the following to $profile :"
echo
print_pwsh_shell_setup
;;
* )
echo '# Add pyenv executable to PATH and'
echo '# enable shims by adding the following'
case "$shell" in
bash|ksh )
echo '# to ~/.profile:'
;;
* )
echo '# to ~/.profile and '"${profile}"':'
;;
esac
echo
echo 'export PYENV_ROOT="$HOME/.pyenv"'
echo 'export PATH="$PYENV_ROOT/bin:$PATH"'
echo 'eval "$(pyenv init --path)"'
echo
if [[ $shell == "bash" ]]; then
echo '# If your ~/.profile sources '"${rc}"','
echo '# the lines need to be inserted before the part'
echo '# that does that. See the README for another option.'
echo
echo '# If you have '"${profile}"', make sure that it'
echo '# also executes the above lines -- e.g. by'
echo '# copying them there or by sourcing ~/.profile'
echo '# Load pyenv automatically by appending'
echo -n "# the following to "
if [[ "$profile" == "$rc" && -z $rc_explain ]]; then
echo "${profile_explain:-$profile} :"
else
echo
echo "# ${profile_explain:-$profile} (for login shells)"
echo "# and ${rc_explain:-$rc} (for interactive shells) :"
fi
echo "# Load pyenv into the shell by adding"
echo "# the following to ${rc}:"
echo
echo 'eval "$(pyenv init -)"'
echo
echo '# Make sure to restart your entire logon session'
echo '# for changes to profile files to take effect.'
echo
print_posix_shell_setup
;;
esac
echo
echo '# Restart your shell for the changes to take effect.'
echo
} >&2
}
function print_posix_shell_setup() {
echo 'export PYENV_ROOT="$HOME/.pyenv"'
echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"'
echo 'eval "$(pyenv init - '$shell')"'
}
function print_fish_shell_setup() {
echo 'pyenv init - fish | source'
}
function print_fish_user_path_setup() {
echo 'set -Ux PYENV_ROOT $HOME/.pyenv'
echo 'if functions -q fish_add_path'
echo ' test -d $PYENV_ROOT/bin; and fish_add_path $PYENV_ROOT/bin'
echo 'else'
echo ' test -d $PYENV_ROOT/bin; and set -U fish_user_paths $PYENV_ROOT/bin $fish_user_paths'
echo 'end'
}
function print_pwsh_shell_setup() {
echo '$Env:PYENV_ROOT="$Env:HOME/.pyenv"'
echo 'if (Test-Path -LP "$Env:PYENV_ROOT/bin" -PathType Container) {'
echo ' $Env:PATH="$Env:PYENV_ROOT/bin:$Env:PATH" }'
echo 'iex ((pyenv init -) -join "`n")'
}
function expand_home_path() {
local path="$1"
printf '%s\n' "${path/#\~/$HOME}"
}
function install_shell_startup_files() {
if [[ -z $HOME ]]; then
echo "pyenv: HOME must be set to configure shell startup files" >&2
return 1
fi
detect_profile
local files=()
local lines=()
local profile_path rc_path setup
case "$shell" in
bash | zsh | ksh | ksh93 | mksh )
rc_path="$(expand_home_path "$rc")"
profile_path="$(expand_home_path "$profile")"
setup="$(print_posix_shell_setup)"
files=("$rc_path")
lines=("$setup")
if [[ $profile_path != "$rc_path" ]]; then
files+=("$profile_path")
lines+=("$setup")
fi
;;
fish )
rc_path="$(expand_home_path "$rc")"
files=("$rc_path")
lines=("$(print_fish_shell_setup)")
;;
pwsh )
rc_path="$(expand_home_path "$rc")"
files=("$rc_path")
lines=("$(print_pwsh_shell_setup)")
;;
* )
echo "pyenv: cannot automatically configure startup files for $shell" >&2
return 1
;;
esac
local index
for ((index = 0; index < ${#files[@]}; index++)); do
check_startup_file "${files[$index]}" || return 1
done
if [[ $shell == fish ]]; then
install_fish_user_paths || return 1
fi
for ((index = 0; index < ${#files[@]}; index++)); do
append_lines "${files[$index]}" "${lines[$index]}"
done
}
function check_startup_file() {
local file="$1"
local grep_status
if [[ ! -e $file ]]; then
return 0
fi
if [[ ! -f $file || ! -r $file ]]; then
echo "pyenv: failed to inspect $file" >&2
return 1
fi
if grep -Fi pyenv "$file" >/dev/null; then
echo "pyenv: cannot automatically apply changes to $file: it appears to already contain Pyenv-related code." >&2
echo "pyenv: review the file's contents and apply changes manually if necessary." >&2
echo "pyenv: run \`pyenv init $shell\` to see the suggested setup." >&2
return 1
else
grep_status=$?
if [[ $grep_status == 1 ]]; then
return 0
fi
echo "pyenv: failed to inspect $file" >&2
return "$grep_status"
fi
}
function install_fish_user_paths() {
local fish_setup
if ! command -v fish >/dev/null; then
echo "pyenv: fish is not available to configure fish universal variables" >&2
return 1
fi
fish_setup="$(print_fish_user_path_setup)"
if ! fish -c "$fish_setup"; then
echo "pyenv: failed to configure fish universal variables" >&2
return 1
fi
}
function append_lines() {
local file="$1"
local lines="$2"
local dir last_char
dir="${file%/*}"
if [[ $dir != "$file" ]]; then
mkdir -p "$dir"
fi
if [[ -s $file ]]; then
last_char="$(tail -c 1 "$file")" || return 1
if [[ -n $last_char ]]; then
echo >> "$file"
fi
fi
printf '%s\n' "$lines" >> "$file"
}
function init_dirs() {
mkdir -p "${PYENV_ROOT}/"{shims,versions}
}
function print_path() {
# Need to use the login shell rather than the current one
case "$shell" in
fish )
echo "set -gx PATH '${PYENV_ROOT}/shims' \$PATH"
;;
* )
echo 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"'
;;
esac
# if no_push_path is set, guard the PATH manipulation with a check on whether
# the shim is already in the PATH.
if [ -n "$no_push_path" ]; then
case "$shell" in
fish )
echo 'if not contains -- "'"${PYENV_ROOT}/shims"'" $PATH'
print_path_prepend_shims
echo 'end'
;;
pwsh )
echo 'if ( $Env:PATH -notmatch "'"${PYENV_ROOT}/shims"'" ) {'
print_path_prepend_shims
echo '}'
;;
* )
echo 'if [[ ":$PATH:" != *'\':"${PYENV_ROOT}"/shims:\''* ]]; then'
print_path_prepend_shims
echo 'fi'
;;
esac
else
case "$shell" in
fish )
echo 'while set pyenv_index (contains -i -- "'"${PYENV_ROOT}/shims"'" $PATH)'
echo 'set -eg PATH[$pyenv_index]; end; set -e pyenv_index'
print_path_prepend_shims
;;
pwsh )
echo '$Env:PATH="$(($Env:PATH -split '"':'"' | where { -not ($_ -match '"'${PYENV_ROOT}/shims'"') }) -join '"':'"')"'
print_path_prepend_shims
;;
* )
# Some distros (notably Debian-based) set Bash's SSH_SOURCE_BASHRC compilation option
# that makes it source `bashrc` under SSH even when not interactive.
# This is inhibited by a guard in Debian's stock `bashrc` but some people remove it
# in order to get proper environment for noninteractive remote commands
# (SSH provides /etc/ssh/sshrc and ~/.ssh/rc for that but no-one seems to use them for some reason).
# This has caused an infinite `bashrc` execution loop for those people in the below nested Bash invocation (#2367).
# --norc negates this behavior of such a customized Bash.
echo 'PATH="$(bash --norc -ec '\''IFS=:; paths=($PATH); '
echo 'for i in ${!paths[@]}; do '
echo 'if [[ ${paths[i]} == "'\'\'"${PYENV_ROOT}/shims"\'\''" ]]; then unset '\'\\\'\''paths[i]'\'\\\'\''; '
echo 'fi; done; '
echo 'echo "${paths[*]}"'\'')"'
print_path_prepend_shims
;;
esac
fi
}
function warn_path() {
if ! perl -ls0x3A -e 'while (<>) { chomp; ($_ eq $d) && exit 0; } exit 1' -- -d="${PYENV_ROOT}/shims" <<<"$PATH" ; then
echo 'echo '\''WARNING: `pyenv init -` no longer sets PATH.'\'
echo 'echo '\''Run `pyenv init` to see the necessary changes to make to your configuration.'\'
fi
function print_path_prepend_shims() {
case "$shell" in
fish )
echo 'set -gx PATH '\'"${PYENV_ROOT}/shims"\'' $PATH'
;;
pwsh )
echo '$Env:PATH="'"${PYENV_ROOT}"'/shims:$Env:PATH"'
;;
* )
echo 'export PATH="'"${PYENV_ROOT}"'/shims:${PATH}"'
;;
esac
}
function print_env() {
@ -187,6 +411,9 @@ function print_env() {
fish )
echo "set -gx PYENV_SHELL $shell"
;;
pwsh )
echo '$Env:PYENV_SHELL="'"$shell"'"'
;;
* )
echo "export PYENV_SHELL=$shell"
;;
@ -194,13 +421,29 @@ function print_env() {
}
function print_completion() {
completion="${root}/completions/pyenv.${shell}"
completion="${_PYENV_INSTALL_PREFIX}/completions/pyenv.${shell}"
if [ -r "$completion" ]; then
echo "source '$completion'"
case "$shell" in
pwsh )
echo "iex (gc $completion -Raw)"
;;
* )
echo "source '$completion'"
;;
esac
fi
}
function print_rehash() {
if [ -z "$no_rehash" ]; then
echo 'command pyenv rehash 2>/dev/null'
case "$shell" in
pwsh )
echo '& pyenv rehash'
;;
* )
echo 'command pyenv rehash'
;;
esac
fi
}
@ -208,52 +451,63 @@ function print_shell_function() {
commands=(`pyenv-commands --sh`)
case "$shell" in
fish )
cat <<EOS
function pyenv
set command \$argv[1]
echo \
'function pyenv
set command $argv[1]
set -e argv[1]
switch "\$command"
case ${commands[*]}
source (pyenv "sh-\$command" \$argv|psub)
case '*'
command pyenv "\$command" \$argv
switch "$command"
case '"${commands[*]}"'
source (pyenv "sh-$command" $argv|psub)
case "*"
command pyenv "$command" $argv
end
end
EOS
end'
;;
ksh )
pwsh )
cat <<EOS
function pyenv {
typeset command
EOS
;;
* )
cat <<EOS
pyenv() {
local command
EOS
;;
esac
\$command=""
if ( \$args.Count -gt 0 ) {
\$command, \$args = \$args
}
if [ "$shell" != "fish" ]; then
IFS="|"
cat <<EOS
command="\${1:-}"
if [ "\$#" -gt 0 ]; then
shift
fi
case "\$command" in
${commands[*]})
eval "\$(pyenv "sh-\$command" "\$@")"
;;
*)
command pyenv "\$command" "\$@"
;;
esac
if ( ("${commands[*]}" -split ' ') -contains \$command ) {
\$shell_cmds = (& (get-command -commandtype application pyenv -totalcount 1) sh-\$command \$args)
if ( \$shell_cmds.Count -gt 0 ) {
iex (\$shell_cmds -join "\`n")
}
} else {
& (get-command -commandtype application pyenv -totalcount 1) \$command \$args
}
}
EOS
;;
ksh | ksh93 | mksh )
echo \
'function pyenv {
typeset command=${1:-}'
;;
* )
echo \
'pyenv() {
local command=${1:-}'
;;
esac
if [ "$shell" != "fish" ] && [ "$shell" != "pwsh" ]; then
IFS="|"
echo \
' [ "$#" -gt 0 ] && shift
case "$command" in
'"${commands[*]:-/}"')
eval "$(pyenv "sh-$command" "$@")"
;;
*)
command pyenv "$command" "$@"
;;
esac
}'
fi
}

105
libexec/pyenv-latest Executable file
View file

@ -0,0 +1,105 @@
#!/usr/bin/env bash
# Summary: Print the latest installed or known version with the given prefix
# Usage: pyenv latest [-k|--known] <prefix>
#
# -k/--known Select from all known versions instead of installed
# -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
while [[ $# -gt 0 ]]
do
case "$1" in
-k|--known)
FROM_KNOWN=1
shift
;;
-b|--bypass)
BYPASS=1
shift
;;
-f|--force)
FORCE=1
BYPASS=1
shift
;;
*)
break
;;
esac
done
prefix=$1
exitcode=0
IFS=$'\n'
if [[ -z $FROM_KNOWN ]]; then
if [[ -d $PYENV_ROOT/versions/$prefix ]]; then
echo "$prefix"
exit $exitcode;
fi
DEFINITION_CANDIDATES=( $(pyenv-versions --bare --skip-envs) )
else
DEFINITION_CANDIDATES=( $(python-build --definitions ) )
fi
if printf '%s\n' "${DEFINITION_CANDIDATES[@]}" 2>/dev/null | grep -qxFe "$prefix"; then
echo "$prefix"
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[-.].*$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' \
$(if [[ -z $suffix ]]; then echo "-e /[0-9]t\$/d"; fi)
));
# Compose a sorting key, followed by | and original value
DEFINITION_CANDIDATES=(\
$(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \
awk \
'{ if (match($0,"^[[:alnum:]]+-"))
{ print substr($0,0,RLENGTH-1) "." substr($0,RLENGTH+1) "..|" $0; }
else
{ print $0 "...|" $0; }
}'))
DEFINITION_CANDIDATES=(\
$(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" \
| sort -t. -k1,1r -k 2,2nr -k 3,3nr -k4,4nr \
| cut -f2 -d $'|' \
|| true))
DEFINITION="${DEFINITION_CANDIDATES[0]}"
if [[ -n "$DEFINITION" ]]; then
echo "$DEFINITION"
else
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
fi
exit $exitcode

View file

@ -2,9 +2,11 @@
#
# Summary: Set or show the local application-specific Python version(s)
#
# Usage: pyenv local <version> <version2> <..>
# Usage: pyenv local [-f|--force] [<version> [...]]
# 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,15 +38,32 @@ 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
# VAR=() of unquoted value does glob expansion (against the current dir's contents) after IFS-splitting
# which is undesired
set -f
IFS=: versions=($(pyenv-version-file-read "$version_file"))
set +f
for version in "${versions[@]}"; do
echo "$version"
done

View file

@ -1,10 +1,10 @@
#!/usr/bin/env bash
# Summary: Display prefix for a Python version
# Usage: pyenv prefix [<version>]
# Summary: Display prefixes for Python versions
# Usage: pyenv prefix [<version>...]
#
# Displays the directory where a Python version is installed. If no
# version is given, `pyenv prefix' displays the location of the
# currently selected version.
# Displays the directories where the given Python versions are installed,
# separated by colons. If no version is given, `pyenv prefix' displays the
# locations of the currently selected versions.
set -e
[ -n "$PYENV_DEBUG" ] && set -x
@ -28,18 +28,24 @@ fi
PYENV_PREFIX_PATHS=()
OLDIFS="$IFS"
{ IFS=:
# Unquoted $VAR does glob expansion (against the current dir's contents) after IFS-splitting
# which is undesired
set -f
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
PYENV_PREFIX_PATH="${PYTHON_PATH%/bin/*}"
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/*}"
PYENV_PREFIX_PATH="${PYENV_PREFIX_PATH:-/}"
else
echo "pyenv: system version not found in PATH" >&2
exit 1
fi
else
version="$(pyenv-latest -f "$version")"
PYENV_PREFIX_PATH="${PYENV_ROOT}/versions/${version}"
fi
if [ -d "$PYENV_PREFIX_PATH" ]; then
@ -49,6 +55,7 @@ OLDIFS="$IFS"
exit 1
fi
done
set +f
}
IFS="$OLDIFS"

View file

@ -2,7 +2,7 @@
# Summary: Rehash pyenv shims (run this after installing executables)
set -e
[ -n "$PYENV_DEBUG" ] && set -x
[[ -n "$PYENV_DEBUG" ]] && set -x
SHIM_PATH="${PYENV_ROOT}/shims"
PROTOTYPE_SHIM_PATH="${SHIM_PATH}/.pyenv-shim"
@ -10,21 +10,37 @@ PROTOTYPE_SHIM_PATH="${SHIM_PATH}/.pyenv-shim"
# Create the shims directory if it doesn't already exist.
mkdir -p "$SHIM_PATH"
acquire_lock() {
# Ensure only one instance of pyenv-rehash is running at a time by
# setting the shell's `noclobber` option and attempting to write to
# the prototype shim file. If the file already exists, print a warning
# to stderr and exit with a non-zero status.
local ret
set -o noclobber
echo > "$PROTOTYPE_SHIM_PATH" 2>| /dev/null || ret=1
set +o noclobber
[ -z "${ret}" ]
}
declare last_acquire_error
# If we were able to obtain a lock, register a trap to clean up the
# prototype shim when the process exits.
trap release_lock EXIT
acquire_lock() {
local ret
# An old lock file is presumed stale. We assume no healthy rehash takes this long.
# The time is picked very small so that a killed rehash holds up new shell sessions
# for as little as possible
find "$PROTOTYPE_SHIM_PATH" -mmin +2 -exec rm -f {} \; 2>/dev/null || true
set -o noclobber
last_acquire_error="$( { ( echo -n > "$PROTOTYPE_SHIM_PATH"; ) 2>&1 1>&3 3>&1-; } 3>&1)" \
&& trap release_lock EXIT \
|| {
# Linux Landlock and MacOS Seatbelt sandbox subsystems return false information in access(),
# making -w "$SHIM_PATH" not catch the fact that the shims dir is not writable in this case.
# Bash doesn't provide access to errno to check for non-EEXIST error code in `echo >'.
# So check for writablity by trying to write to a different file,
# in a way that taxes the usual use case as little as possible.
if [[ -z $tested_for_other_write_errors ]]; then
# if lots of (50+) rehashes run concurrently, another concurrent rehash
# may delete the temporary file in remove_*_shims() before we do so
( t="$(TMPDIR="$SHIM_PATH" mktemp)" && rm -f "$t" ) \
&& tested_for_other_write_errors=1 \
|| { echo "pyenv: cannot rehash: $SHIM_PATH isn't writable" >&2
set +o noclobber
exit 1; }
fi
ret=1
}
set +o noclobber
[[ -z "${ret}" ]]
}
remove_prototype_shim() {
rm -f "$PROTOTYPE_SHIM_PATH"
@ -32,17 +48,19 @@ remove_prototype_shim() {
release_lock() {
remove_prototype_shim
trap - EXIT
}
if [ ! -w "$SHIM_PATH" ]; then
echo "pyenv: cannot rehash: $SHIM_PATH isn't writable"
echo "pyenv: cannot rehash: $SHIM_PATH isn't writable" >&2
exit 1
fi
unset acquired
start=$SECONDS
while (( SECONDS <= start + ${PYENV_REHASH_TIMEOUT:-60} )); do
if acquire_lock 2>/dev/null; then
declare acquired tested_for_other_write_errors
declare start=$SECONDS
PYENV_REHASH_TIMEOUT=${PYENV_REHASH_TIMEOUT:-60}
while (( SECONDS <= start + PYENV_REHASH_TIMEOUT )); do
if acquire_lock; then
acquired=1
break
else
@ -52,9 +70,14 @@ while (( SECONDS <= start + ${PYENV_REHASH_TIMEOUT:-60} )); do
done
if [ -z "${acquired}" ]; then
echo "pyenv: cannot rehash: $PROTOTYPE_SHIM_PATH exists"
if [[ -n $tested_for_other_write_errors ]]; then
echo "pyenv: cannot rehash: couldn't acquire lock"\
"$PROTOTYPE_SHIM_PATH for $PYENV_REHASH_TIMEOUT seconds. Last error message:" >&2
echo "$last_acquire_error" >&2
fi
exit 1
fi
unset tested_for_other_write_errors
# The prototype shim file is a script that re-execs itself, passing
# its filename and any arguments to `pyenv exec`. This file is
@ -70,6 +93,10 @@ set -e
program="\${0##*/}"
export PYENV_ROOT="$PYENV_ROOT"
SHIM_PATH=\${0%/*}
if [[ \$SHIM_PATH != "$PYENV_ROOT/shims" ]]; then
export _PYENV_SHIM_PATH="\$SHIM_PATH"
fi
exec "$(command -v pyenv)" exec "\$program" "\$@"
SH
chmod +x "$PROTOTYPE_SHIM_PATH"
@ -88,17 +115,6 @@ remove_outdated_shims() {
done
}
# List basenames of executables for every Python version
list_executable_names() {
local version file
pyenv-versions --bare --skip-aliases | \
while read -r version; do
for file in "${PYENV_ROOT}/versions/${version}/bin/"*; do
echo "${file##*/}"
done
done
}
# The basename of each argument passed to `make_shims` will be
# registered for installation as a shim. In this way, plugins may call
# `make_shims` with a glob to register many shims at once.
@ -174,7 +190,7 @@ shopt -s nullglob
create_prototype_shim
remove_outdated_shims
# shellcheck disable=SC2046
make_shims $(list_executable_names | sort -u)
make_shims $(pyenv-versions --executables)
# Allow plugins to register shims.

View file

@ -11,11 +11,17 @@ shell="$(basename "${PYENV_SHELL:-$SHELL}")"
# When pyenv shell integration is enabled, delegate to pyenv-rehash,
# then tell the shell to empty its command lookup cache.
pyenv-rehash
case "$shell" in
pwsh)
echo "& (get-command pyenv -commandtype application) rehash"
;;
*)
echo "command pyenv rehash"
esac
case "$shell" in
fish )
# no rehash support
fish | pwsh )
# no executable cache
;;
* )
echo "hash -r 2>/dev/null || true"

View file

@ -48,6 +48,9 @@ if [ "$versions" = "--unset" ]; then
echo 'set -gu PYENV_VERSION_OLD "$PYENV_VERSION"'
echo "set -e PYENV_VERSION"
;;
pwsh )
echo '$Env:PYENV_VERSION, $Env:PYENV_VERSION_OLD = $null, $Env:PYENV_VERSION'
;;
* )
echo 'PYENV_VERSION_OLD="${PYENV_VERSION-}"'
echo "unset PYENV_VERSION"
@ -74,6 +77,16 @@ else
echo "pyenv: PYENV_VERSION_OLD is not set" >&2
false
end
EOS
;;
pwsh )
cat <<EOS
if ( Get-Item -Path Env:\PYENV_VERSION* ) {
\$Env:PYENV_VERSION, \$Env:PYENV_VERSION_OLD = \$Env:PYENV_VERSION_OLD, \$Env:PYENV_VERSION
} else {
Write-Error "pyenv: Env:PYENV_VERSION_OLD is not set"
return \$false
}
EOS
;;
* )
@ -109,6 +122,9 @@ if pyenv-prefix "${versions[@]}" >/dev/null; then
echo 'set -gu PYENV_VERSION_OLD "$PYENV_VERSION"'
echo "set -gx PYENV_VERSION \"$version\""
;;
pwsh )
echo '$Env:PYENV_VERSION, $Env:PYENV_VERSION_OLD = "'"${version}"'", $Env:PYENV_VERSION'
;;
* )
echo 'PYENV_VERSION_OLD="${PYENV_VERSION-}"'
echo "export PYENV_VERSION=\"${version}\""

View file

@ -1,20 +1,40 @@
#!/usr/bin/env bash
# Summary: Show the current Python version(s) and its origin
# Usage: pyenv version [--bare]
#
# Shows the currently selected Python version(s) and how it was
# selected. To obtain only the version string, use `pyenv
# version-name'.
# --bare show just the version name. An alias to `pyenv version-name'
set -e
[ -n "$PYENV_DEBUG" ] && set -x
exitcode=0
OLDIFS="$IFS"
# VAR=() of unquoted value does glob expansion (against the current dir's contents) after IFS-splitting
# which is undesired
set -f
IFS=: PYENV_VERSION_NAMES=($(pyenv-version-name)) || exitcode=$?
set +f
IFS="$OLDIFS"
unset bare
for arg; do
case "$arg" in
--complete )
echo --bare
exit ;;
--bare ) bare=1 ;;
* )
pyenv-help --usage version >&2
exit 1
;;
esac
done
for PYENV_VERSION_NAME in "${PYENV_VERSION_NAMES[@]}"; do
echo "$PYENV_VERSION_NAME (set by $(pyenv-version-origin))"
if [[ -n $bare ]]; then
echo "$PYENV_VERSION_NAME"
else
echo "$PYENV_VERSION_NAME (set by $(pyenv-version-origin))"
fi
done
exit $exitcode

View file

@ -8,12 +8,28 @@ target_dir="$1"
find_local_version_file() {
local root="$1"
while ! [[ "$root" =~ ^//[^/]*$ ]]; do
if [ -f "${root}/.python-version" ]; then
echo "${root}/.python-version"
# Nonexistent paths are UB as of this writing.
# Relative ones cause a failure but absolute ones don't
[[ $root != /* ]] && root=$(CDPATH= cd -- "$root" && pwd)
# Original Rbenv code supports UNC notation for Cygwin/MinGW
# (https://github.com/rbenv/rbenv/pull/529)
# POSIX.1-2024 still allows to treat //<name> in implementation-specific manner
# (https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap04.html#tag_04_16)
# even though few UNIX variants do that
local unc; [[ $root =~ ^//[^/] && ! / -ef // ]] && unc=1
root="${root%/}"
# when testing root, $root is ""
while true; do
# don't test //.python-version if // is special
# as it's pointless and possibly very slow
# if it e.g. leads to a network search
[[ $unc && $root == / ]] && break
if [[ -f $root/.python-version ]]; then
echo "$root/.python-version"
return 0
fi
[ -n "$root" ] || break
[[ -n $root ]] || break
root="${root%/*}"
done
return 1
@ -22,7 +38,9 @@ find_local_version_file() {
if [ -n "$target_dir" ]; then
find_local_version_file "$target_dir"
else
find_local_version_file "$PYENV_DIR" || {
# In tests, PYENV_DIR is not set, ultimately leading to "cd: null directory" in OpenSUSE
# While most `cd` implementations treat an empty argument the same as missing, that's still wrong
find_local_version_file "${PYENV_DIR:=$PWD}" || {
[ "$PYENV_DIR" != "$PWD" ] && find_local_version_file "$PWD"
} || echo "${PYENV_ROOT}/version"
fi

View file

@ -5,18 +5,39 @@ set -e
VERSION_FILE="$1"
if [ -e "$VERSION_FILE" ]; then
function is_version_safe() {
# As needed, check that the constructed path exists as a child path of PYENV_ROOT/versions
version="$1"
if [[ "$version" == ".." || "$version" == */* ]]; then
# Sanity check the value of version to prevent malicious path-traversal
(
cd "$PYENV_ROOT/versions/$version" &>/dev/null || exit 1
[[ "$PWD" == "$PYENV_ROOT/versions/"* ]]
)
return $?
else
return 0
fi
}
if [ -s "$VERSION_FILE" ]; then
# Read the first non-whitespace word from the specified version file.
# Be careful not to load it whole in case there's something crazy in it.
IFS="${IFS}"$'\r'
words=($(cut -b 1-1024 "$VERSION_FILE" | sed -n 's/^[[:space:]]*\([^[:space:]#][^[:space:]]*\).*/\1/p'))
versions=("${words[@]}")
if [ -n "$versions" ]; then
IFS=":"
echo "${versions[*]}"
exit
fi
IFS="$IFS"$'\r'
sep=
while read -n 1024 -r version _ || [[ $version ]]; do
if [[ -z "$version" || "$version" == \#* ]]; then
# Skip empty lines and comments
continue
elif ! is_version_safe "$version"; then
# CVE-2022-35861 allowed arbitrary code execution in some contexts and is mitigated by is_version_safe.
echo "pyenv: invalid version \`$version' ignored in \`$VERSION_FILE'" >&2
continue
fi
printf "%s%s" "$sep" "$version"
sep=:
done <"$VERSION_FILE"
[[ $sep ]] && { echo; exit; }
fi
exit 1

View file

@ -1,9 +1,25 @@
#!/usr/bin/env bash
# Usage: pyenv version-file-write <file> <version>
# Usage: pyenv version-file-write [-f|--force] <file> <version> [...]
#
# -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.

View file

@ -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)"
@ -29,16 +46,32 @@ versions=()
OLDIFS="$IFS"
{ IFS=:
any_not_installed=0
normalization_done=
# Unquoted $VAR does glob expansion (against the current dir's contents) after IFS-splitting
# which is undesired
set -f
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-}")
# Remove the explicit 'python-' prefix from versions like 'python-3.12'.
normalised_version="${version#python-}"
[[ $version != "${normalised_version}" ]] && normalization_done=1
if [[ $version == "system" ]] || version_exists "${normalised_version}" ; then
versions+=("${normalised_version}")
elif [[ -n $normalization_done ]] && version_exists "${version}"; then
versions+=("${version}")
elif resolved_version="$(pyenv-latest -b "${normalised_version}")"; then
versions+=("${resolved_version}")
elif [[ -n $normalization_done ]] && resolved_version="$(pyenv-latest -b "${version}")"; then
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
set +f
}
IFS="$OLDIFS"

View file

@ -1,23 +1,33 @@
#!/usr/bin/env bash
# Summary: List all Python versions available to pyenv
# Usage: pyenv versions [--bare] [--skip-aliases]
# Usage: pyenv versions [--bare] [--skip-aliases] [--skip-envs] [--executables]
#
# Lists all Python versions found in `$PYENV_ROOT/versions/*'.
#
# --bare List just the names, omit `system'
# --skip-aliases Skip symlinks to other versions and to virtual environments
# --skip-envs Skip virtual environments (under <version>/envs)
# --executables Internal. Overrides other options.
# Optimally get a deduplicated list of all executable names in Pyenv-managed
# versions and environments for `pyenv rehash'
#
set -e
[ -n "$PYENV_DEBUG" ] && set -x
unset bare
unset skip_aliases
unset bare skip_aliases skip_envs executables
# Provide pyenv completions
for arg; do
case "$arg" in
--complete )
echo --bare
echo --skip-aliases
echo --skip-envs
exit ;;
--executables ) executables=1; break ;;
--bare ) bare=1 ;;
--skip-aliases ) skip_aliases=1 ;;
--skip-envs ) skip_envs=1 ;;
* )
pyenv-help --usage versions >&2
exit 1
@ -25,15 +35,28 @@ for arg; do
esac
done
versions_dir="${PYENV_ROOT}/versions"
# Fast path for rehash: skip filtering and link resolution
if [[ -n "$executables" ]]; then
if [ -d "$versions_dir" ]; then
shopt -s dotglob nullglob
# MacOS 12+ and FreeBSD 15 support `xargs -r -0' and `basename -a'
# `sort -u` is simpler and a bit faster than `awk '!seen[$0]++'`, with the same result for rehash purposes
printf '%s\0' "$versions_dir"/*/bin/* "$versions_dir"/*/envs/*/bin/* | xargs -0 -r basename -a | sort -u
shopt -u dotglob nullglob
fi
exit 0
fi
if ! enable -f "${BASH_SOURCE%/*}"/pyenv-realpath.dylib realpath 2>/dev/null; then
if [ -n "$PYENV_NATIVE_EXT" ]; then
echo "pyenv: failed to load \`realpath' builtin" >&2
exit 1
fi
READLINK=$(type -P greadlink readlink | head -1)
READLINK=$(type -P readlink)
if [ -z "$READLINK" ]; then
echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2
exit 1
@ -70,14 +93,15 @@ else
current_versions=()
fi
if [ -n "$bare" ]; then
hit_prefix=""
miss_prefix=""
include_system=""
else
hit_prefix="* "
miss_prefix=" "
OLDIFS="$IFS"
IFS=:
# VAR=() of unquoted value does glob expansion (against the current dir's contents) after IFS-splitting
# which is undesired
set -f
if ((${BASH_VERSINFO[0]} > 3)); then
for i in $(pyenv-version-name || true); do
current_versions["$i"]="1"
@ -85,6 +109,7 @@ else
else
current_versions=($(pyenv-version-name || true))
fi
set +f
IFS="$OLDIFS"
include_system="1"
fi
@ -104,39 +129,70 @@ exists() {
}
print_version() {
if [[ ${BASH_VERSINFO[0]} -ge 4 && ${current_versions["$1"]} ]]; then
echo "${hit_prefix}$1 (set by $(pyenv-version-origin))"
elif (( ${BASH_VERSINFO[0]} <= 3 )) && exists "$1" "${current_versions[@]}"; then
echo "${hit_prefix}$1 (set by $(pyenv-version-origin))"
local version="${1:?}"
if [[ -n $bare ]]; then
echo "$version"
return
fi
local path="${2:?}"
if [[ -L "$path" ]]; then
# Only resolve the link itself for printing, do not resolve further.
# Doing otherwise would misinform the user of what the link contains.
version_repr="$version --> $(readlink "$path")"
else
echo "${miss_prefix}$1"
version_repr="$version"
fi
if [[ ${BASH_VERSINFO[0]} -ge 4 && ${current_versions["$1"]} ]]; then
echo "${hit_prefix}${version_repr} (set by $(pyenv-version-origin))"
elif (( ${BASH_VERSINFO[0]} <= 3 )) && exists "$1" "${current_versions[@]}"; then
echo "${hit_prefix}${version_repr} (set by $(pyenv-version-origin))"
else
echo "${miss_prefix}${version_repr}"
fi
num_versions=$((num_versions + 1))
}
# 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
print_version system
(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
shopt -s dotglob nullglob
for path in "$versions_dir"/*; do
versions_dir_entries=("$versions_dir"/*)
if sort --version-sort </dev/null >/dev/null 2>&1; then
# system sort supports version sorting
OLDIFS="$IFS"
# VAR=() of unquoted value does glob expansion (against the current dir's contents) after IFS-splitting
# which is undesired
set -f
IFS=$'\n'
versions_dir_entries=($(
printf "%s\n" "${versions_dir_entries[@]}" |
sort --version-sort
))
set +f
IFS="$OLDIFS"
fi
for path in "${versions_dir_entries[@]}"; do
if [ -d "$path" ]; then
if [ -n "$skip_aliases" ] && [ -L "$path" ]; then
target="$(realpath "$path")"
[ "${target%/*}" != "$versions_dir" ] || continue
[ "${target%/*/envs/*}" != "$versions_dir" ] || continue
[ "${target%/*}" == "$versions_dir" ] && continue
[ "${target%/*/envs/*}" == "$versions_dir" ] && continue
fi
print_version "${path##*/}" "$path"
# virtual environments created by anaconda/miniconda/pyenv-virtualenv
if [[ -z $skip_envs ]]; then
for env_path in "${path}/envs/"*; do
if [ -d "${env_path}" ]; then
print_version "${env_path#${PYENV_ROOT}/versions/}" "${env_path}"
fi
done
fi
print_version "${path##*/}"
# virtual environments created by anaconda/miniconda
for env_path in "${path}/envs/"*; do
if [ -d "${env_path}" ]; then
print_version "${env_path#${PYENV_ROOT}/versions/}"
fi
done
fi
done
shopt -u dotglob nullglob

View file

@ -2,13 +2,14 @@
#
# Summary: Display the full path to an executable
#
# Usage: pyenv which <command> [--nosystem]
# Usage: pyenv which <command> [--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,41 +19,73 @@ 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"
local path_before
local -a paths_to_remove
IFS=: paths_to_remove=($1)
local path_to_remove path_before
local result=":${PATH//\~/$HOME}:"
while [ "$path_before" != "$result" ]; do
path_before="$result"
result="${result//:$path_to_remove:/:}"
for path_to_remove in "${paths_to_remove[@]}"; do
while true; do
path_before="$result"
result="${result//:$path_to_remove:/:}"
if [[ ${#path_before} == "${#result}" ]]; then break; fi
done
done
result="${result%:}"
echo "${result#:}"
result="${result:1:${#result}-2}"
echo "$result"
}
PYENV_COMMAND="$1"
if [ -z "$PYENV_COMMAND" ]; then
pyenv-help --usage which >&2
exit 1
fi
OLDIFS="$IFS"
IFS=: versions=(${PYENV_VERSION:-$(pyenv-version-name)})
# Unquoted $VAR or VAR=() of unquoted value does glob expansion (against the current dir's contents)
# after IFS-splitting which is undesired
set -f
IFS=: versions=(${PYENV_VERSION:-$(pyenv-version-name -f)})
set +f
IFS="$OLDIFS"
declare -a nonexistent_versions
for version in "${versions[@]}" "$system"; do
if [ "$version" = "system" ]; then
PATH="$(remove_from_path "${PYENV_ROOT}/shims")"
PYENV_COMMAND_PATH="$(command -v "$PYENV_COMMAND" || true)"
PROGRAM="$(echo "$PYENV_COMMAND" | tr a-z- A-Z_ | sed 's/[^A-Z0-9_]/_/g')"
NR_CUSTOM_SHIM_PATHS="_PYENV_SHIM_PATHS_$PROGRAM"
SEARCH_PATH="$(remove_from_path "${PYENV_ROOT}/shims${!NR_CUSTOM_SHIM_PATHS:+:${!NR_CUSTOM_SHIM_PATHS}}")"
PYENV_COMMAND_PATH="$(PATH="$SEARCH_PATH" command -v "$PYENV_COMMAND" || true)"
else
PYENV_COMMAND_PATH="${PYENV_ROOT}/versions/${version}/bin/${PYENV_COMMAND}"
# $version may be a prefix to be resolved by pyenv-latest
version_path="$(pyenv-prefix "${version}" 2>/dev/null)" || \
{ nonexistent_versions+=("$version"); continue; }
# resolve $version for hooks
version="$(basename "$version_path")"
PYENV_COMMAND_PATH="$version_path/bin/${PYENV_COMMAND}"
unset version_path
fi
if [ -x "$PYENV_COMMAND_PATH" ]; then
break
@ -69,31 +102,24 @@ done
if [ -x "$PYENV_COMMAND_PATH" ]; then
echo "$PYENV_COMMAND_PATH"
else
any_not_installed=0
for version in "${versions[@]}"; do
if [ "$version" = "system" ]; then
continue
fi
if ! [ -d "${PYENV_ROOT}/versions/${version}" ]; then
if (( ${#nonexistent_versions[@]} )); then
for version in "${nonexistent_versions[@]}"; do
echo "pyenv: version \`$version' is not installed (set by $(pyenv-version-origin))" >&2
any_not_installed=1
fi
done
if [ "$any_not_installed" = 1 ]; then
exit 1
done
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 multiple"
echo " Python versions to be found at the same time."
} >&2
fi
fi
exit 127

View file

@ -1,4 +1,4 @@
.TH PYENV 1 "12 Dec 2020" "PYENV"
.TH PYENV 1 "24 Apr 2023" "PYENV"
.SH NAME
pyenv \- Simple Python version management
.SH SYNOPSIS
@ -12,10 +12,12 @@ pyenv lets you easily switch between multiple versions of Python\. It's simple,
\fBAppend\fR the following to \fB$HOME/.bashrc\fR
.P
.RS 15
source /usr/share/pyenv/pyenv_user_setup.bash
.nf
if command -v pyenv 1>/dev/null 2>&1; then\n
eval "$(pyenv init - bash)" \n
fi
.fi
.RE
.\"OR
.\"\fBsh echo \-e \if command \-v pyenv 1>/dev/null 2>&1; then\en eval "$(pyenv init \-)"\enfi' >> ~/\.bashrc\fR
.RS 3
.P
.nh
@ -106,7 +108,7 @@ Set or show the shell\-specific Python version
List existing pyenv shims
.TP
.B uninstall
Uninstall a specific Python version
Uninstall Python versions
.TP
.B version
Show the current Python version(s) and its origin
@ -232,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
@ -452,10 +455,10 @@ $ pyenv versions
.fi
.IP "" 0
.SS "pyenv uninstall"
Uninstall a specific Python version\.
Uninstall Python versions\.
.IP "" 4
.nf
Usage: pyenv uninstall [\-f|\-\-force] <version>
Usage: pyenv uninstall [\-f|\-\-force] <version> ...
\-f Attempt to remove the specified version without prompting
for confirmation\. If the version does not exist, do not

3
plugins/.gitignore vendored
View file

@ -2,3 +2,6 @@
!/.gitignore
!/version-ext-compat
!/python-build
!/pyenv-binary
!/pyenv-link
/python-build/test/build

View file

@ -0,0 +1,94 @@
# pyenv-binary (experimental)
Package an installed Python version into a relocatable archive that can be
installed on another machine.
This is experimental and intentionally decoupled: it does not change
`pyenv install` or any other command. You drive it explicitly through
`pyenv binary`. Run `pyenv binary <command> --help` for details on a command.
## Portability
An archive is portable across machines that share its build platform (OS,
architecture and a compatible libc) and have the recorded system libraries. It
is not portable across, say, glibc and musl, or to an older glibc; the platform
and dependency metadata exist to catch that.
## Commands
### `pyenv binary package [-v|--verbose] <version>[:<entry>] --archive-base-url <url>`
Installs `<version>` from source under a separate name, packages that install
with `save`, then emits a python-build definition for it with
`generate-installer`. With no explicit entry, the name is generated from the
current platform, platform version and architecture. An explicit entry keeps
the existing custom-build workflow.
Pass `-v` to show build progress from `pyenv install`.
```sh
pyenv binary package 3.12.7 \
--archive-base-url https://example.com/binaries
# On Debian 12 x86_64, writes 3.12.7-debian-12-x86_64.tar.gz,
# its .meta file and a `3.12.7-debian-12-x86_64' definition.
pyenv binary package 3.12.7:company-python \
--archive-base-url https://example.com/binaries
```
The archive, metadata and definition land in the current directory, named after
the entry. Host the archive under `<url>` and drop the definition into
python-build's definition directory.
### `pyenv binary package-name <version>`
Prints the automatically generated entry name without building anything. Linux
uses the distribution name and version, macOS uses the macOS version, and other
systems use the name and release reported by `uname`. All names include the
architecture.
```sh
pyenv binary package-name 3.12.7
# 3.12.7-debian-12-x86_64
```
### `pyenv binary save <version> [<output-dir>] [--name <name>]`
Packs an installed version into `<version>-<platform>.tar.gz` (relative paths)
and writes `<version>-<platform>.meta` describing the build platform (OS, arch,
distro and libc version) and the system libraries the build links against. Use
`--name` to set a different base name for both files.
```sh
pyenv binary save 3.12.7 ./dist
```
### `pyenv binary generate-installer <metadata-file> --archive-url <url> [-o <output>]`
Reads a `.meta` file and emits a python-build definition. Drop it into
python-build's definition directory and `pyenv install <name>` installs the
archive like any other version. The archive location is a parameter, so you can
host it anywhere (it does not have to be a pyenv location); the archive itself
must sit next to the `.meta` file so its checksum can be baked into the
definition.
The definition refuses to install on a different OS/architecture, or an older
glibc, than the archive was built for, and checks that the system libraries it
needs are present.
```sh
pyenv binary generate-installer ./dist/3.12.7-linux-x86_64.meta \
--archive-url https://example.com/3.12.7-linux-x86_64.tar.gz \
-o "$(pyenv root)/plugins/python-build/share/python-build/3.12.7-linux-x86_64"
pyenv install 3.12.7-linux-x86_64
```
### `pyenv binary relocate <prefix>`
Rewrites the rpaths of a Python tree unpacked into `<prefix>` so the interpreter
and its extension modules load the bundled libraries from there rather than from
the path the archive was built at. Uses `patchelf`. The generated definition
calls this; you rarely run it by hand.
Relocation is implemented for Linux; macOS is not wired up yet.

View file

@ -0,0 +1,65 @@
#!/usr/bin/env bash
#
# Summary: Package an installed Python version as a relocatable binary (experimental)
#
# Usage: pyenv binary <command> [<args>]
#
# `pyenv binary` packages an already-installed Python version into a relocatable
# archive that can be installed on another machine. It is experimental and does
# not touch `pyenv install' or any other command.
#
# Run `pyenv binary' to list its commands, or `pyenv binary <command> --help'
# for command-specific help.
#
set -e
[ -n "$PYENV_DEBUG" ] && set -x
libexec="${BASH_SOURCE%/*}/../libexec"
# The pyenv launcher only puts a plugin's bin on PATH, but `pyenv-help' looks a
# command up there. Add our libexec so the subcommands, and the help text they
# print, can be found.
export PATH="${libexec}:${PATH}"
list_commands() {
local path
for path in "$libexec"/pyenv-binary-*; do
[ -e "$path" ] && echo "${path##*/pyenv-binary-}"
done
}
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
shift
if [ -z "$1" ]; then
list_commands
else
command_path="${libexec}/pyenv-binary-$1"
shift
[ -x "$command_path" ] && exec "$command_path" --complete "$@"
fi
exit
fi
subcommand="$1"
if [ -z "$subcommand" ]; then
{ pyenv-help binary
echo
echo "Commands:"
list_commands | sed 's/^/ /'
} >&2
exit 1
fi
shift
command_path="${libexec}/pyenv-binary-${subcommand}"
if [ ! -x "$command_path" ]; then
echo "pyenv-binary: no such command \`${subcommand}'" >&2
exit 1
fi
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
exec pyenv-help "binary-${subcommand}"
fi
exec "$command_path" "$@"

View file

@ -0,0 +1,224 @@
#!/usr/bin/env bash
#
# Summary: Generate a python-build definition for a saved binary archive
#
# Usage: pyenv binary generate-installer <metadata-file> --archive-url <url> [-o <output>]
#
# Reads a metadata file written by `pyenv binary save' and emits a python-build
# definition. Dropped into python-build's definition directory, it installs the
# archive like any other version: `pyenv install' downloads it from <url>,
# checks the platform and the required system libraries, unpacks it, then
# rewrites rpaths so the copy runs from its prefix.
#
# The archive must sit next to the metadata file so its checksum can be baked
# into the definition; `pyenv binary save' writes the two together.
#
# <metadata-file> A .meta file written by `pyenv binary save'.
# The corresponding binary package written by `pyenv binary save'
# needs to be present alongside it.
# --archive-url <url> The URL for the resulting installation script to download
# the package from.
# -o <output> Write the definition here (default: stdout).
#
set -e
[ -n "$PYENV_DEBUG" ] && set -x
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
echo --archive-url
echo -o
exit
fi
metadata=""
archive_url=""
output=""
while [ $# -gt 0 ]; do
case "$1" in
--archive-url )
[ $# -ge 2 ] || { echo "pyenv-binary: --archive-url needs a value" >&2; exit 1; }
archive_url="$2"; shift 2 ;;
-o )
[ $# -ge 2 ] || { echo "pyenv-binary: -o needs a value" >&2; exit 1; }
output="$2"; shift 2 ;;
-* )
echo "pyenv-binary: unknown option \`$1'" >&2; exit 1 ;;
* )
[ -z "$metadata" ] || { echo "pyenv-binary: unexpected argument \`$1'" >&2; exit 1; }
metadata="$1"; shift ;;
esac
done
if [ -z "$metadata" ] || [ -z "$archive_url" ]; then
pyenv-help --usage binary-generate-installer >&2
exit 1
fi
version="" os="" arch="" distro="" libc="" build_prefix="" archive=""
deps=""
while IFS='=' read -r key value; do
case "$key" in
version ) version="$value" ;;
os ) os="$value" ;;
arch ) arch="$value" ;;
distro ) distro="$value" ;;
libc ) libc="$value" ;;
build_prefix ) build_prefix="$value" ;;
archive ) archive="$value" ;;
dep ) deps="${deps:+$deps }$value" ;;
esac
done < "$metadata"
# Fail here if the metadata is incomplete, rather than bake a blank into the
# definition where a missing arch would give a confusing platform error.
for field in version os arch archive; do
if [ -z "${!field}" ]; then
echo "pyenv-binary: metadata is missing \`${field}'" >&2
exit 1
fi
done
# Mach-O load commands contain the prefix where Python was built.
if [ "$os" = "Darwin" ] && [ -z "$build_prefix" ]; then
echo "pyenv-binary: metadata is missing \`build_prefix'" >&2
exit 1
fi
# The glibc floor only applies on Linux; require it there so the definition can
# tell whether the target is new enough to run the binaries.
if [ "$os" = "Linux" ] && [ -z "$libc" ]; then
echo "pyenv-binary: metadata is missing \`libc'" >&2
exit 1
fi
# python-build downloads the archive itself, so the checksum has to be baked in.
# The archive sits next to the metadata `save' wrote it alongside.
archive_path="$(dirname "$metadata")/${archive}"
if [ ! -r "$archive_path" ]; then
echo "pyenv-binary: cannot read the archive \`${archive_path}' to checksum it" >&2
exit 1
fi
if command -v sha256sum >/dev/null 2>&1; then
sha256="$(sha256sum "$archive_path")"; sha256="${sha256%% *}"
elif command -v shasum >/dev/null 2>&1; then
sha256="$(shasum -a 256 "$archive_path")"; sha256="${sha256%% *}"
elif command -v openssl >/dev/null 2>&1; then
sha256="$(openssl dgst -sha256 "$archive_path")"; sha256="${sha256##* }"
else
echo "pyenv-binary: need sha256sum, shasum or openssl to checksum the archive" >&2
exit 1
fi
emit() {
# The values known now go in as %q-quoted assignments so a stray quote or space
# in the URL or metadata cannot break the definition or inject into it. The body
# below is a quoted here-doc, verbatim.
{
printf '# python-build definition for prebuilt Python %s (%s/%s%s).\n' \
"$version" "$os" "$arch" "${distro:+, $distro}"
echo "# Generated by \`pyenv binary generate-installer'."
echo
printf 'EXPECT_OS=%q\n' "$os"
printf 'EXPECT_ARCH=%q\n' "$arch"
printf 'EXPECT_LIBC=%q\n' "$libc"
printf 'BUILD_PREFIX=%q\n' "$build_prefix"
printf 'VERSION=%q\n' "$version"
printf 'ARCHIVE_URL=%q\n' "$archive_url"
printf 'SHA256=%q\n' "$sha256"
printf 'DEPS=%q\n' "$deps"
}
cat <<'EOF'
os="$(uname -s)"
arch="$(uname -m)"
if [ "$os" != "$EXPECT_OS" ] || [ "$arch" != "$EXPECT_ARCH" ]; then
echo "pyenv-binary: this archive is for ${EXPECT_OS}/${EXPECT_ARCH}, not ${os}/${arch}" >&2
exit 1
fi
# Refuse a target whose glibc is older than the one the archive was built on;
# the dynamic loader would reject the binaries.
case "$EXPECT_LIBC" in
"glibc "* )
build_libc="${EXPECT_LIBC#glibc }"
target_libc="$(getconf GNU_LIBC_VERSION 2>/dev/null || true)"
case "$target_libc" in
"glibc "* )
target_libc="${target_libc#glibc }"
older="$(printf '%s\n%s\n' "$build_libc" "$target_libc" | sort -V | head -n1)"
if [ "$older" = "$target_libc" ] && [ "$target_libc" != "$build_libc" ]; then
echo "pyenv-binary: archive needs glibc ${build_libc} or newer, but this system has ${target_libc}" >&2
exit 1
fi
;;
esac
;;
esac
# Required system libraries must already be present on the target. Linux lists
# the soname first; FreeBSD lists it in the resolved path, so normalize that
# path before matching exact names.
cache=""
if command -v ldconfig &>/dev/null; then
case "$os" in
FreeBSD )
cache="$(ldconfig -r 2>/dev/null)" &&
cache="$(printf '%s\n' "$cache" | awk -F ' *=> *' '{ sub(/^.*\//, "", $2); print $2 }')" \
|| cache=""
;;
* )
cache="$(ldconfig -p 2>/dev/null)" || cache=""
;;
esac
fi
if [ -n "$cache" ]; then
missing=""
for dep in $DEPS; do
printf '%s\n' "$cache" | awk -v d="$dep" '$1 == d { found = 1 } END { exit !found }' \
|| missing="${missing} ${dep}"
done
if [ -n "$missing" ]; then
echo "pyenv-binary: missing required system libraries:${missing}" >&2
exit 1
fi
elif [ -n "$DEPS" ]; then
echo "pyenv-binary: cannot check required system libraries (ldconfig cache unavailable)" >&2
fi
case "$os" in
Darwin )
for tool in otool install_name_tool; do
if ! command -v "$tool" >/dev/null 2>&1; then
echo "pyenv-binary: need ${tool} to relocate the binary" >&2
exit 1
fi
done
;;
* )
if ! command -v patchelf >/dev/null 2>&1; then
echo "pyenv-binary: need patchelf to relocate the binary" >&2
exit 1
fi
;;
esac
build_package_relocate() {
if [ "$os" = "Darwin" ]; then
pyenv binary relocate "$PREFIX_PATH" "$BUILD_PREFIX"
else
pyenv binary relocate "$PREFIX_PATH"
fi
}
install_package "Python-${VERSION}-binary" "${ARCHIVE_URL}#${SHA256}" copy relocate
EOF
}
if [ -n "$output" ]; then
emit > "$output"
echo "Wrote definition to ${output}"
else
emit
fi

View file

@ -0,0 +1,83 @@
#!/usr/bin/env bash
#
# Summary: Create an installable binary package from a Python version
#
# Usage: pyenv binary package [-v|--verbose] <version>[:<entry>] --archive-base-url <url>
#
# Installs <version> from source under a separate entry name, saves it as a
# binary package, then emits a python-build definition for that package.
# The archive, metadata and definition are written to the current directory
# as <entry>.tar.gz, <entry>.meta and <entry>.
#
# <version> A version `pyenv install' knows how to build.
# <entry> The optional name to build under and install the
# binary as. If omitted, a name is generated from the
# current platform, platform version and architecture.
# -v,--verbose Show build progress from `pyenv install'.
# --archive-base-url <url>
# Where the archive will be hosted; the definition
# downloads it from <url>/<entry>.tar.gz.
#
set -e
[ -n "$PYENV_DEBUG" ] && set -x
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
echo --archive-base-url
echo --verbose
exec pyenv-install --list --bare
fi
spec=""
archive_base_url=""
verbose=""
while [ $# -gt 0 ]; do
case "$1" in
--archive-base-url )
[ $# -lt 2 ] && { echo "pyenv-binary: --archive-base-url needs a value" >&2; exit 1; }
archive_base_url="$2"; shift ;;
-v|--verbose)
verbose=1 ;;
-* )
echo "pyenv-binary: unknown option \`$1'" >&2; exit 1 ;;
* )
[ -z "$spec" ] || { echo "pyenv-binary: unexpected argument \`$1'" >&2; exit 1; }
spec="$1"
;;
esac
shift
done
if [ -z "$spec" ] || [ -z "$archive_base_url" ]; then
pyenv-help --usage binary-package >&2
exit 1
fi
case "$spec" in
*?:?* ) entry="${spec##*:}" ;;
* ) entry="$(pyenv-binary-package-name "$spec")"; spec="${spec}:${entry}" ;;
esac
case "$entry" in
# `pyenv install' reads a trailing `:latest' as part of the version rather than
# as an alias, so nothing would end up installed under that name.
latest )
echo "pyenv-binary: \`latest' cannot be used as an entry name" >&2
exit 1
;;
# The entry becomes a directory name under versions/. `pyenv install' does not
# validate the alias, and `save' only checks once the build is done, so refuse
# a name that could point elsewhere before compiling anything.
*/* | .. | . )
echo "pyenv-binary: invalid entry name \`${entry}'" >&2
exit 1
;;
esac
# `pyenv install' puts a `<version>:<alias>' build under versions/<alias>.
pyenv-install ${verbose:+--verbose} "$spec"
pyenv-binary-save "$entry" "$PWD" --name "$entry"
pyenv-binary-generate-installer "${entry}.meta" \
--archive-url "${archive_base_url%/}/${entry}.tar.gz" -o "$entry"

View file

@ -0,0 +1,73 @@
#!/usr/bin/env bash
#
# Summary: Generate a binary package name for the current platform
#
# Usage: pyenv binary package-name <version>
#
# Prints a package name containing the Python version, platform name,
# platform version and architecture.
#
set -e
[ -n "$PYENV_DEBUG" ] && set -x
if [ "$1" = "--complete" ]; then
exec pyenv-install --list --bare
fi
if [ $# -ne 1 ]; then
pyenv-help --usage binary-package-name >&2
exit 1
fi
version="$1"
case "$version" in
*/* | .. | . | *[[:cntrl:]]* )
echo "pyenv-binary: invalid version name \`${version}'" >&2
exit 1
;;
esac
version="$(pyenv-latest -f -k "$version")"
os="$(uname -s)"
arch="$(uname -m)"
distro=""
distro_version=""
case "$os" in
Linux )
if type -p lsb_release >/dev/null; then
distro="$(lsb_release -si)"
distro_version="$(lsb_release -sr)"
elif [ -r /etc/os-release ]; then
distro="$(. /etc/os-release && printf '%s' "${ID:-}")"
distro_version="$(. /etc/os-release && printf '%s' "${VERSION_ID:-}")"
fi
;;
Darwin )
distro="macos"
distro_version="$(sw_vers -productVersion)"
;;
* )
distro="$os"
distro_version="$(uname -r)"
;;
esac
slug() {
printf '%s' "$1" |
tr '[:upper:] ' '[:lower:]-' |
tr -cd 'a-z0-9._-'
}
distro="$(slug "$distro")"
distro_version="$(slug "$distro_version")"
arch="$(slug "$arch")"
if [ -z "$distro" ] || [ -z "$distro_version" ] || [ -z "$arch" ]; then
echo "pyenv-binary: could not determine the package platform" >&2
exit 1
fi
printf '%s-%s-%s-%s\n' "$version" "$distro" "$distro_version" "$arch"

View file

@ -0,0 +1,137 @@
#!/usr/bin/env bash
#
# Summary: Rewrite an unpacked Python's library paths so it runs from its prefix
#
# Usage: pyenv binary relocate <prefix> [<build-prefix>]
#
# Rewrites the library paths of a Python tree that was unpacked into <prefix>
# so the interpreter and its extension modules load the bundled libraries from
# their new location rather than the path it was built at. Requires patchelf on
# Linux and FreeBSD, or otool and install_name_tool on macOS.
#
# The definition that `pyenv binary generate-installer' produces calls this
# after `install_package ... copy' has laid the tree down.
#
set -e
[ -n "$PYENV_DEBUG" ] && set -x
if [ "$1" = "--complete" ]; then
exit
fi
prefix="$1"
if [ -z "$prefix" ]; then
pyenv-help --usage binary-relocate >&2
exit 1
fi
if [ "$(uname -s)" = "Darwin" ]; then
build_prefix="${2%/}"
if [ -z "$build_prefix" ]; then
echo "pyenv-binary: need the original build prefix to relocate a macOS binary" >&2
exit 1
fi
for tool in otool install_name_tool; do
if ! command -v "$tool" >/dev/null 2>&1; then
echo "pyenv-binary: need ${tool} to relocate the binary" >&2
exit 1
fi
done
relocate_macho() {
local file="$1" new_rpath="$2"
local load_commands install_ids rpaths dependency install_id rpath replacement
load_commands="$(otool -L "$file")"
install_ids="$(otool -D "$file" 2>/dev/null || true)"
rpaths="$(otool -l "$file")"
install_id="$(printf '%s\n' "$install_ids" | sed -n '2s/^[[:space:]]*//p')"
while IFS= read -r dependency; do
case "$dependency" in
"$build_prefix"/lib/* )
if [ "$dependency" != "$install_id" ]; then
replacement="@rpath/${dependency#"$build_prefix"/lib/}"
install_name_tool -change "$dependency" "$replacement" "$file"
fi
;;
esac
done < <(printf '%s\n' "$load_commands" | tail -n +2 | sed -E \
's/^[[:space:]]*//; s/[[:space:]]+\(compatibility version.*$//')
case "$install_id" in
"$build_prefix"/lib/* )
replacement="@rpath/${install_id#"$build_prefix"/lib/}"
install_name_tool -id "$replacement" "$file"
;;
esac
while IFS= read -r rpath; do
if [ "$rpath" = "$build_prefix/lib" ]; then
install_name_tool -rpath "$rpath" "$new_rpath" "$file"
fi
done < <(printf '%s\n' "$rpaths" | awk '
/cmd LC_RPATH/ { found = 1; next }
found && /^[[:space:]]*path / {
sub(/^[[:space:]]*path /, "")
sub(/ \(offset [0-9]+\)$/, "")
print
found = 0
}
')
}
found=0
for file in "$prefix"/bin/*; do
[[ -f $file && -x $file && ! -L $file ]] || continue
otool -L "$file" >/dev/null 2>&1 || continue
relocate_macho "$file" '@executable_path/../lib'
found=1
done
if [ "$found" -eq 0 ]; then
echo "pyenv-binary: found no interpreter to relocate under \`${prefix}/bin'" >&2
exit 1
fi
for file in "$prefix"/lib/*.dylib; do
[[ -f $file && ! -L $file ]] || continue
relocate_macho "$file" '@loader_path'
done
while IFS= read -r so; do
relocate_macho "$so" '@loader_path/../..'
done < <(find "$prefix" -type f -path '*/lib/python*/lib-dynload/*.so')
exit
fi
# patchelf can add an rpath and write one of any length; chrpath can only shorten
# an existing one, which is not enough to relocate every build, so require it.
if ! command -v patchelf >/dev/null 2>&1; then
echo "pyenv-binary: need patchelf to relocate the binary" >&2
exit 1
fi
# The interpreter loads libpython from ../lib. Patch every ELF binary in bin/ so
# this holds whatever the interpreter is named (python3, python2.7, ...); the
# scripts alongside it (pip, idle) are not ELF, so `--print-rpath' fails on them
# and they are skipped. A tree with no interpreter at all did not unpack the way
# we expect, so treat that as an error rather than quietly relocating nothing.
found=0
for file in "$prefix"/bin/*; do
[[ -f $file && -x $file && ! -L $file ]] || continue
patchelf --print-rpath "$file" >/dev/null 2>&1 || continue
patchelf --set-rpath "$prefix/lib" "$file"
found=1
done
if [ "$found" -eq 0 ]; then
echo "pyenv-binary: found no interpreter to relocate under \`${prefix}/bin'" >&2
exit 1
fi
# The extension modules CPython built are the only other objects with an rpath
# into the old prefix, so point them at lib/ as well. Anything a wheel installed
# carries an rpath of its own, often into a bundled library directory beside it,
# and would stop loading if we overwrote it. Each match is an ELF object we expect
# to patch, so let a failure stop us rather than swallow it.
while IFS= read -r so; do
patchelf --set-rpath "$prefix/lib" "$so"
done < <(find "$prefix" -path '*/lib-dynload/*.so')

View file

@ -0,0 +1,157 @@
#!/usr/bin/env bash
#
# Summary: Save an installed Python version as a relocatable archive
#
# Usage: pyenv binary save <version> [<output-dir>] [--name <name>]
#
# Packs an installed version into a relocatable .tar.gz (relative paths) and
# writes a metadata file listing the build platform and the system libraries
# it links against, so an installer can check compatibility before unpacking.
#
# <version> An installed version, as listed by `pyenv versions --bare'.
# <output-dir> Where to write the archive and metadata (default: `.').
# --name <name> Use <name> as the archive and metadata base name instead of
# <version>-<platform>.
#
set -e
[ -n "$PYENV_DEBUG" ] && set -x
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
echo --name
exec pyenv-versions --bare
fi
version=""
output_dir=""
package_name=""
while [ $# -gt 0 ]; do
case "$1" in
--name )
[ $# -ge 2 ] && [ -n "$2" ] || { echo "pyenv-binary: --name needs a value" >&2; exit 1; }
package_name="$2"; shift 2 ;;
-* )
echo "pyenv-binary: unknown option \`$1'" >&2; exit 1 ;;
* )
if [ -z "$version" ]; then
version="$1"
elif [ -z "$output_dir" ]; then
output_dir="$1"
else
echo "pyenv-binary: unexpected argument \`$1'" >&2
exit 1
fi
shift ;;
esac
done
output_dir="${output_dir:-$PWD}"
if [ -z "$version" ]; then
echo "Usage: pyenv binary save <version> [<output-dir>] [--name <name>]" >&2
exit 1
fi
# A version is a single directory name under versions/. With no slash allowed,
# the only remaining names that could point elsewhere are `.' and `..'.
case "$version" in
*/* | .. | . )
echo "pyenv-binary: invalid version name \`${version}'" >&2
exit 1
;;
esac
case "$package_name" in
*/* | .. | . | *[[:cntrl:]]* )
echo "pyenv-binary: invalid package name \`${package_name}'" >&2
exit 1
;;
esac
prefix="${PYENV_ROOT}/versions/${version}"
if [ ! -d "${prefix}/bin" ]; then
echo "pyenv-binary: version \`${version}' is not installed" >&2
exit 1
fi
os="$(uname -s)"
arch="$(uname -m)"
platform="$(printf '%s' "$os" | tr '[:upper:]' '[:lower:]')-${arch}"
# Record the distro and libc version. Platform and arch alone are too coarse to
# judge compatibility: a build is only portable to a matching libc (e.g. a
# glibc 2.36 build will not load on an older glibc, nor on musl at all).
distro=""
libc=""
if [ -r /etc/os-release ]; then
distro="$( . /etc/os-release && printf '%s %s' "${ID:-}" "${VERSION_ID:-}" )"
elif [ "$os" = "Darwin" ]; then
distro="macos $(sw_vers -productVersion 2>/dev/null)"
fi
if [ "$os" = "Linux" ]; then
libc="$(getconf GNU_LIBC_VERSION 2>/dev/null || true)"
fi
if [ "$os" != "Darwin" ] && ! LC_ALL=C readelf --version &>/dev/null; then
echo "pyenv-binary: need readelf to inspect shared libraries" >&2
exit 1
fi
# List the external shared libraries the install links against: those that
# resolve outside its own prefix, so they must already exist on the target.
# The interpreter plus every bundled shared object are inspected.
system_deps() {
local f needed
{
for f in "${prefix}"/bin/python*; do
[ -e "$f" ] && printf '%s\n' "$f"
done
# CPython ships its extension modules as *.so (and *.dylib on macOS). A
# bare *.so.* is unusual for CPython itself, but the odd build carries a
# versioned copy alongside, so match it too rather than miss a dependency.
find "${prefix}" -type f \( -name '*.so' -o -name '*.so.*' -o -name '*.dylib' \)
} | sort -u | while IFS= read -r f; do
if [ "$os" = "Darwin" ]; then
otool -L "$f" 2>/dev/null | tail -n +2 | awk -v pfx="${prefix}/" \
'$1 !~ /^@/ && substr($1, 1, length(pfx)) != pfx { print $1 }'
else
# GNU binutils 2.44 writes "(NEEDED) ... [name]"; FreeBSD 15.1 writes
# "NEEDED ... [name]". readelf(1) documents -d, not its text format.
needed="$(LC_ALL=C readelf -dW "$f" 2>/dev/null | awk \
'$2 == "(NEEDED)" || $2 == "NEEDED" { sub(/^.*\[/, ""); sub(/\].*$/, ""); print }' | tr '\n' ' ')"
# Linux and FreeBSD ldd write resolved libraries as
# "name => /absolute/path (address)"; entries without "=>" are ignored.
LC_ALL=C ldd "$f" 2>/dev/null | awk -v needed="$needed" -v pfx="${prefix}/" '
BEGIN {
split(needed, deps, " ")
for (i in deps) direct[deps[i]] = 1
}
$1 in direct && $2 == "=>" && $3 ~ /^\// && substr($3, 1, length(pfx)) != pfx { print $1 }
'
fi
done | sort -u
}
mkdir -p "$output_dir"
package_name="${package_name:-${version}-${platform}}"
archive="${package_name}.tar.gz"
metadata="${package_name}.meta"
tar -C "$(dirname "$prefix")" -czf "${output_dir}/${archive}" "$(basename "$prefix")"
{
echo "# pyenv-binary metadata"
echo "version=${version}"
echo "os=${os}"
echo "arch=${arch}"
echo "platform=${platform}"
[ -n "$distro" ] && echo "distro=${distro}"
[ -n "$libc" ] && echo "libc=${libc}"
echo "build_prefix=${prefix}"
echo "archive=${archive}"
system_deps | while IFS= read -r dep; do
[ -n "$dep" ] && echo "dep=${dep}"
done
} > "${output_dir}/${metadata}"
echo "Saved ${archive} and ${metadata} to ${output_dir}"

View file

@ -0,0 +1,212 @@
#!/usr/bin/env bats
load test_helper
create_meta() {
local os="${1-Linux}"
local arch="${2-x86_64}"
local libc="${3-glibc 2.17}"
local build_prefix="${4-}"
local archive="${BATS_TEST_TMPDIR}/3.12.7.tar.gz"
local meta="${BATS_TEST_TMPDIR}/sample.meta"
rm -rf "${BATS_TEST_TMPDIR}/archive"
mkdir -p "${BATS_TEST_TMPDIR}/archive/3.12.7/bin"
printf '#!/bin/sh\n' > "${BATS_TEST_TMPDIR}/archive/3.12.7/bin/python"
chmod +x "${BATS_TEST_TMPDIR}/archive/3.12.7/bin/python"
tar -C "${BATS_TEST_TMPDIR}/archive" -czf "$archive" 3.12.7
{
echo "version=3.12.7"
echo "os=${os}"
echo "arch=${arch}"
[ -z "$libc" ] || echo "libc=${libc}"
[ -z "$build_prefix" ] || echo "build_prefix=${build_prefix}"
echo "archive=${archive##*/}"
} > "$meta"
echo "$meta"
}
@test "completion lists the options" {
run pyenv-binary-generate-installer --complete
assert_success "--archive-url
-o"
}
@test "fails with no arguments" {
create_stub pyenv-help "echo usage"
run pyenv-binary-generate-installer
assert_failure "usage"
}
@test "fails without an archive url" {
create_stub pyenv-help "echo usage"
run pyenv-binary-generate-installer "$(create_meta)"
assert_failure "usage"
}
@test "fails when --archive-url has no value" {
run pyenv-binary-generate-installer "$(create_meta)" --archive-url
assert_failure "pyenv-binary: --archive-url needs a value"
}
@test "rejects a second positional argument" {
run pyenv-binary-generate-installer "$(create_meta)" extra --archive-url http://x/a.tar.gz
assert_failure "pyenv-binary: unexpected argument \`extra'"
}
@test "fails for a metadata file that cannot be read" {
run pyenv-binary-generate-installer /no/such.meta --archive-url http://x/a.tar.gz
assert_failure
}
@test "fails when macOS metadata is missing the build prefix" {
run pyenv-binary-generate-installer "$(create_meta Darwin arm64 '')" \
--archive-url http://x/a.tar.gz
assert_failure "pyenv-binary: metadata is missing \`build_prefix'"
}
@test "quotes the macOS build prefix in the generated definition" {
local out="${BATS_TEST_TMPDIR}/definition"
pyenv-binary-generate-installer \
"$(create_meta Darwin arm64 '' '/build prefix/$name')" \
--archive-url http://example.com/a.tar.gz -o "$out"
run grep '^BUILD_PREFIX=' "$out"
assert_success 'BUILD_PREFIX=/build\ prefix/\$name'
}
@test "fails when required metadata is missing" {
local field meta
for field in version os arch archive; do
meta="$(create_meta)"
#cannot use -i: GNU sed requires -i[suf], BSD sed required -i <suf>
sed "/^${field}=/d" "$meta" > "${meta}.tmp"; mv "${meta}"{.tmp,}
run pyenv-binary-generate-installer "$meta" --archive-url http://x/a.tar.gz
assert_failure "pyenv-binary: metadata is missing \`${field}'"
done
}
@test "fails when Linux metadata is missing libc" {
run pyenv-binary-generate-installer "$(create_meta Linux x86_64 '')" \
--archive-url http://x/a.tar.gz
assert_failure "pyenv-binary: metadata is missing \`libc'"
}
@test "refuses a host whose glibc is older than the archive" {
local out="${BATS_TEST_TMPDIR}/definition"
pyenv-binary-generate-installer "$(create_meta Linux x86_64 'glibc 99.0')" \
--archive-url http://example.com/a.tar.gz -o "$out"
create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac'
create_stub getconf 'echo "glibc 2.31"'
run bash "$out"
assert_failure "pyenv-binary: archive needs glibc 99.0 or newer, but this system has 2.31"
}
@test "checks required libraries in the FreeBSD ldconfig cache" {
local out="${BATS_TEST_TMPDIR}/definition"
local meta="$(create_meta FreeBSD amd64 '')"
printf 'dep=libc.so.7\ndep=libmissing.so.1\n' >> "$meta"
pyenv-binary-generate-installer "$meta" \
--archive-url http://example.com/a.tar.gz -o "$out"
create_stub uname 'case "$1" in -s) echo FreeBSD;; -m) echo amd64;; esac'
create_stub ldconfig '[ "$1" = "-r" ] && echo "0:-lc.7=>/lib/libc.so.7"'
run bash "$out"
assert_failure "pyenv-binary: missing required system libraries: libmissing.so.1"
}
@test "checks for patchelf before installing the archive" {
local out="${BATS_TEST_TMPDIR}/definition"
pyenv-binary-generate-installer "$(create_meta)" \
--archive-url http://example.com/a.tar.gz -o "$out"
create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac'
create_stub getconf 'echo "glibc 2.31"'
PATH="$(path_without patchelf)" run bash "$out"
assert_failure "pyenv-binary: need patchelf to relocate the binary"
}
@test "checks for otool before installing a macOS archive" {
local out="${BATS_TEST_TMPDIR}/definition"
pyenv-binary-generate-installer \
"$(create_meta Darwin arm64 '' /build/3.12.7)" \
--archive-url http://example.com/a.tar.gz -o "$out"
create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac'
create_path_executable install_name_tool true
PATH="$(path_without otool)" run bash "$out"
assert_failure "pyenv-binary: need otool to relocate the binary"
}
@test "checks for install_name_tool before installing a macOS archive" {
local out="${BATS_TEST_TMPDIR}/definition"
pyenv-binary-generate-installer \
"$(create_meta Darwin arm64 '' /build/3.12.7)" \
--archive-url http://example.com/a.tar.gz -o "$out"
create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac'
create_path_executable otool true
PATH="$(path_without install_name_tool)" run bash "$out"
assert_failure "pyenv-binary: need install_name_tool to relocate the binary"
}
@test "the generated macOS definition preserves both relocation arguments" {
local archive="${BATS_TEST_TMPDIR}/3.12.7.tar.gz"
local cache="${BATS_TEST_TMPDIR}/cache"
local definition="${BATS_TEST_TMPDIR}/definition"
local prefix="${BATS_TEST_TMPDIR}/install"
pyenv-binary-generate-installer \
"$(create_meta Darwin arm64 '' '/build prefix/$name')" \
--archive-url http://example.com/3.12.7.tar.gz -o "$definition"
mkdir -p "$cache"
cp "$archive" "${cache}/Python-3.12.7-binary.tar.gz"
create_stub pyenv 'printf "argc=%s\narg1=%s\narg2=%s\narg3=%s\narg4=%s\n" "$#" "$1" "$2" "$3" "$4"'
create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac'
create_stub sw_vers 'echo 15.5'
create_stub ldconfig true
create_path_executable otool true
create_path_executable install_name_tool true
PYTHON_BUILD_CACHE_PATH="$cache" run \
"${BATS_TEST_DIRNAME}/../../python-build/bin/python-build" "$definition" "$prefix"
assert_success
assert_line "argc=4"
assert_line "arg1=binary"
assert_line "arg2=relocate"
assert_line "arg3=${prefix}"
assert_line 'arg4=/build prefix/$name'
assert_line "Installed Python-3.12.7-binary to ${prefix}"
}
@test "fails when the archive is not beside the metadata" {
local meta="$(create_meta)"
rm "${BATS_TEST_TMPDIR}/3.12.7.tar.gz"
run pyenv-binary-generate-installer "$meta" --archive-url http://x/a.tar.gz
assert_failure "pyenv-binary: cannot read the archive \`${BATS_TEST_TMPDIR}/3.12.7.tar.gz' to checksum it"
}
@test "the generated definition is installable with python-build" {
ldconfig -p &>/dev/null || skip "ldconfig with -p is not present"
local archive="${BATS_TEST_TMPDIR}/3.12.7.tar.gz"
local cache="${BATS_TEST_TMPDIR}/cache"
local definition="${BATS_TEST_TMPDIR}/definition"
local prefix="${BATS_TEST_TMPDIR}/install"
pyenv-binary-generate-installer "$(create_meta)" \
--archive-url http://example.com/3.12.7.tar.gz -o "$definition"
mkdir -p "$cache"
cp "$archive" "${cache}/Python-3.12.7-binary.tar.gz"
create_stub pyenv 'echo "pyenv $*"'
create_path_executable patchelf "exit 0"
create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac'
PYTHON_BUILD_CACHE_PATH="$cache" run \
"${BATS_TEST_DIRNAME}/../../python-build/bin/python-build" "$definition" "$prefix"
assert_success
assert_line "pyenv binary relocate ${prefix}"
assert_line "Installed Python-3.12.7-binary to ${prefix}"
assert [ -x "${prefix}/bin/python" ]
}

View file

@ -0,0 +1,59 @@
#!/usr/bin/env bats
load test_helper
_setup() {
create_stub pyenv-latest '[ "$1" = "-f" ] && [ "$2" = "-k" ] && shift 2 && echo "$*"'
}
@test "completion lists installable versions" {
create_stub pyenv-install \
'[ "$*" = "--list --bare" ] && echo 3.13.14'
run pyenv-binary-package-name --complete
assert_success "3.13.14"
}
@test "fails without a version" {
create_stub pyenv-help 'echo usage'
run pyenv-binary-package-name
assert_failure "usage"
}
@test "rejects a second argument" {
create_stub pyenv-help 'echo usage'
run pyenv-binary-package-name 3.13.14 extra
assert_failure "usage"
}
@test "generates a package name for Linux" {
create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac'
create_stub lsb_release 'case "$1" in -si) echo Debian;; -sr) echo 12;; esac'
run pyenv-binary-package-name 3.13.14
assert_success "3.13.14-debian-12-x86_64"
}
@test "generates a package name for macOS" {
create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac'
create_stub sw_vers 'echo 15.5'
run pyenv-binary-package-name 3.13.14
assert_success "3.13.14-macos-15.5-arm64"
}
@test "resolves a version prefix when generating a package name" {
create_stub pyenv-latest '[ "$*" = "-f -k 3" ] && echo 3.14.7'
create_stub uname \
'case "$1" in -s) echo FreeBSD;; -m) echo amd64;; -r) echo 14.2-RELEASE-p3;; esac'
run pyenv-binary-package-name 3
assert_success "3.14.7-freebsd-14.2-release-p3-amd64"
}
@test "rejects an invalid version name" {
run pyenv-binary-package-name ../3.13.14
assert_failure "pyenv-binary: invalid version name \`../3.13.14'"
}

View file

@ -0,0 +1,131 @@
#!/usr/bin/env bats
load test_helper
# Make the build deterministic: `pyenv-install' just creates the prefix, and
# the platform tools report a fixed Linux target so the real `save' and
# `generate-installer' behave the same on any test host.
stub_build_environment() {
create_stub pyenv-install 'echo "${0##*/} $*"; mkdir -p "${PYENV_ROOT}/versions/${1##*:}/bin"'
create_stub pyenv-latest 'while (($#)); do case "$1" in -f|-k);; *)break;; esac; shift; done; echo "$*"'
create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac'
create_stub getconf 'echo "glibc 2.17"'
create_stub readelf true
}
@test "-v|--verbose runs pyenv install verbosely" {
stub_build_environment
create_stub pyenv-binary-save true
create_stub pyenv-binary-generate-installer true
for opt in "" -v --verbose; do
run pyenv-binary-package $opt 3.12.7:3.12.7-test \
--archive-base-url http://example.com/binaries
assert_success "pyenv-install ${opt:+--verbose }3.12.7:3.12.7-test"
done
}
@test "completions" {
create_stub pyenv-install 'echo "${0##*/} $*"'
run pyenv-binary-package --complete
assert_success <<!
--archive-base-url
--verbose
pyenv-install --list --bare
!
}
@test "fails with no arguments" {
create_stub pyenv-help "echo usage"
run pyenv-binary-package
assert_failure "usage"
}
@test "fails without an archive base url" {
create_stub pyenv-help "echo usage"
run pyenv-binary-package 3.12.7:3.12.7-test
assert_failure "usage"
}
@test "fails when --archive-base-url has no value" {
run pyenv-binary-package 3.12.7:3.12.7-test --archive-base-url
assert_failure "pyenv-binary: --archive-base-url needs a value"
}
@test "rejects a second positional argument" {
run pyenv-binary-package 3.12.7:3.12.7-test extra --archive-base-url http://x/b
assert_failure "pyenv-binary: unexpected argument \`extra'"
}
@test "generates an entry name for a bare version" {
stub_build_environment
create_stub lsb_release 'case "$1" in -si) echo Debian;; -sr) echo 12;; esac'
cd "${BATS_TEST_TMPDIR}"
run pyenv-binary-package 3.12.7 --archive-base-url http://example.com/binaries
assert_success
assert [ -d "${PYENV_ROOT}/versions/3.12.7-debian-12-x86_64" ]
assert [ -f "${BATS_TEST_TMPDIR}/3.12.7-debian-12-x86_64.tar.gz" ]
assert [ -f "${BATS_TEST_TMPDIR}/3.12.7-debian-12-x86_64.meta" ]
run grep '^ARCHIVE_URL=' "${BATS_TEST_TMPDIR}/3.12.7-debian-12-x86_64"
assert_success "ARCHIVE_URL=http://example.com/binaries/3.12.7-debian-12-x86_64.tar.gz"
}
@test "rejects an entry name containing a slash" {
run pyenv-binary-package "3.12.7:foo/bar" --archive-base-url http://x/b
assert_failure "pyenv-binary: invalid entry name \`foo/bar'"
}
@test "rejects \`latest' as an entry name" {
run pyenv-binary-package 3.12:latest --archive-base-url http://x/b
assert_failure "pyenv-binary: \`latest' cannot be used as an entry name"
}
@test "packages on macOS" {
create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac'
create_stub pyenv-install 'echo install'
create_stub pyenv-binary-save 'echo save'
create_stub pyenv-binary-generate-installer 'echo generate-installer'
run pyenv-binary-package 3.12.7:3.12.7-test --archive-base-url http://x/b
assert_success "install
save
generate-installer"
}
@test "writes the archive, metadata and definition under the entry name (integration)" {
stub_build_environment
cd "${BATS_TEST_TMPDIR}"
run pyenv-binary-package 3.12.7:3.12.7-test \
--archive-base-url http://example.com/binaries
assert_success
assert [ -d "${PYENV_ROOT}/versions/3.12.7-test" ]
assert [ -f "${BATS_TEST_TMPDIR}/3.12.7-test.tar.gz" ]
assert [ -f "${BATS_TEST_TMPDIR}/3.12.7-test.meta" ]
run grep '^ARCHIVE_URL=' "${BATS_TEST_TMPDIR}/3.12.7-test"
assert_success "ARCHIVE_URL=http://example.com/binaries/3.12.7-test.tar.gz"
}
@test "correctly joins archive base url with a trailing slash" {
stub_build_environment
create_stub pyenv-binary-save true
create_stub pyenv-binary-generate-installer <<'!'
echo -n "${0##*/} "
while (($#)); do
case $1 in
--archive-url)
echo "$1 ${2:?}"
break
;;
esac
shift
done
!
run pyenv-binary-package 3.12.7:3.12.7-test \
--archive-base-url http://example.com/binaries/
assert_success
assert_line "pyenv-binary-generate-installer --archive-url http://example.com/binaries/3.12.7-test.tar.gz"
}

View file

@ -0,0 +1,221 @@
#!/usr/bin/env bats
load test_helper
_setup() {
create_stub pyenv-help "echo usage"
create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac'
}
stub_patchelf() {
create_path_executable patchelf <<STUB
if [ "\$1" = "--print-rpath" ]; then
exit 0
fi
echo "\$*" >> "${BATS_TEST_TMPDIR}/patchelf.log"
STUB
}
create_interpreter() {
mkdir -p "${BATS_TEST_TMPDIR}/prefix/bin"
printf '#!/bin/sh\n' > "${BATS_TEST_TMPDIR}/prefix/bin/python2.7"
chmod +x "${BATS_TEST_TMPDIR}/prefix/bin/python2.7"
}
create_macos_tree() {
local prefix="${BATS_TEST_TMPDIR}/prefix"
local lib="${prefix}/lib/python3.12"
mkdir -p "${prefix}/bin" "${lib}/lib-dynload" "${lib}/site-packages/numpy"
printf '#!/bin/sh\n' > "${prefix}/bin/python3.12"
chmod +x "${prefix}/bin/python3.12"
touch "${prefix}/lib/libpython3.12.dylib"
touch "${lib}/lib-dynload/_ssl.cpython-312-darwin.so"
touch "${lib}/site-packages/numpy/_multiarray.so"
}
stub_macos_tools() {
create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac'
create_path_executable install_name_tool \
'echo "$*" >> "${BATS_TEST_TMPDIR}/install-name-tool.log"'
create_path_executable otool <<'STUB'
file="${!#}"
echo "$*" >> "${BATS_TEST_TMPDIR}/otool.log"
old="/build prefix/3.12.7"
case "$1" in
-L )
echo "${file}:"
case "$file" in
*/bin/python3.12 )
if [ -n "$OTOOL_RELOCATED" ]; then
echo " @rpath/libpython3.12.dylib (compatibility version 3.12.0, current version 3.12.0)"
else
echo " ${old}/lib/libpython3.12.dylib (compatibility version 3.12.0, current version 3.12.0)"
fi
echo " ${old}-other/lib/libother.dylib (compatibility version 1.0.0, current version 1.0.0)"
echo " /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1.0.0)"
echo " /opt/homebrew/lib/libintl.8.dylib (compatibility version 1.0.0, current version 1.0.0)"
echo " @loader_path/liblocal.dylib (compatibility version 1.0.0, current version 1.0.0)"
;;
*/lib/libpython3.12.dylib )
if [ -n "$OTOOL_RELOCATED" ]; then
echo " @rpath/libpython3.12.dylib (compatibility version 3.12.0, current version 3.12.0)"
else
echo " ${old}/lib/libpython3.12.dylib (compatibility version 3.12.0, current version 3.12.0)"
fi
;;
esac
;;
-D )
case "$file" in
*/lib/libpython3.12.dylib )
echo "${file}:"
if [ -n "$OTOOL_RELOCATED" ]; then
echo '@rpath/libpython3.12.dylib'
else
echo "${old}/lib/libpython3.12.dylib"
fi
;;
* )
exit 1
;;
esac
;;
-l )
if [ -n "$OTOOL_RELOCATED" ]; then
case "$file" in
*/bin/* ) rpath='@executable_path/../lib' ;;
*/lib/*.dylib ) rpath='@loader_path' ;;
* ) rpath='@loader_path/../..' ;;
esac
else
rpath="${old}/lib"
fi
cat <<EOF
cmd LC_RPATH
path ${rpath} (offset 12)
cmd LC_RPATH
path /opt/homebrew/lib (offset 12)
cmd LC_RPATH
path @loader_path/vendor (offset 12)
EOF
;;
esac
STUB
}
@test "completion produces nothing" {
run pyenv-binary-relocate --complete
assert_success ""
}
@test "fails without a prefix" {
run pyenv-binary-relocate
assert_failure "usage"
}
@test "fails when patchelf is not available" {
PATH="$(path_without patchelf)" run pyenv-binary-relocate "${BATS_TEST_TMPDIR}/prefix"
assert_failure "pyenv-binary: need patchelf to relocate the binary"
}
@test "fails without the original build prefix on macOS" {
create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac'
run pyenv-binary-relocate "${BATS_TEST_TMPDIR}/prefix"
assert_failure "pyenv-binary: need the original build prefix to relocate a macOS binary"
}
@test "fails when otool is not available on macOS" {
create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac'
create_path_executable install_name_tool true
PATH="$(path_without otool)" run \
pyenv-binary-relocate "${BATS_TEST_TMPDIR}/prefix" /build/3.12.7
assert_failure "pyenv-binary: need otool to relocate the binary"
}
@test "fails when install_name_tool is not available on macOS" {
create_stub uname 'case "$1" in -s) echo Darwin;; -m) echo arm64;; esac'
create_path_executable otool true
PATH="$(path_without install_name_tool)" run \
pyenv-binary-relocate "${BATS_TEST_TMPDIR}/prefix" /build/3.12.7
assert_failure "pyenv-binary: need install_name_tool to relocate the binary"
}
@test "fails when the prefix has no interpreter" {
create_path_executable patchelf "exit 0"
mkdir -p "${BATS_TEST_TMPDIR}/prefix"
run pyenv-binary-relocate "${BATS_TEST_TMPDIR}/prefix"
assert_failure "pyenv-binary: found no interpreter to relocate under \`${BATS_TEST_TMPDIR}/prefix/bin'"
}
@test "relocates an executable interpreter" {
stub_patchelf
create_interpreter
run pyenv-binary-relocate "${BATS_TEST_TMPDIR}/prefix"
assert_success
run cat "${BATS_TEST_TMPDIR}/patchelf.log"
assert_output "--set-rpath ${BATS_TEST_TMPDIR}/prefix/lib ${BATS_TEST_TMPDIR}/prefix/bin/python2.7"
}
@test "relocates the extension modules but not what a wheel installed" {
local lib="${BATS_TEST_TMPDIR}/prefix/lib/python3.12"
stub_patchelf
create_interpreter
mkdir -p "${lib}/lib-dynload" "${lib}/site-packages/numpy"
touch "${lib}/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so"
# A wheel points its extensions at the libraries it bundles alongside them, so
# its rpath is its own business and must survive relocation.
touch "${lib}/site-packages/numpy/_multiarray.so"
run pyenv-binary-relocate "${BATS_TEST_TMPDIR}/prefix"
assert_success
run cat "${BATS_TEST_TMPDIR}/patchelf.log"
assert_line "--set-rpath ${BATS_TEST_TMPDIR}/prefix/lib ${lib}/lib-dynload/_ssl.cpython-312-x86_64-linux-gnu.so"
refute_line "--set-rpath ${BATS_TEST_TMPDIR}/prefix/lib ${lib}/site-packages/numpy/_multiarray.so"
}
@test "relocates macOS load commands without changing unrelated entries" {
local prefix="${BATS_TEST_TMPDIR}/prefix"
local old="/build prefix/3.12.7"
local lib="${prefix}/lib/python3.12"
create_macos_tree
stub_macos_tools
run pyenv-binary-relocate "$prefix" "$old"
assert_success
run cat "${BATS_TEST_TMPDIR}/install-name-tool.log"
assert_output <<EOF
-change ${old}/lib/libpython3.12.dylib @rpath/libpython3.12.dylib ${prefix}/bin/python3.12
-rpath ${old}/lib @executable_path/../lib ${prefix}/bin/python3.12
-id @rpath/libpython3.12.dylib ${prefix}/lib/libpython3.12.dylib
-rpath ${old}/lib @loader_path ${prefix}/lib/libpython3.12.dylib
-rpath ${old}/lib @loader_path/../.. ${lib}/lib-dynload/_ssl.cpython-312-darwin.so
EOF
run grep -F "${lib}/site-packages/numpy/_multiarray.so" "${BATS_TEST_TMPDIR}/otool.log"
assert_failure
}
@test "skips already relocated macOS load commands" {
local prefix="${BATS_TEST_TMPDIR}/prefix"
create_macos_tree
stub_macos_tools
export OTOOL_RELOCATED=1
run pyenv-binary-relocate "$prefix" "/build prefix/3.12.7"
assert_success
assert [ ! -e "${BATS_TEST_TMPDIR}/install-name-tool.log" ]
}
@test "fails when install_name_tool cannot modify a selected file" {
local prefix="${BATS_TEST_TMPDIR}/prefix"
create_macos_tree
stub_macos_tools
create_path_executable install_name_tool 'exit 1'
run pyenv-binary-relocate "$prefix" "/build prefix/3.12.7"
assert_failure ""
}

View file

@ -0,0 +1,155 @@
#!/usr/bin/env bats
load test_helper
create_version() {
mkdir -p "${PYENV_ROOT}/versions/$1/bin"
}
platform() {
echo "$(uname -s | tr '[:upper:]' '[:lower:]')-$(uname -m)"
}
@test "fails with no version given" {
run pyenv-binary-save
assert_failure "Usage: pyenv binary save <version> [<output-dir>] [--name <name>]"
}
@test "fails for a version that is not installed" {
run pyenv-binary-save 9.9.9
assert_failure "pyenv-binary: version \`9.9.9' is not installed"
}
@test "rejects a version name containing a slash" {
run pyenv-binary-save "foo/bar"
assert_failure "pyenv-binary: invalid version name \`foo/bar'"
}
@test "rejects the parent directory reference" {
run pyenv-binary-save ".."
assert_failure "pyenv-binary: invalid version name \`..'"
}
@test "packages an installed version" {
create_version "3.12.7"
local out="${BATS_TEST_TMPDIR}/dist"
local archive="${out}/3.12.7-$(platform).tar.gz"
run pyenv-binary-save "3.12.7" "$out"
assert_success "Saved 3.12.7-$(platform).tar.gz and 3.12.7-$(platform).meta to $out"
assert [ -f "$archive" ]
assert [ -f "${out}/3.12.7-$(platform).meta" ]
run tar -tzf "$archive"
assert_success
assert_line 0 "3.12.7/"
}
@test "uses an explicit package name" {
create_version "3.12.7"
local out="${BATS_TEST_TMPDIR}/dist"
run pyenv-binary-save "3.12.7" "$out" --name "custom"
assert_success "Saved custom.tar.gz and custom.meta to $out"
assert [ -f "${out}/custom.tar.gz" ]
run grep '^archive=' "${out}/custom.meta"
assert_success "archive=custom.tar.gz"
}
@test "fails when --name has no value" {
run pyenv-binary-save "3.12.7" --name
assert_failure "pyenv-binary: --name needs a value"
}
@test "rejects an invalid package name" {
create_version "3.12.7"
run pyenv-binary-save "3.12.7" --name "foo/bar"
assert_failure "pyenv-binary: invalid package name \`foo/bar'"
}
@test "records the platform in the metadata" {
create_version "3.12.7"
local out="${BATS_TEST_TMPDIR}/dist"
pyenv-binary-save "3.12.7" "$out" >/dev/null
run cat "${out}/3.12.7-$(platform).meta"
assert_success
assert_line "version=3.12.7"
assert_line "platform=$(platform)"
assert_line "archive=3.12.7-$(platform).tar.gz"
}
@test "records the original installation prefix" {
create_version "3.12.7"
local out="${BATS_TEST_TMPDIR}/dist"
pyenv-binary-save "3.12.7" "$out" >/dev/null
run grep '^build_prefix=' "${out}/3.12.7-$(platform).meta"
assert_success "build_prefix=${PYENV_ROOT}/versions/3.12.7"
}
@test "fails when readelf is not available" {
create_version "3.12.7"
create_stub uname 'case "$1" in -s) echo Linux;; -m) echo x86_64;; esac'
PATH="$(path_without readelf)" run pyenv-binary-save "3.12.7" "${BATS_TEST_TMPDIR}/dist"
assert_failure "pyenv-binary: need readelf to inspect shared libraries"
assert [ ! -e "${BATS_TEST_TMPDIR}/dist/3.12.7-$(platform).tar.gz" ]
}
@test "records only direct libraries resolved outside the prefix" {
create_version "3.12.7"
touch "${PYENV_ROOT}/versions/3.12.7/bin/python3.12"
create_path_executable uname <<'STUB'
case "$1" in
-s) echo Linux ;;
-m) echo x86_64 ;;
esac
STUB
create_path_executable ldd <<'STUB'
prefix="${PYENV_ROOT}/versions/3.12.7"
cat <<EOF
linux-vdso.so.1 (0x00007ffd1adfe000)
libpython3.12.so.1.0 => ${prefix}/lib/libpython3.12.so.1.0 (0x00007f4a3c000000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f4a3bc00000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4a3b800000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4a3c200000)
EOF
STUB
create_path_executable readelf <<'STUB'
cat <<EOF
0x0000000000000001 (NEEDED) Shared library: [libpython3.12.so.1.0]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
EOF
STUB
run pyenv-binary-save "3.12.7" "${BATS_TEST_TMPDIR}/dist"
assert_success
run grep '^dep=' "${BATS_TEST_TMPDIR}/dist/"*.meta
assert_output "dep=libm.so.6"
}
@test "records only the libraries otool resolves outside the prefix" {
create_version "3.12.7"
touch "${PYENV_ROOT}/versions/3.12.7/bin/python3.12"
create_path_executable uname <<'STUB'
case "$1" in
-s) echo Darwin ;;
-m) echo arm64 ;;
esac
STUB
create_path_executable otool <<'STUB'
prefix="${PYENV_ROOT}/versions/3.12.7"
cat <<EOF
${2}:
@rpath/libpython3.12.dylib (compatibility version 3.12.0, current version 3.12.0)
${prefix}/lib/libcrypto.3.dylib (compatibility version 3.0.0, current version 3.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1345.0.0)
EOF
STUB
run pyenv-binary-save "3.12.7" "${BATS_TEST_TMPDIR}/dist"
assert_success
run grep '^dep=' "${BATS_TEST_TMPDIR}/dist/"*.meta
assert_output "dep=/usr/lib/libSystem.B.dylib"
}

View file

@ -0,0 +1 @@
../../../test/test_helper.bash

View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2023 yfprojects
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.

View file

@ -0,0 +1,33 @@
# pyenv-link
A [pyenv](https://github.com/pyenv/pyenv) plugin for linking Python installations and virtual environments into your pyenv root.
This plugin recommends the [pyenv-virtualenv](https://github.com/pyenv/pyenv-virtualenv/) plugin.
## Usage
Make an arbitrary virtualenv available through pyenv. This automatically guesses a fitting name from the prompt, the directory name or the location of the venv.
```console
$ pyenv link version .venv
Linked new version named myproject
```
You can also specify a name to use for the venv.
```console
$ pyenv link version .venv myname
Linked new version named myname
```
The same command can give a platform-specific binary installation a shorter name:
```console
$ pyenv link version "$(pyenv root)/versions/3.13.14-linux-x86_64" 3.13.14
Linked new version named 3.13.14
```
Now you can make pyenv activate/use the venv automatically:
```console
$ pyenv local myproject
```

View file

@ -0,0 +1,34 @@
#!/usr/bin/env bash
#
# Summary: Link a Python environment as a pyenv version
#
# Usage: pyenv link version [--dry] [--quiet] <path> [<name>]
#
# Link a virtual python environment to pyenvs version directory
# so that the venv can be used like one created with *pyenv-virtualenv*.
#
# <path> should be a path to a Python installation or virtual environment.
set -e
[ -n "$PYENV_DEBUG" ] && set -x
# Provide pyenv completions
case "$1" in
--complete)
if [ -z "$2" ]; then
echo version
else
shift 2
pyenv-link-version --complete "$@"
fi
;;
version)
shift
pyenv-link-version "$@"
exit $?
;;
*)
pyenv-help --usage link >&2
exit 1
;;
esac

View file

@ -0,0 +1,150 @@
#!/usr/bin/env bash
#
# Summary: Link a Python environment as a pyenv version
#
# Usage: pyenv link version [--dry] [--quiet] <path> [<name>]
#
# Link a virtual python environment to pyenvs version directory
# so that the venv can be used like one created with *pyenv-virtualenv*.
#
# <path> should be a path to a Python installation or virtual environment.
# <name> should be string used as a version name it may not be present
# in the pyenv version directory yet.
# If not specified a matching name is guessed from pyvenv.cfg
# or directory name of the venv.
set -e
[ -n "$PYENV_DEBUG" ] && set -x
# functions
if ! {
enable -f "${BASH_SOURCE%/*}"/../../../libexec/pyenv-realpath.dylib realpath ||
type realpath # realpath available?
} >/dev/null 2>&1; then
# realpath requires GNU coreutils to be installed. That's why its bundled with pyenv
echo realpath not available >&2
# work-around when realpath is unavailable
realpath() {
(cd "$1" && pwd)
}
fi
guess_name() {
local venv_dir=$1
local name
# guess venv name from pyvenv.cfg
local pyvenv_cfg_path=$venv_dir/pyvenv.cfg
if [ -f "$pyvenv_cfg_path" ]; then
# if `prompt` key wasn't found the var remains empty
name=$(cut -b 1-1024 "$pyvenv_cfg_path" | sed -n '/^ *prompt *= */s///p')
case "$name" in
\"*\" | \'*\')
name=${name:1:${#name}-2}
;;
esac
fi
# guess venv name from name of venv directory
local venv_dir_name=${venv_dir##*/}
if [ -z "$name" ]; then
case "$venv_dir_name" in
venv | env | .venv | .env | ENV | VENV) ;;
*) name=$venv_dir_name ;;
esac
fi
# guess venv name from name of the parent directory of the venv directory
local venv_dir_parent=${venv_dir%/*}
local venv_dir_parent_name=${venv_dir_parent##*/}
if [ -z "$name" ]; then
name=$venv_dir_parent_name
fi
echo "$name"
}
# process args
POSARGS=()
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
echo --dry
echo --quiet
exit
fi
for arg in "$@"; do
case $arg in
--dry)
dry=true # any value
;;
--quiet)
quiet=true # any value
;;
-*)
pyenv-help --usage link-version >&2
exit 1
;;
*)
POSARGS+=("$arg")
;;
esac
done
if [ ! ${#POSARGS[@]} -le 2 ] || [ ! ${#POSARGS[@]} -ge 1 ]; then
pyenv-help --usage link-version >&2
exit 1
fi
venv_dir=${POSARGS[0]%/}
venv_name=${POSARGS[1]}
# Check venv exists
if [ ! -d "$venv_dir" ]; then
echo "The virtual env you specified doesn't exist"
exit 2
fi
# make venv dir absolute
venv_dir=$(realpath "$venv_dir")
# determine venv name
if [ -z "$venv_name" ]; then
venv_name=$(guess_name "$venv_dir")
fi
case "$venv_name" in
"" | */* | . | .. | *:* | system | *[[:cntrl:]]* )
echo "pyenv-link: invalid version name \`${venv_name}'" >&2
exit 1
;;
esac
versions_dir="$PYENV_ROOT/versions"
pyenv_prefix_path="$versions_dir/$venv_name"
if [ -e "$pyenv_prefix_path" ] || [ -L "$pyenv_prefix_path" ]; then
echo Version "$venv_name" already exists >&2
exit 3
fi
case "$venv_dir" in
"$versions_dir"/*)
link_target=${venv_dir#"$versions_dir"/}
;;
*)
link_target=$venv_dir
;;
esac
# link to pyenv version directory
if [ -z "$dry" ]; then
mkdir -p "$versions_dir"
ln -s "$link_target" "$pyenv_prefix_path"
fi
# output
if [ -z "$quiet" ]; then
echo "Linked new version named $venv_name"
fi

View file

@ -0,0 +1,61 @@
#!/usr/bin/env bats
load test_helper
@test "link completions use the dispatcher" {
run pyenv completions link
assert_success
assert_output <<OUT
--help
version
OUT
run pyenv completions link version
assert_success
assert_output <<OUT
--help
--dry
--quiet
OUT
}
@test "link requires a version path" {
run pyenv-link version
assert_failure "Usage: pyenv link version [--dry] [--quiet] <path> [<name>]"
}
@test "links an installed binary under its plain version name" {
create_alt_executable_in_version "3.13.14-linux-x86_64" python 'echo linked-python'
run pyenv-link version "$PYENV_ROOT/versions/3.13.14-linux-x86_64" 3.13.14
assert_success "Linked new version named 3.13.14"
assert_equal "3.13.14-linux-x86_64" "$(readlink "$PYENV_ROOT/versions/3.13.14")"
PYENV_VERSION=3.13.14 run pyenv exec python
assert_success "linked-python"
}
@test "links external paths containing spaces into a fresh root" {
mkdir -p "$PYENV_TEST_DIR/external env/bin"
run pyenv-link version "$PYENV_TEST_DIR/external env" custom
assert_success "Linked new version named custom"
assert_equal "$PYENV_TEST_DIR/external env" "$(readlink "$PYENV_ROOT/versions/custom")"
}
@test "refuses a dangling destination link" {
mkdir -p "$PYENV_ROOT/versions" "$PYENV_TEST_DIR/source"
ln -s missing "$PYENV_ROOT/versions/dangling"
run pyenv-link version "$PYENV_TEST_DIR/source" dangling
assert_failure "Version dangling already exists"
assert_equal missing "$(readlink "$PYENV_ROOT/versions/dangling")"
}
@test "rejects invalid version names" {
mkdir -p "$PYENV_TEST_DIR/source"
for name in ../outside . .. 'foo/bar' 'foo:bar' system; do
run pyenv-link version "$PYENV_TEST_DIR/source" "$name"
assert_failure "pyenv-link: invalid version name \`$name'"
assert [ ! -e "$PYENV_ROOT/outside" ]
done
echo "prompt = '../outside'" > "$PYENV_TEST_DIR/source/pyvenv.cfg"
run pyenv-link version "$PYENV_TEST_DIR/source"
assert_failure "pyenv-link: invalid version name \`../outside'"
assert [ ! -e "$PYENV_ROOT/outside" ]
}

View file

@ -0,0 +1 @@
../../../test/test_helper.bash

View file

@ -24,7 +24,7 @@ Installing python-build as a standalone program will give you access to the
`python-build` command for precise control over Python version installation. If you
have pyenv installed, you will also be able to use the `pyenv install` command.
git clone git://github.com/pyenv/pyenv.git
git clone https://github.com/pyenv/pyenv.git
cd pyenv/plugins/python-build
./install.sh
@ -54,8 +54,11 @@ Or, if you would like to install the latest development release:
## Usage
Before you begin, you should ensure that your build environment has the proper
system dependencies for compiling the wanted Python Version (see our [recommendations](https://github.com/pyenv/pyenv/wiki#suggested-build-environment)).
On Ubuntu, Debian, and Mint, install the recommended build dependencies with:
pyenv install-prerequisites
For other environments, see our [build environment recommendations](https://github.com/pyenv/pyenv/wiki#suggested-build-environment).
### Using `pyenv install` with pyenv
@ -67,6 +70,13 @@ exact name of the version you want to install. For example,
Python versions will be installed into a directory of the same name under
`~/.pyenv/versions`.
To install a version under a different name -- for instance, to keep several
builds of the same version side by side -- append `:<alias>` to the version:
pyenv install 3.12.0:3.12-custom
This installs into `~/.pyenv/versions/3.12-custom`.
To see a list of all available Python versions, run `pyenv install --list`. You
may also tab-complete available Python versions if your pyenv installation is
properly configured.
@ -96,7 +106,64 @@ 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
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
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_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.
**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.
##### MacPorts
MacPorts Homebrew is used to find dependency packages if `port` is found on `PATH` in MacOS.
Set `PYTHON_BUILD_USE_MACPORTS` or `PYTHON_BUILD_SKIP_MACPORTS` to override this default.
###### Interaction with Homebrew
If both Homebrew and MacPorts are installed and allowed to be used, Homebrew takes preference.
There first ecosystem where any of the required dependency packages is found is used.
##### 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
@ -113,21 +180,28 @@ 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_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.
* `PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA`, override the MacPorts OpenSSL formula to use. The default is `openssl3 openssl`.
* `PYTHON_BUILD_TCLTK_FORMULA`, override the Homebrew Tcl/Tk formula to use.
* `PYTHON_BUILD_SKIP_MACPORTS`, if set, will not search for libraries installed by MacPorts when it would normally will.
* `PYTHON_BUILD_USE_MACPORTS`, if set, will search for libraries installed by MacPorts when it would normally not.
* `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
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).
* `<PACKAGE>_CFLAGS`, `<PACKAGE>_CPPFLAGS`, `<PACKAGE>_LDFLAGS` let you pass additional options to `CFLAGS`/`CPPFLAGS`/`LDFLAGS` specifically for building `<package>` (Python itself or a dependency library) from source as part of the build script. `<PACKAGE>` 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.
* `<PACKAGE>_CONFIGURE_OPTS`, `<PACKAGE>_MAKE_OPTS`, `<PACKAGE>_MAKE_INSTALL_OPTS`, `<PACKAGE>_MAKE_INSTALL_TARGET` allow
you to specify configure and make options for building `<package>` (same as above). "Make install target" would replace "`install`" in the `make install` invocation.
### Applying patches to Python before compiling
@ -149,20 +223,21 @@ $ cat fix1.patch fix2.patch | pyenv install --patch 2.7.10
```
### Building with `--enable-shared`
### Building for maximum performance
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`.
Building CPython with `--enable-optimizations` will result in a faster
interpreter at the cost of significantly longer build times. Most notably, this
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-shared" pyenv install 2.7.9
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
the `PROFILE_TASK` environment variable, for instance, `PROFILE_TASK='-m
test.regrtest --pgo -j0'` will run much faster than the default task.
### Checksum verification
If you have the `shasum`, `openssl`, or `sha256sum` tool installed, python-build will
@ -175,14 +250,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 accommodate
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
@ -195,15 +286,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 &lt;filename&gt;..." 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
@ -231,7 +322,7 @@ the full build log for build failures.
### Testing new python versions
If you are contributing a new python version for python-build,
If you are contributing a new python version for python-build,
you can test the build in a [docker](https://www.docker.com/) container based on Ubuntu 18.04.
With docker installed:
@ -249,7 +340,7 @@ docker run -it my_container
```
The container will need to be rebuilt whenever you change the repo,
but after the first build, this will be very fast,
but after the first build, this will be very fast,
as the layer including the build dependencies will be cached.
Changes made inside the container will not be persisted.
@ -273,4 +364,3 @@ git diff --name-only master \
- Filter out any which don't live where python-build keeps its build scripts
- Look only at the file name (i.e. the python version name)
- Run a new docker container for each, building that version

View file

@ -2,9 +2,9 @@
#
# Summary: Install a Python version using python-build
#
# Usage: pyenv install [-f] [-kvp] <version>
# pyenv install [-f] [-kvp] <definition-file>
# pyenv install -l|--list
# Usage: pyenv install [-f] [-kvp] <version>[:<alias>]...
# pyenv install [-f] [-kvp] <definition-file>[:<alias>]
# pyenv install -l|--list [--bare]
# pyenv install --version
#
# -l/--list List all available versions
@ -20,6 +20,13 @@
# --version Show version of python-build
# -g/--debug Build a debug version
#
# Append `:<alias>' to a version to install it under a custom name, so that
# several builds of the same version can coexist:
#
# pyenv install 3.12.0:my-3.12
#
# This installs into $PYENV_ROOT/versions/my-3.12.
#
# For detailed information on installing Python versions with
# python-build, including a list of environment variables for adjusting
# compilation, see: https://github.com/pyenv/pyenv#readme
@ -38,6 +45,7 @@ shopt -u nullglob
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
echo --bare
echo --list
echo --force
echo --skip-existing
@ -59,7 +67,7 @@ usage() {
definitions() {
local query="$1"
python-build --definitions | $(type -P ggrep grep | head -1) -F "$query" || true
python-build --definitions | $(type -P ggrep grep | head -n1) -F "$query" || true
}
indent() {
@ -72,6 +80,10 @@ unset KEEP
unset VERBOSE
unset HAS_PATCH
unset DEBUG
unset BARE
unset LIST
[ -n "$PYENV_DEBUG" ] && VERBOSE="-v"
parse_options "$@"
for option in "${OPTIONS[@]}"; do
@ -79,10 +91,11 @@ for option in "${OPTIONS[@]}"; do
"h" | "help" )
usage 0
;;
"bare" )
BARE=1
;;
"l" | "list" )
echo "Available versions:"
definitions | indent
exit
LIST=1
;;
"f" | "force" )
FORCE=true
@ -111,7 +124,15 @@ for option in "${OPTIONS[@]}"; do
esac
done
[ "${#ARGUMENTS[@]}" -le 1 ] || usage 1 >&2
if [[ -n $LIST ]]; then
if [[ -n $BARE ]]; then
definitions
else
echo "Available versions:"
definitions | indent
fi
exit
fi
unset VERSION_NAME
@ -119,9 +140,23 @@ unset VERSION_NAME
# argument is missing, try to install whatever local app-specific
# version is specified by pyenv. Show usage instructions if a local
# version is not specified.
DEFINITION="${ARGUMENTS[0]}"
[ -n "$DEFINITION" ] || DEFINITION="$(pyenv-local 2>/dev/null || true)"
[ -n "$DEFINITION" ] || usage 1 >&2
DEFINITIONS=("${ARGUMENTS[@]}")
[[ "${#DEFINITIONS[*]}" -eq 0 ]] && DEFINITIONS=($(pyenv-local 2>/dev/null || true))
[[ "${#DEFINITIONS[*]}" -eq 0 ]] && usage 1 >&2
# A `<version>:<alias>` argument installs <version> under the custom name
# <alias>, so that several builds of the same version can coexist. The `latest`
# suffix is reserved for latest-version resolution (see the `install` hook), so
# it is left untouched here.
declare -a ALIASES
for i in "${!DEFINITIONS[@]}"; do
definition="${DEFINITIONS[$i]}"
alias="${definition##*:}"
if [[ "$definition" == *:* ]] && [ "$alias" != "latest" ]; then
DEFINITIONS[$i]="${definition%:*}"
ALIASES[$i]="$alias"
fi
done
# Define `before_install` and `after_install` functions that allow
# plugin hooks to register a string of code for execution before or
@ -138,102 +173,6 @@ after_install() {
after_hooks["${#after_hooks[@]}"]="$hook"
}
OLDIFS="$IFS"
IFS=$'\n' scripts=(`pyenv-hooks install`)
IFS="$OLDIFS"
for script in "${scripts[@]}"; do source "$script"; done
# Set VERSION_NAME from $DEFINITION, if it is not already set. Then
# compute the installation prefix.
[ -n "$VERSION_NAME" ] || VERSION_NAME="${DEFINITION##*/}"
[ -n "$DEBUG" ] && VERSION_NAME="${VERSION_NAME}-debug"
PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}"
[ -d "${PREFIX}" ] && PREFIX_EXISTS=1
# If the installation prefix exists, prompt for confirmation unless
# the --force option was specified.
if [ -d "${PREFIX}/bin" ]; then
if [ -z "$FORCE" ] && [ -z "$SKIP_EXISTING" ]; then
echo "pyenv: $PREFIX already exists" >&2
read -p "continue with installation? (y/N) "
case "$REPLY" in
y | Y | yes | YES ) ;;
* ) exit 1 ;;
esac
elif [ -n "$SKIP_EXISTING" ]; then
# Since we know the python version is already installed, and are opting to
# not force installation of existing versions, we just `exit 0` here to
# leave things happy
exit 0
fi
fi
# If PYENV_BUILD_ROOT is set, always pass keep options to python-build.
if [ -n "${PYENV_BUILD_ROOT}" ]; then
export PYTHON_BUILD_BUILD_PATH="${PYENV_BUILD_ROOT}/${VERSION_NAME}"
KEEP="-k"
fi
# Set PYTHON_BUILD_CACHE_PATH to $PYENV_ROOT/cache, if the directory
# exists and the variable is not already set.
if [ -z "${PYTHON_BUILD_CACHE_PATH}" ] && [ -d "${PYENV_ROOT}/cache" ]; then
export PYTHON_BUILD_CACHE_PATH="${PYENV_ROOT}/cache"
fi
if [ -z "${PYENV_BOOTSTRAP_VERSION}" ]; then
case "${VERSION_NAME}" in
[23]"."* )
# Default PYENV_VERSION to the friendly Python version. (The
# CPython installer requires an existing Python installation to run. An
# unsatisfied local .python-version file can cause the installer to
# fail.)
for version_info in "${VERSION_NAME%-dev}" "${VERSION_NAME%.*}" "${VERSION_NAME%%.*}"; do
# Anaconda's `curl` doesn't work on platform where `/etc/pki/tls/certs/ca-bundle.crt` isn't available (e.g. Debian)
for version in $(pyenv-whence "python${version_info}" 2>/dev/null || true); do
if [[ "${version}" != "anaconda"* ]] && [[ "${version}" != "miniconda"* ]]; then
PYENV_BOOTSTRAP_VERSION="${version}"
break 2
fi
done
done
;;
"pypy"*"-dev" | "pypy"*"-src" )
# PyPy/PyPy3 requires existing Python 2.7 to build
if [ -n "${PYENV_RPYTHON_VERSION}" ]; then
PYENV_BOOTSTRAP_VERSION="${PYENV_RPYTHON_VERSION}"
else
for version in $(pyenv-versions --bare | sort -r); do
if [[ "${version}" == "2.7"* ]]; then
PYENV_BOOTSTRAP_VERSION="$version"
break
fi
done
fi
if [ -n "$PYENV_BOOTSTRAP_VERSION" ]; then
for dep in curses genc pycparser; do
if ! PYENV_VERSION="$PYENV_BOOTSTRAP_VERSION" pyenv-exec python -c "import ${dep}" 1>/dev/null 2>&1; then
echo "pyenv-install: $VERSION_NAME: PyPy requires \`${dep}' in $PYENV_BOOTSTRAP_VERSION to build from source." >&2
exit 1
fi
done
else
echo "pyenv-install: $VERSION_NAME: PyPy requires Python 2.7 to build from source." >&2
exit 1
fi
;;
esac
fi
if [ -n "${PYENV_BOOTSTRAP_VERSION}" ]; then
export PYENV_VERSION="${PYENV_BOOTSTRAP_VERSION}"
fi
# Execute `before_install` hooks.
for hook in "${before_hooks[@]}"; do eval "$hook"; done
# Plan cleanup on unsuccessful installation.
cleanup() {
[ -z "${PREFIX_EXISTS}" ] && rm -rf "$PREFIX"
@ -241,43 +180,156 @@ cleanup() {
trap cleanup SIGINT
# Invoke `python-build` and record the exit status in $STATUS.
STATUS=0
python-build $KEEP $VERBOSE $HAS_PATCH $DEBUG "$DEFINITION" "$PREFIX" || STATUS="$?"
# Display a more helpful message if the definition wasn't found.
if [ "$STATUS" == "2" ]; then
{ candidates="$(definitions "$DEFINITION")"
here="$(dirname "${0%/*}")/../.."
if [ -n "$candidates" ]; then
OLDIFS="$IFS"
IFS=$'\n' scripts=(`pyenv-hooks install`)
IFS="$OLDIFS"
for script in "${scripts[@]}"; do source "$script"; done
COMBINED_STATUS=0
for i in "${!DEFINITIONS[@]}"; do
DEFINITION="${DEFINITIONS[$i]}"
VERSION_ALIAS="${ALIASES[$i]}"
STATUS=0
# 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 -f -k "$DEFINITION")"
# Set VERSION_NAME from $DEFINITION. Then compute the installation prefix.
# With a `<version>:<alias>` argument, install under the alias instead;
# VERSION_NAME still reflects the real version so version-specific build logic
# (e.g. the bootstrap version detection below) keeps working.
VERSION_NAME="${DEFINITION##*/}"
[ -n "$DEBUG" ] && VERSION_NAME="${VERSION_NAME}-debug"
PREFIX="${PYENV_ROOT}/versions/${VERSION_ALIAS:-$VERSION_NAME}"
[ -d "${PREFIX}" ] && PREFIX_EXISTS=1
# If the installation prefix exists, prompt for confirmation unless
# the --force option was specified.
if [ -d "${PREFIX}/bin" ]; then
if [ -z "$FORCE" ] && [ -z "$SKIP_EXISTING" ]; then
echo "pyenv: $PREFIX already exists" >&2
read -p "continue with installation? (y/N) "
case "$REPLY" in
y | Y | yes | YES ) ;;
* ) { STATUS=1; [[ $STATUS -gt $COMBINED_STATUS ]] && COMBINED_STATUS=$STATUS; }; continue ;;
esac
elif [ -n "$SKIP_EXISTING" ]; then
# Since we know the python version is already installed, and are opting to
# not force installation of existing versions, we just `exit 0` here to
# leave things happy
continue
fi
fi
# If PYENV_BUILD_ROOT is set, always pass keep options to python-build.
if [ -n "${PYENV_BUILD_ROOT}" ]; then
export PYTHON_BUILD_BUILD_PATH="${PYENV_BUILD_ROOT}/${VERSION_ALIAS:-$VERSION_NAME}"
KEEP="-k"
fi
# Set PYTHON_BUILD_CACHE_PATH to $PYENV_ROOT/cache, if the directory
# exists and the variable is not already set.
if [ -z "${PYTHON_BUILD_CACHE_PATH}" ] && [ -d "${PYENV_ROOT}/cache" ]; then
export PYTHON_BUILD_CACHE_PATH="${PYENV_ROOT}/cache"
fi
if [ -z "${PYENV_BOOTSTRAP_VERSION}" ]; then
case "${VERSION_NAME}" in
[23]"."* )
# Default PYENV_VERSION to the friendly Python version. (The
# CPython installer requires an existing Python installation to run. An
# unsatisfied local .python-version file can cause the installer to
# fail.)
for version_info in "${VERSION_NAME%-dev}" "${VERSION_NAME%.*}" "${VERSION_NAME%%.*}"; do
# Anaconda's `curl` doesn't work on platform where `/etc/pki/tls/certs/ca-bundle.crt` isn't available (e.g. Debian)
for version in $(pyenv-whence "python${version_info}" 2>/dev/null || true); do
if [[ "${version}" != "anaconda"* ]] && [[ "${version}" != "miniconda"* ]]; then
PYENV_BOOTSTRAP_VERSION="${version}"
break 2
fi
done
done
;;
"pypy"*"-dev" | "pypy"*"-src" )
# PyPy/PyPy3 requires existing Python 2.7 to build
if [ -n "${PYENV_RPYTHON_VERSION}" ]; then
PYENV_BOOTSTRAP_VERSION="${PYENV_RPYTHON_VERSION}"
else
for version in $(pyenv-versions --bare | sort -r); do
if [[ "${version}" == "2.7"* ]]; then
PYENV_BOOTSTRAP_VERSION="$version"
break
fi
done
fi
if [ -n "$PYENV_BOOTSTRAP_VERSION" ]; then
for dep in pycparser; do
if ! PYENV_VERSION="$PYENV_BOOTSTRAP_VERSION" pyenv-exec python -c "import ${dep}" 1>/dev/null 2>&1; then
echo "pyenv-install: $VERSION_NAME: PyPy requires \`${dep}' in $PYENV_BOOTSTRAP_VERSION to build from source." >&2
exit 1
fi
done
else
echo "pyenv-install: $VERSION_NAME: PyPy requires Python 2.7 to build from source." >&2
exit 1
fi
;;
esac
fi
if [ -n "${PYENV_BOOTSTRAP_VERSION}" ]; then
export PYENV_VERSION="${PYENV_BOOTSTRAP_VERSION}"
fi
# Execute `before_install` hooks.
for hook in "${before_hooks[@]}"; do eval "$hook"; done
# Invoke `python-build` and record the exit status in $STATUS.
python-build $KEEP $VERBOSE $HAS_PATCH $DEBUG "$DEFINITION" "$PREFIX" || \
{ STATUS=$?; [[ $STATUS -gt $COMBINED_STATUS ]] && COMBINED_STATUS=$STATUS; }
# Display a more helpful message if the definition wasn't found.
if [ "$STATUS" == "2" ]; then
{ candidates="$(definitions "$DEFINITION")"
if [ -n "$candidates" ]; then
echo
echo "The following versions contain \`$DEFINITION' in the name:"
echo "$candidates" | indent
fi
echo
echo "The following versions contain \`$DEFINITION' in the name:"
echo "$candidates" | indent
fi
echo
echo "See all available versions with \`pyenv install --list'."
echo
echo -n "If the version you need is missing, try upgrading pyenv"
if [ "$here" != "${here#$(brew --prefix 2>/dev/null)}" ]; then
printf ":\n\n"
echo " brew update && brew upgrade pyenv"
elif [ -d "${here}/.git" ]; then
printf ":\n\n"
echo " cd ${here} && git pull && cd -"
else
printf ".\n"
fi
} >&2
fi
echo "See all available versions with \`pyenv install --list'."
echo
echo -n "If the version you need is missing, try upgrading pyenv"
declare brew_prefix
if brew_prefix="$(brew --prefix 2>/dev/null)" && [[ $_PYENV_INSTALL_PREFIX/ == "$brew_prefix/"* ]]; then
printf ":\n\n"
echo " brew update && brew upgrade pyenv"
elif [ -d "${_PYENV_INSTALL_PREFIX}/.git" ]; then
printf ":\n\n"
echo " cd ${_PYENV_INSTALL_PREFIX} && git pull && cd -"
else
printf ".\n"
fi
} >&2
fi
# Execute `after_install` hooks.
for hook in "${after_hooks[@]}"; do eval "$hook"; done
# Execute `after_install` hooks.
for hook in "${after_hooks[@]}"; do eval "$hook"; done
# Run `pyenv-rehash` after a successful installation.
if [ "$STATUS" == "0" ]; then
pyenv-rehash
else
cleanup
fi
# Run `pyenv-rehash` after a successful installation.
if [[ $STATUS -eq 0 ]]; then
pyenv-rehash
else
cleanup
break
fi
exit "$STATUS"
done
exit "${COMBINED_STATUS}"

View file

@ -0,0 +1,47 @@
#!/usr/bin/env bash
#
# Summary: Install Python build prerequisites on Debian-based systems
#
# Usage: pyenv install-prerequisites
#
set -e
[ -n "$PYENV_DEBUG" ] && set -x
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
exit
fi
usage() {
pyenv-help install-prerequisites 2>/dev/null
[ -z "$1" ] || exit "$1"
}
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
usage 0
fi
[ "$#" -eq 0 ] || usage 1 >&2
if ! command -v apt-get >/dev/null; then
echo "pyenv: installing build prerequisites is not supported on this system" >&2
exit 1
fi
prerequisites=(
make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev
libsqlite3-dev curl git llvm libncurses5-dev libncursesw5-dev xz-utils
tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev libzstd-dev
)
if [ "$(id -u)" -eq 0 ]; then
apt_get=(apt-get)
elif command -v sudo >/dev/null; then
apt_get=(sudo apt-get)
else
echo "pyenv: sudo is required to install build prerequisites" >&2
exit 1
fi
"${apt_get[@]}" update -q
"${apt_get[@]}" install -yq "${prerequisites[@]}"

View file

@ -1,8 +1,8 @@
#!/usr/bin/env bash
#
# Summary: Uninstall a specific Python version
# Summary: Uninstall Python versions
#
# Usage: pyenv uninstall [-f|--force] <version>
# Usage: pyenv uninstall [-f|--force] <version> ...
#
# -f Attempt to remove the specified version without prompting
# for confirmation. If the version does not exist, do not
@ -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
@ -33,14 +34,17 @@ if [ "$1" = "-f" ] || [ "$1" = "--force" ]; then
shift
fi
[ "$#" -eq 1 ] || usage 1 >&2
[ "$#" -gt 0 ] || usage 1 >&2
DEFINITION="$1"
case "$DEFINITION" in
"" | -* )
usage 1 >&2
;;
esac
versions=("$@")
for version in "${versions[@]}"; do
case "$version" in
"" | -* )
usage 1 >&2
;;
esac
done
declare -a before_hooks after_hooks
@ -59,29 +63,36 @@ IFS=$'\n' scripts=(`pyenv-hooks uninstall`)
IFS="$OLDIFS"
for script in "${scripts[@]}"; do source "$script"; done
uninstall-python() {
local DEFINITION="$1"
VERSION_NAME="${DEFINITION##*/}"
PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}"
local VERSION_NAME="${DEFINITION##*/}"
local PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}"
if [ -z "$FORCE" ]; then
if [ ! -d "$PREFIX" ]; then
echo "pyenv: version \`$VERSION_NAME' not installed" >&2
exit 1
if [ -z "$FORCE" ]; then
if [ ! -d "$PREFIX" ]; then
echo "pyenv: version \`$VERSION_NAME' not installed" >&2
exit 1
fi
read -p "pyenv: remove $PREFIX? (y/N) "
case "$REPLY" in
y | Y | yes | YES ) ;;
* ) exit 1 ;;
esac
fi
read -p "pyenv: remove $PREFIX? [y|N]"
case "$REPLY" in
y | Y | yes | YES ) ;;
* ) exit 1 ;;
esac
fi
for hook in "${before_hooks[@]}"; do eval "$hook"; done
for hook in "${before_hooks[@]}"; do eval "$hook"; done
if [ -d "$PREFIX" ]; then
rm -rf "$PREFIX"
pyenv-rehash
echo "pyenv: $VERSION_NAME uninstalled"
fi
if [ -d "$PREFIX" ]; then
rm -rf "$PREFIX"
pyenv-rehash
echo "pyenv: $VERSION_NAME uninstalled"
fi
for hook in "${after_hooks[@]}"; do eval "$hook"; done
}
for hook in "${after_hooks[@]}"; do eval "$hook"; done
for version in "${versions[@]}"; do
uninstall-python "$version"
done

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1 @@
/venv

View file

@ -0,0 +1,758 @@
#!/usr/bin/env python3
"""Script to add CPython releases.
Checks the CPython download archives for new versions,
then writes a build script for any which do not exist locally,
saving it to plugins/python-build/share/python-build.
"""
import argparse
import dataclasses
import hashlib
import io
import itertools
import logging
import operator
import os.path
import pathlib
import pprint
import re
import shutil
import subprocess
import sys
import typing
import urllib.parse
import jc
import more_itertools
import packaging.version
import requests
import requests_html
import sortedcontainers
import tqdm
logger = logging.getLogger(__name__)
CUTOFF_VERSION=packaging.version.Version('3.10')
EXCLUDED_VERSIONS= {
}
here = pathlib.Path(__file__).resolve()
OUT_DIR: pathlib.Path = here.parent.parent / "share" / "python-build"
AUTO_ADD_VERSION_REF_RE = re.compile(
r"^(?P<object_id>[0-9a-f]{40,64})\t"
r"refs/heads/auto_add_version/(?P<versions>\S+)$"
)
OPENSSL_RELEASE_TAG_RE = re.compile(
r"^openssl-(?P<major>\d+)\.\d+(?:\.\d+)*(?:[a-z]+\d*)?$"
)
T_THUNK=\
'''export PYTHON_BUILD_FREE_THREADING=1
source "${BASH_SOURCE[0]%t}"
'''
def adapt_script(version: packaging.version.Version,
previous_version: packaging.version.Version) -> typing.Union[pathlib.Path, None]:
previous_version_path = OUT_DIR.joinpath(str(previous_version))
with previous_version_path.open("r", encoding='utf-8') as f:
script = f.readlines()
result = io.StringIO()
for line in script:
if m:=re.match(r'\s*install_package\s+"(?P<package>Python-\S+)"\s+'
r'"(?P<url>\S+)"\s+.*\s+verify_py(?P<verify_py_suffix>\d+)\s+.*$',
line):
existing_url_path = urllib.parse.urlparse(m.group('url')).path
try:
matched_download = more_itertools.one(
item for item in VersionDirectory.available[version].downloads
if existing_url_path.endswith(item.extension))
except ValueError:
logger.error(f'Cannot match existing URL path\'s {existing_url_path} extension '
f'to available downloads {VersionDirectory.available[version].downloads}')
return
new_package_name, new_package_url = matched_download.package_name, matched_download.url
new_package_hash = Url.sha256_url(new_package_url, VersionDirectory.session)
verify_py_suffix = str(version.major)+str(version.minor)
line = Re.sub_groups(m,
package=new_package_name,
url=new_package_url+'#'+new_package_hash,
verify_py_suffix=verify_py_suffix)
elif m:=re.match(r'\s*install_package\s+'
r'"(?P<package>openssl-(?P<openssl_major>\d+)\.\S+)"\s+'
r'"(?P<url>\S+)"\s.*$',
line):
item = VersionDirectory.openssl.get_store_latest_release(
int(m.group('openssl_major'))
)
line = Re.sub_groups(m,
package=item.package_name,
url=item.url + '#' + item.hash)
elif m:=re.match(r'\s*install_package\s+"(?P<package>readline-\S+)"\s+'
r'"(?P<url>\S+)"\s.*$',
line):
item = VersionDirectory.readline.get_store_latest_release()
line = Re.sub_groups(m,
package=item.package_name,
url=item.url + '#' + item.hash)
result.write(line)
result_path = OUT_DIR.joinpath(str(version))
logger.info(f"Writing {result_path}")
result_path.write_text(result.getvalue(), encoding='utf-8')
result.close()
return result_path
def add_version(version: packaging.version.Version):
previous_version = VersionDirectory.existing.pick_previous_version(version).version
is_prerelease_upgrade = previous_version.major==version.major\
and previous_version.minor==version.minor\
and previous_version.micro==version.micro
logger.info(f"Adding {version} based on {previous_version}"
+ (" (prerelease upgrade)" if is_prerelease_upgrade else ""))
VersionDirectory.available.get_store_available_source_downloads(version)
new_path = adapt_script(version,
previous_version)
if not new_path:
return False
VersionDirectory.existing.append(_CPythonExistingScriptInfo(version,str(new_path)))
handle_version_patches(version, previous_version, is_prerelease_upgrade)
cleanup_prerelease_upgrade(is_prerelease_upgrade, previous_version, version)
handle_t_thunks(version, previous_version, is_prerelease_upgrade)
print(version)
return True
def handle_version_patches(
version: packaging.version.Version,
previous_version: packaging.version.Version,
is_prerelease_upgrade: bool)\
-> None:
if (previous_version.major, previous_version.minor) != (version.major, version.minor):
return
patches_dir = OUT_DIR / "patches"
previous_patches = patches_dir / str(previous_version)
if not previous_patches.exists():
return
new_patches = patches_dir / str(version)
if is_prerelease_upgrade:
logger.info(f"Git moving patches from {previous_version} to {version}")
subprocess.check_call((
"git", "-C", OUT_DIR, "mv",
f"patches/{previous_version}",
f"patches/{version}",
))
else:
logger.info(f"Copying patches from {previous_version} to {version}")
shutil.copytree(previous_patches, new_patches)
# Subdir rename as a separate step from upper dir copying/moving
# in case there are patches for dependency packages as well
previous_package_patches = new_patches / f"Python-{previous_version}"
new_package_patches = new_patches / f"Python-{version}"
if is_prerelease_upgrade:
subprocess.check_call((
"git", "-C", OUT_DIR, "mv",
f"patches/{version}/Python-{previous_version}",
f"patches/{version}/Python-{version}",
))
else:
previous_package_patches.rename(new_package_patches)
if uses_t_thunks(previous_version) and is_prerelease_upgrade:
(patches_dir / f"{previous_version}t").unlink(missing_ok=True)
if uses_t_thunks(version):
(patches_dir / f"{version}t").symlink_to(
str(version), target_is_directory=True
)
def cleanup_prerelease_upgrade(
is_prerelease_upgrade: bool,
previous_version: packaging.version.Version,
new_version: packaging.version.Version)\
-> None:
if not is_prerelease_upgrade:
return
previous_version_filename = str(previous_version)
new_version_filename = str(new_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):
if not uses_t_thunks(version):
return
# an old thunk may have older version-specific code
# so it's safer to write a known version-independent template
thunk_name = (str(version) + "t")
thunk_path = OUT_DIR / thunk_name
previous_thunk_name = str(previous_version) + "t"
if is_prerelease_upgrade:
logger.info(f"Git moving {previous_thunk_name} to {thunk_name}")
subprocess.check_call(("git","-C",OUT_DIR,
"mv",
previous_thunk_name,
thunk_name))
logger.info(f"Writing {thunk_path}")
thunk_path.write_text(T_THUNK, encoding='utf-8')
def uses_t_thunks(version: packaging.version.Version) -> bool:
return (version.major, version.minor) >= (3, 13)
Arguments: argparse.Namespace
def main():
global Arguments
Arguments = parse_args()
logging.basicConfig(level=logging.DEBUG if Arguments.verbose else logging.INFO)
cached_session=requests_html.HTMLSession()
global VersionDirectory
VersionDirectory = _VersionDirectory(cached_session)
VersionDirectory.existing.populate()
VersionDirectory.available.populate()
# Prereleases are placed under the same directory as the corresponding release.
# So until we know the release is out, its directory is a potential prerelease directory.
# Normally, prereleases are only made for initial releases (x.y.0) --
# but rarely, they may make them for other releases (e.g. 3.14.5).
for release in (v for v in frozenset(VersionDirectory.available.keys()) #refining alters the
#corresponding directory key
#which breaks iteration
#over the directory --
#so have to iterate over a copy
if v not in VersionDirectory.existing):
VersionDirectory.available.get_store_available_source_downloads(release, True)
del release
# Excluding versions for which there already are PRs.
# This will prevent us from using advanced features of
# peter-evans/create-pull-request Github Action
# like updating a PR and closing a superseded PR
# but we don't really need them as of this writing.
versions_to_add = sorted(
VersionDirectory.available.keys()
- VersionDirectory.existing.keys()
- get_pending_versions()
)
logger.info("Versions to add:\n"+pprint.pformat(versions_to_add))
result = False
for version_to_add in versions_to_add:
result = add_version(version_to_add) or result
return int(not result)
def get_pending_versions() -> typing.Set[packaging.version.Version]:
ls_remote = subprocess.check_output(
("git", "-C", OUT_DIR, "ls-remote", "origin",
"refs/heads/auto_add_version/*"),
text=True,
timeout=30,
)
pending_versions = set()
for line in ls_remote.splitlines():
if not (match := AUTO_ADD_VERSION_REF_RE.fullmatch(line)):
raise ValueError(f"Unexpected git ls-remote output line: {line!r}")
pending_versions.update(
packaging.version.Version(version)
for version in match.group("versions").split("_")
)
return pending_versions
def parse_args():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"-d", "--dry-run", action="store_true",
help="Do not write scripts, just report them to stdout",
)
parser.add_argument(
"-v", "--verbose", action="store_true", default=0,
help="Increase verbosity of logging",
)
parsed = parser.parse_args()
return parsed
T = typing.TypeVar('T', bound=object)
K = typing.TypeVar('K', bound=typing.Hashable)
class KeyedList(typing.List[T], typing.Mapping[K, T]):
key_field: str
item_init: typing.Callable[..., T] = None
def __init__(self, seq: typing.Union[typing.Iterable[T], None] = None):
super().__init__()
self._map = {}
if seq is not None:
self.__iadd__(seq)
# read
def __getitem__(self, key: K) -> T:
return self._map[key]
def __contains__(self, key: K):
return key in self._map
def keys(self) -> typing.AbstractSet[K]:
return self._map.keys()
# write
def append(self, item: T) -> None:
key = self._getkey(item)
if key in self:
raise ValueError(f"Key '{key:r}' already present")
super().append(item)
self._map[key] = item
def __iadd__(self, other: typing.Iterable[T]):
for item in other:
self.append(item)
return self
def __delitem__(self, key: K):
super().remove(self[key])
del self._map[key]
def clear(self):
super().__delitem__(slice(None,None))
self._map.clear()
# read-write
def get_or_create(self, key: K, **kwargs):
try:
return self[key]
except KeyError as e:
if self.item_init is None:
raise AttributeError("'item_init' must be set to use automatic item creation") from e
kwargs[self.key_field] = key
item = self.item_init(**kwargs)
self.append(item)
return item
# info
def __repr__(self):
return self.__class__.__name__ + "([" + ", ".join(repr(i) for i in self) + "])"
# private
def _getkey(self, item: T) -> K:
return getattr(item, self.key_field)
del T, K
@dataclasses.dataclass(frozen=True)
class _CPythonAvailableVersionDownloadInfo:
extension: str
package_name: str
url: str
class _CPythonAvailableVersionDownloadsDirectory(KeyedList[_CPythonAvailableVersionDownloadInfo, str]):
key_field = "extension"
@dataclasses.dataclass(frozen=True)
class _CPythonAvailableVersionInfo:
version: packaging.version.Version
download_page_url: str
downloads: _CPythonAvailableVersionDownloadsDirectory = dataclasses.field(
default_factory=lambda:_CPythonAvailableVersionDownloadsDirectory()
)
class CPythonAvailableVersionsDirectory(KeyedList[_CPythonAvailableVersionInfo, packaging.version.Version]):
key_field = "version"
_session: requests.Session
item_init = _CPythonAvailableVersionInfo
def __init__(self, session: requests.Session, seq=None):
super().__init__(seq)
self._session = session
def populate(self):
"""
Fetch remote versions
"""
logger.info("Fetching available CPython versions")
for name, url in DownloadPage.enum_download_entries(
"https://www.python.org/ftp/python/",
r'^(\d+.*)/$', self._session,
make_name= lambda m: m.group(1)
):
v = packaging.version.Version(name)
if v < CUTOFF_VERSION or v in EXCLUDED_VERSIONS:
continue
logger.debug(f'Available version: {name} ({v}), {url}')
self.append(_CPythonAvailableVersionInfo(
v,
url
))
def get_store_available_source_downloads(self, version, refine_mode=False):
entry = self[version]
if entry.downloads:
#already retrieved
return
additional_versions_found =\
CPythonAvailableVersionsDirectory(self._session) if refine_mode else None
exact_download_found = False
for name, url in DownloadPage.enum_download_entries(
entry.download_page_url,
r'Python-.*\.(tar\.xz|tgz)$',
self._session):
m = re.match(r'(?P<package>Python-(?P<version>.*))\.(?P<extension>tar\.xz|tgz)$', name)
download_version = packaging.version.Version(m.group("version"))
if download_version != version:
if not refine_mode:
logger.warning(f"Ignoring download {name} ({download_version}) "
f"for {version} at page {entry.download_page_url}")
continue
entry_to_fill = additional_versions_found.get_or_create(
download_version,
download_page_url=entry.download_page_url
)
else:
exact_download_found = True
entry_to_fill = entry
entry_to_fill.downloads.append(_CPythonAvailableVersionDownloadInfo(
m.group("extension"), m.group('package'), url
))
# XXX: Exact download not found in non-refine mode never happens now
# 'cuz we first call the function in refine mode.
# Decide what's best to do if it starts to after a logic change.
if not exact_download_found and refine_mode:
actual_version = max(additional_versions_found.keys())
logger.debug(f"Refining available version {version} to {actual_version}")
del self[version]
self.append(
additional_versions_found[
actual_version
])
class _CPythonExistingScriptInfo(typing.NamedTuple):
version: packaging.version.Version
filename: str
class CPythonExistingScriptsDirectory(KeyedList[_CPythonExistingScriptInfo, packaging.version.Version]):
key_field = "version"
_filename_pattern = r'^\d+\.\d+(?:(t?)(-\w+)|(.\d+((?:a|b|rc)\d)?(t?)))$'
def populate(self):
"""
Enumerate existing installation scripts in share/python-build/ by pattern
"""
logger.info(f"Enumerating existing versions in {OUT_DIR}")
for entry_name in (p.name for p in OUT_DIR.iterdir() if p.is_file()):
if (not (m := re.match(self._filename_pattern, entry_name))
or m.group(1) == 't' or m.group(5) == 't'):
continue
try:
v = packaging.version.Version(entry_name)
if v < CUTOFF_VERSION:
continue
# branch tip scripts are different from release scripts and thus unusable as a pattern
if v.dev is not None:
continue
logger.debug(f"Existing version {v}")
self.append(_CPythonExistingScriptInfo(v, entry_name))
except ValueError as e:
logger.error(f"Unable to parse existing version {entry_name}: {e}")
def pick_previous_version(self,
version: packaging.version.Version) \
-> _CPythonExistingScriptInfo:
return max(v for v in self if v.version < version)
class _OpenSSLVersionInfo(typing.NamedTuple):
version: packaging.version.Version
package_name: str
url: str
hash: str
class OpenSSLVersionsDirectory(KeyedList[_OpenSSLVersionInfo, packaging.version.Version]):
key_field = "version"
def get_store_latest_release(self, major: int) \
-> _OpenSSLVersionInfo:
matching = [
release for release in self
if release.version.major == major
]
if matching:
return max(matching, key=lambda release: release.version)
url = "https://api.github.com/repos/openssl/openssl/releases"
while url:
response = Requests.get(url)
matching = [
release
for release in response.json()
if not release['draft']
and not release['prerelease']
and (match := OPENSSL_RELEASE_TAG_RE.fullmatch(
release['tag_name']
))
and int(match.group('major')) == major
]
if matching:
j_release = matching[0]
break
url = response.links.get('next', {}).get('url')
else:
raise ValueError(f"No OpenSSL {major}.x release found")
# noinspection PyTypeChecker
# urlparse can parse str as well as bytes
shasum_url = more_itertools.one(
asset['browser_download_url']
for asset in j_release['assets']
if urllib.parse.urlparse(asset['browser_download_url']).path.split('/')[-1].endswith('.sha256')
)
shasum_text = Requests.get(shasum_url).text
shasum_data = jc.parse("hashsum", shasum_text, quiet=True)[0]
package_hash, package_filename = shasum_data["hash"], shasum_data["filename"]
del shasum_data, shasum_text, shasum_url
# OpenSSL Github repo has tag names "openssl-<version>" as of this writing like we need
# but let's not rely on that
# splitext doesn't work with a chained extension, it only splits off the last one
package_name, package_version_str = re.match(r"([^-]+-(.*?))\.\D", package_filename).groups()
package_version = packaging.version.Version(package_version_str)
package_url = more_itertools.one(
asset['browser_download_url']
for asset in j_release['assets']
if urllib.parse.urlparse(asset['browser_download_url']).path.split('/')[-1] == package_filename
)
result = _OpenSSLVersionInfo(package_version, package_name, package_url, package_hash)
self.append(result)
return result
class _ReadlineVersionInfo(typing.NamedTuple):
version : packaging.version.Version
package_name : str
url : str
hash : str
class ReadlineVersionsDirectory(KeyedList[_ReadlineVersionInfo, packaging.version.Version]):
key_field = "version"
def get_store_latest_release(self):
if not self:
self._store_latest_release()
return self._latest_release()
def _store_latest_release(self):
candidates = ReadlineVersionsDirectory()
pattern = r'(?P<package_name>readline-(?P<version>\d+(?:\.\d+)+)).tar\.gz$'
for name, url in DownloadPage.enum_download_entries(
'https://ftpmirror.gnu.org/readline/', pattern, VersionDirectory.session):
m = re.match(pattern, name)
version = packaging.version.Version(m.group('version'))
candidates.append(_ReadlineVersionInfo(
version,
m.group('package_name'),
url,
""
))
max_item = candidates._latest_release()
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(
max_item.version,
max_item.package_name,
permalink,
hash_)
self.append(result)
return result
def _latest_release(self):
return self[max(self.keys())]
class _VersionDirectory:
def __init__(self, session):
self.existing = CPythonExistingScriptsDirectory()
self.available = CPythonAvailableVersionsDirectory(session)
self.openssl = OpenSSLVersionsDirectory()
self.readline = ReadlineVersionsDirectory()
self.session = session
VersionDirectory : _VersionDirectory
class DownloadPage:
class _DownloadPageEntry(typing.NamedTuple):
name: str
url: str
@classmethod
def enum_download_entries(cls, url, pattern, session=None,
make_name = lambda m: m.string ) \
-> typing.Generator[_DownloadPageEntry, None, None]:
"""
Enum download entries in a standard Apache directory page
(incl. CPython download page https://www.python.org/ftp/python/)
or a GNU mirror directory page
(https://ftpmirror.gnu.org/<package>/ destinations)
"""
if session is None:
session = requests_html.HTMLSession()
response = session.get(url, timeout=30)
response.raise_for_status()
page = response.html
table = page.find("pre", first=True)
# some GNU mirrors format entries as a table
# (e.g. https://mirrors.ibiblio.org/gnu/readline/)
if table is None:
table = page.find("table", first=True)
links = table.find("a")
for link in links:
href = link.attrs['href']
# CPython entries are directories
name = link.text
# skip directory entries
if not (m:=re.match(pattern, name)):
continue
name = make_name(m)
yield cls._DownloadPageEntry(name, urllib.parse.urljoin(response.url, href))
class Re:
@dataclasses.dataclass
class _interval:
group: typing.Union[int, str, None]
start: int
end: int
@staticmethod
def sub_groups(match: re.Match,
/, *args: [typing.AnyStr],
**kwargs: [typing.AnyStr])\
-> typing.AnyStr:
repls={i:repl for i,repl in enumerate(args) if repl is not None}
repls.update({n:repl for n,repl in kwargs.items() if repl is not None})
intervals: sortedcontainers.SortedList[Re._interval]=\
sortedcontainers.SortedKeyList(key=operator.attrgetter("start","end"))
for group_id in itertools.chain(range(1,len(match.groups())), match.groupdict().keys()):
if group_id not in repls:
continue
if match.start(group_id) == -1:
continue
intervals.add(Re._interval(group_id,match.start(group_id),match.end(group_id)))
del group_id
last_interval=Re._interval(None,0,0)
result=""
for interval in intervals:
if interval.start < last_interval.end:
raise ValueError(f"Cannot replace intersecting matches "
f"for groups {last_interval.group} and {interval.group} "
f"(position {interval.start})")
if interval.end == interval.start and \
last_interval.start == last_interval.end == interval.start:
raise ValueError(f"Cannot replace consecutive zero-length matches "
f"for groups {last_interval.group} and {interval.group} "
f"(position {interval.start})")
result+=match.string[last_interval.end:interval.start]+repls[interval.group]
last_interval = interval
result+=match.string[last_interval.end:]
return result
class Url:
@staticmethod
def sha256_url(url, session=None):
if session is None:
session = requests_html.HTMLSession()
logger.info(f"Downloading and computing hash of {url}")
h=hashlib.sha256()
r=session.get(url,stream=True,timeout=30)
total_bytes=int(r.headers.get('content-length',0)) or float('inf')
with tqdm.tqdm(total=total_bytes, unit='B', unit_scale=True, unit_divisor=1024) as t:
for c in r.iter_content(1024):
t.update(len(c))
h.update(c)
return h.hexdigest()
class Requests:
@staticmethod
def get(url: str) -> requests.Response:
response = requests.get(url, timeout=30)
response.raise_for_status()
return response
if __name__ == "__main__":
#sys.excepthook seems to have no effect in Github Actions
try:
sys.exit(main())
except Exception:
logging.exception("Unhandled exception occurred")
sys.exit(2)

View file

@ -11,14 +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 requests_html
@ -26,15 +30,19 @@ logger = logging.getLogger(__name__)
CONDA_REPO = "https://repo.anaconda.com"
MINICONDA_REPO = CONDA_REPO + "/miniconda"
# ANACONDA_REPO = CONDA_REPO + "/archive"
ANACONDA_REPO = CONDA_REPO + "/archive"
auto_accept_tos_fmt="""export CONDA_PLUGINS_AUTO_ACCEPT_TOS=true
""".strip()
install_script_fmt = """
{auto_accept_tos}
case "$(anaconda_architecture 2>/dev/null || true)" in
{install_lines}
* )
{{ echo
colorize 1 "ERROR"
echo ": The binary distribution of Miniconda is not available for $(anaconda_architecture 2>/dev/null || true)."
echo ": The binary distribution of {tflavor} is not available for $(anaconda_architecture 2>/dev/null || true)."
echo
}} >&2
exit 1
@ -44,7 +52,7 @@ esac
install_line_fmt = """
"{os}-{arch}" )
install_script "Miniconda{suffix}-{version_str}-{os}-{arch}" "{repo}/Miniconda{suffix}-{version_str}-{os}-{arch}.sh#{md5}" "miniconda" verify_{py_version}
install_script "{tflavor}{suffix}-{version_py_version}{version_str}-{os}-{arch}" "{repo}/{tflavor}{suffix}-{version_py_version}{version_str}-{os}-{arch}.sh#{md5}" "{flavor}" verify_{py_version}
;;
""".strip()
@ -77,35 +85,67 @@ class SupportedOS(StrEnum):
class SupportedArch(StrEnum):
AARCH64 = "aarch64"
ARM64 = "arm64"
PPC64LE = "ppc64le"
S390X = "s390x"
X86_64 = "x86_64"
X86 = "x86"
class Flavor(StrEnum):
ANACONDA = "anaconda"
MINICONDA = "miniconda"
class TFlavor(StrEnum):
ANACONDA = "Anaconda"
MINICONDA = "Miniconda"
class Suffix(StrEnum):
TWO = "2"
THREE = "3"
NONE = ""
class PyVersion(StrEnum):
PY27 = "py27"
PY36 = "py36"
PY37 = "py37"
PY38 = "py38"
PY39 = "py39"
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
class VersionStr(str):
def info(self):
return tuple(int(n) for n in self.split("."))
return tuple(int(n) for n in self.replace("-", ".").split("."))
def __eq__(self, other):
return str(self) == str(other)
@ -123,58 +163,146 @@ class VersionStr(str):
return hash(str(self))
class MinicondaVersion(NamedTuple):
class CondaVersion(NamedTuple):
flavor: Flavor
suffix: Suffix
version_str: VersionStr
py_version: Optional[PyVersion]
@classmethod
def from_str(cls, s):
miniconda_n, ver = s.split("-")
return MinicondaVersion(Suffix(miniconda_n[-1]), VersionStr(ver))
"""
Convert a string of the form "miniconda_n-ver" or "miniconda_n-py_ver-ver" to a :class:`CondaVersion` object.
"""
miniconda_n, _, remainder = s.partition("-")
suffix = miniconda_n[-1]
if suffix in string.digits:
flavor = miniconda_n[:-1]
else:
flavor = miniconda_n
suffix = ""
components = remainder.split("-")
if flavor == Flavor.MINICONDA and len(components) >= 2:
py_ver, *ver_parts = components
py_ver = PyVersion(f"py{py_ver.replace('.', '')}")
ver = "-".join(ver_parts)
else:
ver = "-".join(components)
py_ver = None
return CondaVersion(Flavor(flavor), Suffix(suffix), VersionStr(ver), py_ver)
def to_filename(self):
return f"miniconda{self.suffix}-{self.version_str}"
if self.py_version:
return f"{self.flavor}{self.suffix}-{self.py_version.version()}-{self.version_str}"
else:
return f"{self.flavor}{self.suffix}-{self.version_str}"
def default_py_version(self):
if self.suffix == Suffix.TWO:
"""
:class:`PyVersion` of Python used with this Miniconda version
"""
if self.py_version:
return self.py_version
elif self.suffix == Suffix.TWO:
return PyVersion.PY27
elif self.version_str.info() < (4, 7):
v = self.version_str.info()
if self.flavor == "miniconda":
# https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-python.html
if v < (4, 7):
return PyVersion.PY36
if v < (4, 8):
return PyVersion.PY37
else:
# since 4.8, Miniconda specifies versions explicitly in the file name
raise ValueError("Miniconda 4.8+ is supposed to specify a Python version explicitly")
if self.flavor == "anaconda":
# Info about the bundled Python version
# https://www.anaconda.com/docs/getting-started/anaconda/release-notes
if v >= (2026,7):
return PyVersion.PY314
if v >= (2025,6):
return PyVersion.PY313
if v >= (2024,6):
return PyVersion.PY312
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):
return PyVersion.PY38
if v >= (2020,2):
return PyVersion.PY37
if v >= (5,3,0):
return PyVersion.PY37
return PyVersion.PY36
else:
return PyVersion.PY37
def with_version_triple(self):
return MinicondaVersion(
self.suffix, VersionStr.from_info(self.version_str.info()[:3])
)
raise ValueError(self.flavor)
def requires_tos_accept(self):
"""
requires to accept TOS for installation
"""
return self.flavor == Flavor.MINICONDA \
and self.version_str.info() >= (25,)
class MinicondaSpec(NamedTuple):
version: MinicondaVersion
class CondaSpec(NamedTuple):
tflavor: TFlavor
version: CondaVersion
os: SupportedOS
arch: SupportedArch
md5: str
repo: str
py_version: Optional[PyVersion] = None
@classmethod
def from_filestem(cls, stem, md5, py_version=None):
miniconda_n, ver, os, arch = stem.split("-")
spec = MinicondaSpec(
MinicondaVersion(Suffix(miniconda_n[-1]), VersionStr(ver)),
def from_filestem(cls, stem, md5, repo, py_version=None):
# The `*vers` captures the new trailing `-1` in some file names (a build number?)
# so they can be processed properly.
miniconda_n, *vers, os, arch = stem.split("-")
ver = "-".join(vers)
suffix = miniconda_n[-1]
if suffix in string.digits:
tflavor = miniconda_n[:-1]
else:
tflavor = miniconda_n
suffix = ""
flavor = tflavor.lower()
if ver.startswith("py"):
py_ver, ver = ver.split("_", maxsplit=1)
py_ver = PyVersion(py_ver)
else:
py_ver = None
spec = CondaSpec(
TFlavor(tflavor),
CondaVersion(Flavor(flavor), Suffix(suffix), VersionStr(ver), py_ver),
SupportedOS(os),
SupportedArch(arch),
md5,
repo,
py_ver
)
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
def to_install_lines(self):
"""
Installation command for this version of Miniconda for use in a Pyenv installation script
"""
return install_line_fmt.format(
repo=MINICONDA_REPO,
tflavor=self.tflavor,
flavor=self.version.flavor,
repo=self.repo,
suffix=self.version.suffix,
version_str=self.version.version_str,
version_py_version=f"{self.version.py_version}_" if self.version.py_version else "",
os=self.os,
arch=self.arch,
md5=self.md5,
@ -182,37 +310,48 @@ class MinicondaSpec(NamedTuple):
)
def with_py_version(self, py_version: PyVersion):
return MinicondaSpec(*self[:-1], py_version=py_version)
def with_version_triple(self):
version, *others = self
return MinicondaSpec(version.with_version_triple(), *others)
return CondaSpec(*self[:-1], py_version=py_version)
def make_script(specs: List[MinicondaSpec]):
def make_script(specs: List[CondaSpec]):
install_lines = [s.to_install_lines() for s in specs]
return install_script_fmt.format(install_lines="\n".join(install_lines))
return install_script_fmt.format(
install_lines="\n".join(install_lines),
tflavor=specs[0].tflavor,
auto_accept_tos = auto_accept_tos_fmt if specs[0].version.requires_tos_accept() else ""
).lstrip()
def get_existing_minicondas():
logger.info("Getting known miniconda versions")
def get_existing_condas(name):
"""
Enumerate existing Miniconda installation scripts in share/python-build/ except rolling releases.
:returns: A generator of :class:`CondaVersion` objects.
"""
logger.info("Getting known %(name)s versions",locals())
for p in out_dir.iterdir():
name = p.name
if not p.is_file() or not name.startswith("miniconda"):
entry_name = p.name
if not p.is_file() or not entry_name.startswith(name):
continue
try:
v = MinicondaVersion.from_str(name)
v = CondaVersion.from_str(entry_name)
if v.version_str != "latest":
logger.debug("Found existing miniconda version %s", v)
logger.debug("Found existing %(name)s version %(v)s", locals())
yield v
except ValueError:
pass
except ValueError as e:
logger.error("Unable to parse existing version %s: %s", entry_name, e)
def get_available_minicondas():
logger.info("Fetching remote miniconda versions")
def get_available_condas(name, repo):
"""
Fetch remote miniconda versions.
:returns: A generator of :class:`CondaSpec` objects for each release available for download
except rolling releases.
"""
logger.info("Fetching remote %(name)s versions",locals())
session = requests_html.HTMLSession()
response = session.get(MINICONDA_REPO)
response = session.get(repo)
page: requests_html.HTML = response.html
table = page.find("table", first=True)
rows = table.find("tr")[1:]
@ -226,16 +365,17 @@ def get_available_minicondas():
stem = fname[:-3]
try:
s = MinicondaSpec.from_filestem(stem, md5)
s = CondaSpec.from_filestem(stem, md5, repo)
if s.version.version_str != "latest":
logger.debug("Found remote miniconda version %s", s)
logger.debug("Found remote %(name)s version %(s)s", locals())
yield s
except ValueError:
pass
def key_fn(spec: MinicondaSpec):
def key_fn(spec: CondaSpec):
return (
spec.tflavor,
spec.version.version_str.info(),
spec.version.suffix.value,
spec.os.value,
@ -250,43 +390,49 @@ if __name__ == "__main__":
help="Do not write scripts, just report them to stdout",
)
parser.add_argument(
"-v", "--verbose", action="count",
"-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(get_existing_minicondas())
available_specs = set(get_available_minicondas())
existing_versions = set()
available_specs = set()
for name,repo in ("miniconda",MINICONDA_REPO),("anaconda",ANACONDA_REPO):
existing_versions |= set(get_existing_condas(name))
available_specs |= set(get_available_condas(name, repo))
# version triple to triple-ified spec to raw spec
to_add: DefaultDict[
MinicondaVersion, Dict[MinicondaSpec, MinicondaSpec]
CondaVersion, Dict[CondaSpec, CondaSpec]
] = defaultdict(dict)
logger.info("Checking for new versions")
for s in sorted(available_specs, key=key_fn):
key = s.version.with_version_triple()
if key in existing_versions or key.version_str.info() <= (4, 3, 30):
logger.debug("Ignoring version %s (too old or already exists)", s)
key = s.version
vv = key.version_str.info()
reason = None
if key in existing_versions:
reason = "already exists"
elif key.version_str.info() <= (4, 3, 30):
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
to_add[key][s.with_version_triple()] = s
to_add[key][s] = s
logger.info("Writing %s scripts", len(to_add))
for ver, d in to_add.items():
specs = list(d.values())
fpath = out_dir / ver.to_filename()
script_str = make_script(specs)
logger.debug("Writing script for %s", ver)
logger.info("Writing script for %s", ver)
if parsed.dry_run:
print(f"Would write spec to {fpath}:\n" + textwrap.indent(script_str, " "))
else:

View file

@ -0,0 +1,168 @@
#!/usr/bin/env python3
'Adds the latest miniforge and mambaforge releases.'
from pathlib import Path
import argparse
import logging
import os
import string
import requests
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
MINIFORGE_REPO = 'conda-forge/miniforge'
DISTRIBUTIONS = ['miniforge']
DISTRIBUTIONS_PRE25 = ['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)
'25.3.0-0', #marked as prerelease, no Linux version
'25.11.0-0', #regression reported in constructor, re-released as 25.11.0-1 with hotfix bumping to constructor>=3.14 (was >=3.12, 3.13 implicit)
'26.1.1-0', #prerelease, no binary assets
'26.1.1-1', #prerelease, no binary assets
]
install_script_fmt = """
case "$(anaconda_architecture 2>/dev/null || true)" in
{install_lines}
* )
{{ echo
colorize 1 "ERROR"
echo ": The binary distribution of {flavor} is not available for $(anaconda_architecture 2>/dev/null || true)."
echo
}} >&2
exit 1
;;
esac
""".lstrip()
install_line_fmt = """
"{os}-{arch}" )
install_script "{filename}" "{url}#{sha}" "miniconda" verify_py{py_version}
;;
""".strip()
here = Path(__file__).resolve()
out_dir: Path = here.parent.parent / "share" / "python-build"
def download_sha(url):
logger.info(f'Downloading SHA file {url}')
tup = tuple(reversed(requests.get(url).text.replace('./', '').rstrip().split()))
logger.debug(f'Got {tup}')
return tup
def create_spec(filename, sha, url):
flavor_with_suffix, version, subversion, os, arch = filename.replace('.sh', '').split('-')
suffix = flavor_with_suffix[-1]
if suffix in string.digits:
flavor = flavor_with_suffix[:-1]
else:
flavor = flavor_with_suffix
spec = {
'filename': filename,
'sha': sha,
'url': url,
'py_version': py_version(version),
'flavor': flavor,
'os': os,
'arch': arch,
'installer_filename': f'{flavor_with_suffix.lower()}-{version}-{subversion}',
}
logger.debug(f'Created spec {spec}')
return spec
def version_tuple(version):
return tuple(int(part) for part in version.split('-')[0].split("."))
def py_version(version):
"""Suffix for `verify_pyXXX` to call in the generated build script"""
version_tuple_ = version_tuple(version)
# current version: mentioned under https://github.com/conda-forge/miniforge?tab=readme-ov-file#requirements-and-installers
# transition points:
# https://github.com/conda-forge/miniforge/blame/main/Miniforge3/construct.yaml
# look for "- python <version>" in non-pypy branch and which tag the commit is first in
if version_tuple_ >= (26,1):
# https://github.com/conda-forge/miniforge/commit/0016367731e52c67234d6d0e7e6a24c6bf7673e4
return "313"
if version_tuple_ >= (24,5):
# yes, they jumped from 3.10 directly to 3.12
# https://github.com/conda-forge/miniforge/commit/bddad0baf22b37cfe079e47fd1680fdfb2183590
return "312"
if version_tuple_ >= (4,14):
return "310"
raise ValueError("Bundled Python version unknown for release `%s'"%version)
def supported(filename):
return ('pypy' not in filename) and ('Windows' not in filename) and (not filename.endswith('.pkg'))
def add_version(release, distributions):
tag_name = release['tag_name']
download_urls = { f['name']: f['browser_download_url'] for f in release['assets'] }
# 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.splitext(name)[0]) 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:
distribution_specs = [spec for spec in specs if distribution in spec['flavor'].lower()]
count = len(distribution_specs)
if count > 0:
output_file = out_dir / distribution_specs[0]['installer_filename']
logger.info(f'Writing {count} specs for {distribution} to {output_file}')
script_str = install_script_fmt.format(
install_lines="\n".join([install_line_fmt.format_map(s) for s in distribution_specs]),
flavor=distribution_specs[0]['flavor'],
)
with open(output_file, 'w') as f:
f.write(script_str)
else:
logger.info(f'Did not find specs for {distribution}')
def main():
for release in requests.get(f'https://api.github.com/repos/{MINIFORGE_REPO}/releases').json():
version = release['tag_name']
if version in SKIPPED_RELEASES:
continue
logger.debug(f'Looking for {version} in {out_dir}')
# mambaforge is retired https://github.com/conda-forge/miniforge/releases/tag/24.11.2-0
if version_tuple(version) >= (24, 11, 2):
distributions = DISTRIBUTIONS
else:
distributions = DISTRIBUTIONS_PRE25
if any(not list(out_dir.glob(f'{distribution}*-{version}')) for distribution in distributions):
logger.info(f'Downloading {version}')
add_version(release, distributions)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"-d", "--dry-run", action="store_true",
help="Do not write scripts, just report them to stdout",
)
parser.add_argument(
"-v", "--verbose", action="store_true", default=0,
help="Increase verbosity of logging",
)
parsed = parser.parse_args()
if parsed.verbose: logging.getLogger.setLevel(logging.DEBUG)
main()

View file

@ -1 +1,9 @@
more_itertools
requests-html
fake_useragent<2; python_version < "3.9"
lxml[html_clean]
packaging
requests
sortedcontainers
tqdm
jc

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
install_package "Python-2.5" "https://www.python.org/ftp/python/2.5/Python-2.5.tgz#d7bbf42e36003c6065cd19f3e67d283521858515ee923220f654131cebe1d8f2" standard verify_py25
install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
install_package "Python-2.5.1" "https://www.python.org/ftp/python/2.5.1/Python-2.5.1.tgz#1f5caee846049ca30d996f9403eefdb996295c4af664867e35dcc5eb36e4e7e8" standard verify_py25
install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
install_package "Python-2.5.2" "https://www.python.org/ftp/python/2.5.2/Python-2.5.2.tgz#834afe8a88adaf623b05ac5dd6700dd5bb5d0d5553fc74ad529359a3496e4ae3" standard verify_py25
install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
install_package "Python-2.5.3" "https://www.python.org/ftp/python/2.5.3/Python-2.5.3.tgz#c3fee607d20a77dfb72ea2e627eb4d95d25c735603435abde62c57015a0445bd" standard verify_py25
install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
install_package "Python-2.5.4" "https://www.python.org/ftp/python/2.5.4/Python-2.5.4.tgz#3d3b205611ee503a38a9433d5645a571668420bb219242c7f51af85f05664da6" standard verify_py25
install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
install_package "Python-2.5.5" "https://www.python.org/ftp/python/2.5.5/Python-2.5.5.tgz#03be1019c4fe93daeb53ba9e4294bf22a8ed4cb854cbd57e24e16f6bf63e2392" standard verify_py25
install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "readline-8.0" "https://ftpmirror.gnu.org/readline/readline-8.0.tar.gz#e339f51971478d369f8a053a330a190781acb9864cf4c541060f12078948e461" mac_readline --if has_broken_mac_readline
install_package "Python-2.5.6" "https://www.python.org/ftp/python/2.5.6/Python-2.5.6.tgz#c2e4377597241b1065677d23327c04d0f41945d370c61a491cc88be367234c5d" standard verify_py25
install_package "setuptools-1.4.2" "https://pypi.python.org/packages/source/s/setuptools/setuptools-1.4.2.tar.gz#263986a60a83aba790a5bffc7d009ac88114ba4e908e5c90e453b3bf2155dbbd" python

View file

@ -0,0 +1,3 @@
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6" "https://www.python.org/ftp/python/2.6/Python-2.6.tgz#7c2f21a968a737a59ed0729f4b1dc154dc3aa183c20be96055186fe43c6742d0" standard verify_py26 ensurepip

View file

@ -0,0 +1,3 @@
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6.1" "https://www.python.org/ftp/python/2.6.1/Python-2.6.1.tgz#fb65e93678e1327e3e8559cc56e1e00ed8c07162b21287a3502677892c5c515c" standard verify_py26 ensurepip

View file

@ -0,0 +1,3 @@
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6.2" "https://www.python.org/ftp/python/2.6.2/Python-2.6.2.tgz#e37ecdf249f248f4fea227adbca09c778670b64fcb5e45947ec3e093cbc12c86" standard verify_py26 ensurepip

View file

@ -0,0 +1,3 @@
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6.3" "https://www.python.org/ftp/python/2.6.3/Python-2.6.3.tgz#a71b55540690425fd82ab00819aeb92c1b23cbb4730a0ccd2e25c833b22a812e" standard verify_py26 ensurepip

View file

@ -0,0 +1,3 @@
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6.4" "https://www.python.org/ftp/python/2.6.4/Python-2.6.4.tgz#1a25a47506e4165704cfe2b07c0a064b0b5762a2d18b8fbdad5af688aeacd252" standard verify_py26 ensurepip

View file

@ -0,0 +1,3 @@
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6.5" "https://www.python.org/ftp/python/2.6.5/Python-2.6.5.tgz#b331dafdce3361834fee783795d4f68ae7cf7d379e9137c2d8e8531cea615ede" standard verify_py26 ensurepip

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6.6" "https://www.python.org/ftp/python/2.6.6/Python-2.6.6.tgz#372f66db46d773214e4619df1794a26449158f626138d4d2141a64c2f017fae1" standard verify_py26 ensurepip

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6.7" "https://www.python.org/ftp/python/2.6.7/Python-2.6.7.tgz#a8093eace4cfd3e06b05f0deb5d765e3c6cec65908048640a8cadd7a948b3826" standard verify_py26 ensurepip

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6.8" "https://www.python.org/ftp/python/2.6.8/Python-2.6.8.tgz#5bf02a75ffa2fcaa5a3cabb8201998519b045541975622316888ea468d9512f7" standard verify_py26 ensurepip

View file

@ -1,4 +1,3 @@
#require_gcc
install_package "openssl-1.0.2k" "https://www.openssl.org/source/old/1.0.2/openssl-1.0.2k.tar.gz#6b3977c61f2aedf0f96367dcfb5c6e578cf37e7b8d913b4ecb6643c3cb88d8c0" 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_package "Python-2.6.9" "https://www.python.org/ftp/python/2.6.9/Python-2.6.9.tgz#7277b1285d8a82f374ef6ebaac85b003266f7939b3f2a24a3af52f9523ac94db" standard verify_py26 ensurepip

View file

@ -1,5 +1,6 @@
#require_gcc
prefer_openssl11
export PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA="${PYTHON_BUILD_HOMEBREW_OPENSSL_FORMULA:-openssl@1.1 openssl@1.0}"
export PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA="${PYTHON_BUILD_MACPORTS_OPENSSL_FORMULA:-openssl11 openssl10}"
export PYTHON_CFLAGS="${PYTHON_CFLAGS:+$PYTHON_CFLAGS }-std=c99"
install_package "openssl-1.1.0j" "https://www.openssl.org/source/old/1.1.0/openssl-1.1.0j.tar.gz#31bec6c203ce1a8e93d5994f4ed304c63ccf07676118b6634edded12ad1b3246" 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-2.7-dev" "https://github.com/python/cpython" "2.7" standard verify_py27 copy_python_gdb ensurepip

Some files were not shown because too many files have changed in this diff Show more