pyenv/libexec/pyenv-init
Ivan Pozdeev aab562c696 Add a warning about needing to restart the entire login session
E.g. for a GUI session, ~/.profile is executed by the GUI login "shell" at its startup
so one needs to fully log out and log back in.
Before that, the change would only be seen by shells explicitly started as login shells.
2021-05-07 16:21:17 +03:00

221 lines
3.7 KiB
Bash
Executable file

#!/usr/bin/env bash
# Summary: Configure the shell environment for pyenv
# Usage: eval "$(pyenv init [-|--path] [--no-rehash] [<shell>])"
set -e
[ -n "$PYENV_DEBUG" ] && set -x
# Provide pyenv completions
if [ "$1" = "--complete" ]; then
echo -
echo --path
echo --no-rehash
echo bash
echo fish
echo ksh
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
done
shell="$1"
if [ -z "$shell" ]; then
shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)"
shell="${shell%% *}"
shell="${shell##-}"
shell="${shell:-$SHELL}"
shell="${shell##*/}"
shell="${shell%%-*}"
fi
root="${0%/*}/.."
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
bash )
profile='~/.bashrc'
;;
zsh )
profile='~/.zshrc'
;;
ksh )
profile='~/.profile'
;;
fish )
profile='~/.config/fish/config.fish'
;;
* )
profile='your profile'
;;
esac
{ echo "# Load pyenv automatically by appending"
echo "# the following to ${profile}:"
echo
case "$shell" in
fish )
echo 'pyenv init - | source'
;;
* )
echo 'eval "$(pyenv init -)"'
;;
esac
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
}
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
}
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_env() {
case "$shell" in
fish )
echo "set -gx PYENV_SHELL $shell"
;;
* )
echo "export PYENV_SHELL=$shell"
;;
esac
}
function print_completion() {
completion="${root}/completions/pyenv.${shell}"
if [ -r "$completion" ]; then
echo "source '$completion'"
fi
if [ -z "$no_rehash" ]; then
echo 'command pyenv rehash 2>/dev/null'
fi
}
function print_shell_function() {
commands=(`pyenv-commands --sh`)
case "$shell" in
fish )
cat <<EOS
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
end
end
EOS
;;
ksh )
cat <<EOS
function pyenv {
typeset command
EOS
;;
* )
cat <<EOS
pyenv() {
local command
EOS
;;
esac
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
}
EOS
fi
}
main