mirror of
https://github.com/pyenv/pyenv-virtualenv.git
synced 2025-11-12 05:23:53 -05:00
When a fish login shell is invoked within an existing login shell, avoid duplicating path to the shims by removing existing occurrences before prepending.
162 lines
3.0 KiB
Bash
Executable File
162 lines
3.0 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Summary: Configure the shell environment for pyenv-virtualenv
|
|
# Usage: eval "$(pyenv virtualenv-init - [<shell>])"
|
|
#
|
|
# Automatically activates a Python virtualenv environment based on current
|
|
# pyenv version.
|
|
#
|
|
|
|
set -e
|
|
[ -n "$PYENV_DEBUG" ] && set -x
|
|
|
|
resolve_link() {
|
|
$(type -p greadlink readlink | head -1) "$1"
|
|
}
|
|
|
|
abs_dirname() {
|
|
local cwd="$(pwd)"
|
|
local path="$1"
|
|
|
|
while [ -n "$path" ]; do
|
|
cd "${path%/*}"
|
|
local name="${path##*/}"
|
|
path="$(resolve_link "$name" || true)"
|
|
done
|
|
|
|
pwd
|
|
cd "$cwd"
|
|
}
|
|
|
|
PYENV_VIRTUALENV_INSTALL_PREFIX="$(dirname "$(abs_dirname "$0")")"
|
|
|
|
print=""
|
|
for args in "$@"
|
|
do
|
|
if [ "$args" = "-" ]; then
|
|
print=1
|
|
shift
|
|
fi
|
|
done
|
|
|
|
shell="${1:-$PYENV_SHELL}"
|
|
if [ -z "$shell" ]; then
|
|
shell="$(ps -p "$PPID" -o 'args=' 2>/dev/null || true)"
|
|
shell="${shell##-}"
|
|
shell="${shell%% *}"
|
|
shell="${shell:-$SHELL}"
|
|
shell="${shell##*/}"
|
|
fi
|
|
|
|
if [ -z "$print" ]; then
|
|
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-virtualenv automatically by adding"
|
|
echo "# the following to ${profile}:"
|
|
echo
|
|
case "$shell" in
|
|
fish )
|
|
echo 'status --is-interactive; and source (pyenv virtualenv-init -|psub)'
|
|
;;
|
|
* )
|
|
echo 'eval "$(pyenv virtualenv-init -)"'
|
|
;;
|
|
esac
|
|
echo
|
|
} >&2
|
|
|
|
exit 1
|
|
fi
|
|
|
|
case "$shell" in
|
|
fish )
|
|
cat <<EOS
|
|
while set index (contains -i -- "${PYENV_VIRTUALENV_ROOT:-${PYENV_VIRTUALENV_INSTALL_PREFIX}}/shims" \$PATH)
|
|
set -eg PATH[\$index]; end; set -e index
|
|
set -gx PATH '${PYENV_VIRTUALENV_ROOT:-${PYENV_VIRTUALENV_INSTALL_PREFIX}}/shims' \$PATH;
|
|
set -gx PYENV_VIRTUALENV_INIT 1;
|
|
EOS
|
|
;;
|
|
* )
|
|
cat <<EOS
|
|
export PATH="${PYENV_VIRTUALENV_ROOT:-${PYENV_VIRTUALENV_INSTALL_PREFIX}}/shims:\${PATH}";
|
|
export PYENV_VIRTUALENV_INIT=1;
|
|
EOS
|
|
;;
|
|
esac
|
|
|
|
case "$shell" in
|
|
fish )
|
|
cat <<EOS
|
|
function _pyenv_virtualenv_hook --on-event fish_prompt;
|
|
set -l ret \$status
|
|
if [ -n "\$VIRTUAL_ENV" ]
|
|
pyenv activate --quiet; or pyenv deactivate --quiet; or true
|
|
else
|
|
pyenv activate --quiet; or true
|
|
end
|
|
return \$ret
|
|
end
|
|
EOS
|
|
;;
|
|
ksh )
|
|
cat <<EOS
|
|
function _pyenv_virtualenv_hook() {
|
|
EOS
|
|
;;
|
|
* )
|
|
cat <<EOS
|
|
_pyenv_virtualenv_hook() {
|
|
EOS
|
|
;;
|
|
esac
|
|
|
|
if [[ "$shell" != "fish" ]]; then
|
|
cat <<EOS
|
|
local ret=\$?
|
|
if [ -n "\$VIRTUAL_ENV" ]; then
|
|
eval "\$(pyenv sh-activate --quiet || pyenv sh-deactivate --quiet || true)" || true
|
|
else
|
|
eval "\$(pyenv sh-activate --quiet || true)" || true
|
|
fi
|
|
return \$ret
|
|
};
|
|
EOS
|
|
|
|
case "$shell" in
|
|
bash )
|
|
cat <<EOS
|
|
if ! [[ "\$PROMPT_COMMAND" =~ _pyenv_virtualenv_hook ]]; then
|
|
PROMPT_COMMAND="_pyenv_virtualenv_hook;\$PROMPT_COMMAND";
|
|
fi
|
|
EOS
|
|
;;
|
|
zsh )
|
|
cat <<EOS
|
|
typeset -g -a precmd_functions
|
|
if [[ -z \$precmd_functions[(r)_pyenv_virtualenv_hook] ]]; then
|
|
precmd_functions=(_pyenv_virtualenv_hook \$precmd_functions);
|
|
fi
|
|
EOS
|
|
;;
|
|
* )
|
|
# FIXME: what should i do here??
|
|
;;
|
|
esac
|
|
fi
|