mirror of
https://github.com/pyenv/pyenv.git
synced 2024-11-21 20:47:00 -05:00
Merge pull request #1898 from native-api/startup_r1
Split startup logic into PATH and everything else
This commit is contained in:
commit
fecb03fcb3
4 changed files with 130 additions and 72 deletions
25
README.md
25
README.md
|
@ -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
|
||||||
~~~
|
~~~
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;}'
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue