Merge pull request #1898 from native-api/startup_r1

Split startup logic into PATH and everything else
This commit is contained in:
Anton Petrov 2021-05-07 18:38:28 +03:00 committed by GitHub
commit fecb03fcb3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 130 additions and 72 deletions

View file

@ -208,28 +208,18 @@ easy to fork and contribute any changes back upstream.
pyenv repo is cloned and add `$PYENV_ROOT/bin` to your `$PATH` for access pyenv repo is cloned and add `$PYENV_ROOT/bin` to your `$PATH` for access
to the `pyenv` command-line utility. to the `pyenv` command-line utility.
- For **bash**: - For **bash**/**Zsh**:
~~~ bash ~~~ bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile
~~~ echo 'eval "$(pyenv init --path)"' >> ~/.profile
- For **Ubuntu Desktop**:
~~~ bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
~~~
- For **Zsh**:
~~~ zsh
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
~~~ ~~~
- For **Fish shell**: - For **Fish shell**:
~~~ fish ~~~ fish
set -Ux PYENV_ROOT $HOME/.pyenv set -Ux PYENV_ROOT $HOME/.pyenv
set -Ux fish_user_paths $PYENV_ROOT/bin $fish_user_paths set -Ux fish_user_paths $PYENV_ROOT/bin $fish_user_paths
pyenv init --path | source
~~~ ~~~
- **Proxy note**: If you use a proxy, export `http_proxy` and `https_proxy` too. - **Proxy note**: If you use a proxy, export `http_proxy` and `https_proxy` too.
@ -239,11 +229,6 @@ easy to fork and contribute any changes back upstream.
configuration file since it manipulates `PATH` during the initialization. configuration file since it manipulates `PATH` during the initialization.
- For **bash**: - For **bash**:
~~~ bash
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
~~~
- For **Ubuntu Desktop** and **Fedora**:
~~~ bash ~~~ bash
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc
~~~ ~~~

View file

@ -1,6 +1,6 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Summary: Configure the shell environment for pyenv # Summary: Configure the shell environment for pyenv
# Usage: eval "$(pyenv init - [--no-rehash] [<shell>])" # Usage: eval "$(pyenv init [-|--path] [--no-rehash] [<shell>])"
set -e set -e
[ -n "$PYENV_DEBUG" ] && set -x [ -n "$PYENV_DEBUG" ] && set -x
@ -8,6 +8,7 @@ set -e
# Provide pyenv completions # Provide pyenv completions
if [ "$1" = "--complete" ]; then if [ "$1" = "--complete" ]; then
echo - echo -
echo --path
echo --no-rehash echo --no-rehash
echo bash echo bash
echo fish echo fish
@ -16,15 +17,20 @@ if [ "$1" = "--complete" ]; then
exit exit
fi fi
print="" mode="help"
no_rehash="" no_rehash=""
for args in "$@" for args in "$@"
do do
if [ "$args" = "-" ]; then if [ "$args" = "-" ]; then
print=1 mode="print"
shift shift
fi fi
if [ "$args" = "--path" ]; then
mode="path"
shift
fi
if [ "$args" = "--no-rehash" ]; then if [ "$args" = "--no-rehash" ]; then
no_rehash=1 no_rehash=1
shift shift
@ -43,14 +49,33 @@ fi
root="${0%/*}/.." root="${0%/*}/.."
if [ -z "$print" ]; then function main() {
case "$mode" in
"help")
help_
exit 1
;;
"path")
print_path
exit 0
;;
"print")
init_dirs
warn_path
print_env
print_completion
print_shell_function
exit 0
;;
esac
# should never get here
exit 2
}
function help_() {
case "$shell" in case "$shell" in
bash ) bash )
if [ -f "${HOME}/.bashrc" ] && [ ! -f "${HOME}/.bash_profile" ]; then profile='~/.bashrc'
profile='~/.bashrc'
else
profile='~/.bash_profile'
fi
;; ;;
zsh ) zsh )
profile='~/.zshrc' profile='~/.zshrc'
@ -78,37 +103,73 @@ if [ -z "$print" ]; then
;; ;;
esac esac
echo echo
echo "# And the following to ~/.profile:"
echo
case "$shell" in
fish )
echo 'pyenv init --path | source'
;;
* )
echo 'eval "$(pyenv init --path)"'
;;
esac
echo
echo '# Make sure to restart your entire logon session'
echo '# for changes to ~/.profile to take effect.'
echo
} >&2 } >&2
}
exit 1 function init_dirs() {
fi mkdir -p "${PYENV_ROOT}/"{shims,versions}
}
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
}
case "$shell" in function warn_path() {
fish ) if ! perl -ls0x3A -e 'while (<>) { chomp; ($_ eq $d) && exit 0; } exit 1' -- -d="${PYENV_ROOT}/shims" <<<"$PATH" ; then
echo "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" echo 'echo '\''WARNING: `pyenv init -` no longer sets PATH.'\'
echo "set -gx PYENV_SHELL $shell" echo 'echo '\''Run `pyenv init` to see the necessary changes to make to your configuration.'\'
;; fi
* ) }
echo 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"'
echo "export PYENV_SHELL=$shell"
;;
esac
completion="${root}/completions/pyenv.${shell}" function print_env() {
if [ -r "$completion" ]; then case "$shell" in
echo "source '$completion'" fish )
fi echo "set -gx PYENV_SHELL $shell"
;;
* )
echo "export PYENV_SHELL=$shell"
;;
esac
}
if [ -z "$no_rehash" ]; then function print_completion() {
echo 'command pyenv rehash 2>/dev/null' completion="${root}/completions/pyenv.${shell}"
fi if [ -r "$completion" ]; then
echo "source '$completion'"
fi
commands=(`pyenv-commands --sh`) if [ -z "$no_rehash" ]; then
case "$shell" in echo 'command pyenv rehash 2>/dev/null'
fish ) fi
cat <<EOS }
function print_shell_function() {
commands=(`pyenv-commands --sh`)
case "$shell" in
fish )
cat <<EOS
function pyenv function pyenv
set command \$argv[1] set command \$argv[1]
set -e argv[1] set -e argv[1]
@ -121,24 +182,24 @@ function pyenv
end end
end end
EOS EOS
;; ;;
ksh ) ksh )
cat <<EOS cat <<EOS
function pyenv { function pyenv {
typeset command typeset command
EOS EOS
;; ;;
* ) * )
cat <<EOS cat <<EOS
pyenv() { pyenv() {
local command local command
EOS EOS
;; ;;
esac esac
if [ "$shell" != "fish" ]; then if [ "$shell" != "fish" ]; then
IFS="|" IFS="|"
cat <<EOS cat <<EOS
command="\${1:-}" command="\${1:-}"
if [ "\$#" -gt 0 ]; then if [ "\$#" -gt 0 ]; then
shift shift
@ -146,10 +207,15 @@ cat <<EOS
case "\$command" in case "\$command" in
${commands[*]}) ${commands[*]})
eval "\$(pyenv "sh-\$command" "\$@")";; eval "\$(pyenv "sh-\$command" "\$@")"
;;
*) *)
command pyenv "\$command" "\$@";; command pyenv "\$command" "\$@"
;;
esac esac
} }
EOS EOS
fi fi
}
main

View file

@ -90,7 +90,7 @@ OUT
assert_success "${system_python}" assert_success "${system_python}"
} }
@test '$PATH is not modified with system Python' { @test 'PATH is not modified with system Python' {
# Create a wrapper executable that verifies PATH. # Create a wrapper executable that verifies PATH.
PYENV_VERSION="custom" PYENV_VERSION="custom"
create_executable "python" '[[ "$PATH" == "${PYENV_TEST_DIR}/root/versions/custom/bin:"* ]] || { echo "unexpected:$PATH"; exit 2;}' create_executable "python" '[[ "$PATH" == "${PYENV_TEST_DIR}/root/versions/custom/bin:"* ]] || { echo "unexpected:$PATH"; exit 2;}'

View file

@ -64,32 +64,39 @@ OUT
@test "adds shims to PATH" { @test "adds shims to PATH" {
export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin"
run pyenv-init - bash run pyenv-init --path bash
assert_success assert_success
assert_line 0 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' assert_line 0 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"'
} }
@test "adds shims to PATH (fish)" { @test "adds shims to PATH (fish)" {
export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin"
run pyenv-init - fish run pyenv-init --path fish
assert_success assert_success
assert_line 0 "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" assert_line 0 "set -gx PATH '${PYENV_ROOT}/shims' \$PATH"
} }
@test "can add shims to PATH more than once" { @test "can add shims to PATH more than once" {
export PATH="${PYENV_ROOT}/shims:$PATH" export PATH="${PYENV_ROOT}/shims:$PATH"
run pyenv-init - bash run pyenv-init --path bash
assert_success assert_success
assert_line 0 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' assert_line 0 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"'
} }
@test "can add shims to PATH more than once (fish)" { @test "can add shims to PATH more than once (fish)" {
export PATH="${PYENV_ROOT}/shims:$PATH" export PATH="${PYENV_ROOT}/shims:$PATH"
run pyenv-init - fish run pyenv-init --path fish
assert_success assert_success
assert_line 0 "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" assert_line 0 "set -gx PATH '${PYENV_ROOT}/shims' \$PATH"
} }
@test "prints a warning if shims not in PATH" {
export PATH="$(perl -0x3A -ls -e 'while (<>) { chomp; ($_ ne $d) && print; }' -- -d="${PYENV_ROOT}/shims" <<<"$PATH")"
run pyenv-init -
assert_success
assert_line 0 'echo '\''WARNING: `pyenv init -` no longer sets PATH.'\'
}
@test "outputs sh-compatible syntax" { @test "outputs sh-compatible syntax" {
run pyenv-init - bash run pyenv-init - bash
assert_success assert_success