From 783870759566a77d09b426e0305bc0993a522765 Mon Sep 17 00:00:00 2001 From: Ivan Pozdeev Date: Tue, 4 May 2021 04:30:52 +0300 Subject: [PATCH] Separate startup logic into PATH and the rest PATH manipulation should be done in ~/.profile rather than ~/.*rc since .rc can be sourced multiple times --- README.md | 25 +++++-------------------- libexec/pyenv-init | 43 +++++++++++++++++++++++++++++++++---------- test/init.bats | 8 ++++---- 3 files changed, 42 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index add2eefc..b821d602 100644 --- a/README.md +++ b/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 to the `pyenv` command-line utility. - - For **bash**: + - For **bash**/**Zsh**: ~~~ bash - echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile - echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_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 + echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.profile + echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.profile + echo 'eval "$(pyenv init --path)"' >> ~/.profile ~~~ - For **Fish shell**: ~~~ fish set -Ux PYENV_ROOT $HOME/.pyenv 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. @@ -239,11 +229,6 @@ easy to fork and contribute any changes back upstream. configuration file since it manipulates `PATH` during the initialization. - 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 echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bashrc ~~~ diff --git a/libexec/pyenv-init b/libexec/pyenv-init index c61c3285..60885843 100755 --- a/libexec/pyenv-init +++ b/libexec/pyenv-init @@ -1,6 +1,6 @@ #!/usr/bin/env bash # Summary: Configure the shell environment for pyenv -# Usage: eval "$(pyenv init - [--no-rehash] [])" +# Usage: eval "$(pyenv init [-|--path] [--no-rehash] [])" set -e [ -n "$PYENV_DEBUG" ] && set -x @@ -8,6 +8,7 @@ set -e # Provide pyenv completions if [ "$1" = "--complete" ]; then echo - + echo --path echo --no-rehash echo bash echo fish @@ -16,15 +17,20 @@ if [ "$1" = "--complete" ]; then exit fi -print="" +mode="help" no_rehash="" for args in "$@" do if [ "$args" = "-" ]; then - print=1 + mode="print" shift fi + if [ "$args" = "--path" ]; then + mode="path" + shift + fi + if [ "$args" = "--no-rehash" ]; then no_rehash=1 shift @@ -68,11 +74,7 @@ function main() { function help_() { case "$shell" in bash ) - if [ -f "${HOME}/.bashrc" ] && [ ! -f "${HOME}/.bash_profile" ]; then - profile='~/.bashrc' - else - profile='~/.bash_profile' - fi + profile='~/.bashrc' ;; zsh ) profile='~/.zshrc' @@ -100,6 +102,17 @@ function help_() { ;; 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 } >&2 } @@ -107,14 +120,24 @@ 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 print_env() { case "$shell" in fish ) - echo "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" echo "set -gx PYENV_SHELL $shell" ;; * ) - echo 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' echo "export PYENV_SHELL=$shell" ;; esac diff --git a/test/init.bats b/test/init.bats index c9fb0a28..bcb937c1 100755 --- a/test/init.bats +++ b/test/init.bats @@ -64,28 +64,28 @@ OUT @test "adds shims to PATH" { export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" - run pyenv-init - bash + run pyenv-init --path bash assert_success assert_line 0 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' } @test "adds shims to PATH (fish)" { export PATH="${BATS_TEST_DIRNAME}/../libexec:/usr/bin:/bin:/usr/local/bin" - run pyenv-init - fish + run pyenv-init --path fish assert_success assert_line 0 "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" } @test "can add shims to PATH more than once" { export PATH="${PYENV_ROOT}/shims:$PATH" - run pyenv-init - bash + run pyenv-init --path bash assert_success assert_line 0 'export PATH="'${PYENV_ROOT}'/shims:${PATH}"' } @test "can add shims to PATH more than once (fish)" { export PATH="${PYENV_ROOT}/shims:$PATH" - run pyenv-init - fish + run pyenv-init --path fish assert_success assert_line 0 "set -gx PATH '${PYENV_ROOT}/shims' \$PATH" }