perf(pyenv): initialize shell integration once without rehash

Login shells source the fragment twice to restore shim precedence after the system profile. Reapplying PATH does not require repeating shell integration or rebuilding shims.
This commit is contained in:
Yuhao Qing
2026-09-08 00:41:08 +08:00
parent 82c6a57c3a
commit d5afd25bbe
2 changed files with 24 additions and 2 deletions
+20
View File
@@ -214,6 +214,26 @@ HOME="$pyenv_env_home" XDG_CONFIG_HOME="$pyenv_env_xdg" \
zsh -lc '[[ "$(command -v python3)" == "$HOME/.pyenv/shims/python3" ]]' || zsh -lc '[[ "$(command -v python3)" == "$HOME/.pyenv/shims/python3" ]]' ||
fail "pyenv Python is not restored in login zsh after the system profile" fail "pyenv Python is not restored in login zsh after the system profile"
# Interactive initialization runs once while repeated sourcing restores PATH.
mkdir -p "$pyenv_env_home/.pyenv/bin"
cat >"$pyenv_env_home/.pyenv/bin/pyenv" <<'PYENV'
#!/bin/sh
printf '%s\n' "$*" >> "$PYENV_ROOT/init-calls"
printf '%s\n' 'pyenv() { command pyenv "$@"; }'
PYENV
chmod +x "$pyenv_env_home/.pyenv/bin/pyenv"
HOME="$pyenv_env_home" PYENV_ROOT="$pyenv_env_home/.pyenv" PATH=/usr/bin:/bin \
zsh -dfic '
source "$1"
(( $+functions[pyenv] )) || exit 1
path=(/usr/bin /bin)
source "$1"
[[ $(command -v python3) == "$PYENV_ROOT/shims/python3" ]]
' zsh "$ROOT/zsh/pyenv.zsh" ||
fail "interactive pyenv initialization did not preserve its function and Python PATH"
printf '%s\n' 'init - --no-rehash zsh' | cmp -s - "$pyenv_env_home/.pyenv/init-calls" ||
fail "pyenv initialization must run once without a startup rehash"
# A later easyzsh migration must not move the login hook before the system profile. # A later easyzsh migration must not move the login hook before the system profile.
HOME="$pyenv_env_home" bash "$ROOT/deploy.sh" --home "$pyenv_env_home" --migrate-zprofile >/dev/null HOME="$pyenv_env_home" bash "$ROOT/deploy.sh" --home "$pyenv_env_home" --migrate-zprofile >/dev/null
grep -Fqx "$pyenv_login_hook" "$pyenv_env_home/.zprofile" || grep -Fqx "$pyenv_login_hook" "$pyenv_env_home/.zprofile" ||
+4 -2
View File
@@ -3,6 +3,8 @@ export PYENV_ROOT="${PYENV_ROOT:-$HOME/.pyenv}"
[[ -d "$PYENV_ROOT/bin" ]] && path=("$PYENV_ROOT/bin" ${path:#$PYENV_ROOT/bin}) [[ -d "$PYENV_ROOT/bin" ]] && path=("$PYENV_ROOT/bin" ${path:#$PYENV_ROOT/bin})
[[ -d "$PYENV_ROOT/shims" ]] && path=("$PYENV_ROOT/shims" ${path:#$PYENV_ROOT/shims}) [[ -d "$PYENV_ROOT/shims" ]] && path=("$PYENV_ROOT/shims" ${path:#$PYENV_ROOT/shims})
export PATH export PATH
if [[ -o interactive ]] && command -v pyenv &> /dev/null; then # Login profiles can reapply PATH without repeating shell integration.
eval "$(pyenv init - zsh)" # Run `pyenv rehash` after installing entry points through `python -m pip`.
if [[ -o interactive ]] && (( ! $+functions[pyenv] )) && command -v pyenv &> /dev/null; then
eval "$(pyenv init - --no-rehash zsh)"
fi fi