Browse Source

fix(pyenv): fix pyenv PATH settings with a warning (#9935)

This change fixes the setting of $PATH for pyenv and its shims, while warning
the user about non-interactive shells.

Co-authored-by: Marc Cornellà <hello@mcornella.com>
Neil Girdhar 2 years ago
parent
commit
c8a258698d
1 changed files with 50 additions and 27 deletions
  1. 50 27
      plugins/pyenv/pyenv.plugin.zsh

+ 50 - 27
plugins/pyenv/pyenv.plugin.zsh

@@ -3,44 +3,67 @@
 
 # Load pyenv only if command not already available
 if command -v pyenv &> /dev/null && [[ "$(uname -r)" != *icrosoft* ]]; then
-    FOUND_PYENV=1
+  FOUND_PYENV=1
 else
-    FOUND_PYENV=0
+  FOUND_PYENV=0
 fi
 
+# Look for pyenv and try to load it (will only work on interactive shells)
 if [[ $FOUND_PYENV -ne 1 ]]; then
-    pyenvdirs=("$HOME/.pyenv" "/usr/local/pyenv" "/opt/pyenv" "/usr/local/opt/pyenv")
-    for dir in $pyenvdirs; do
-        if [[ -d $dir/bin ]]; then
-            export PATH="$PATH:$dir/bin"
-            FOUND_PYENV=1
-            break
-        fi
-    done
-fi
+  pyenvdirs=("$HOME/.pyenv" "/usr/local/pyenv" "/opt/pyenv" "/usr/local/opt/pyenv")
+  for dir in $pyenvdirs; do
+    if [[ -d "$dir/bin" ]]; then
+      FOUND_PYENV=1
+      break
+    fi
+  done
 
-if [[ $FOUND_PYENV -ne 1 ]]; then
+  if [[ $FOUND_PYENV -ne 1 ]]; then
     if (( $+commands[brew] )) && dir=$(brew --prefix pyenv 2>/dev/null); then
-        if [[ -d $dir/bin ]]; then
-            export PATH="$PATH:$dir/bin"
-            FOUND_PYENV=1
-        fi
+      if [[ -d "$dir/bin" ]]; then
+        FOUND_PYENV=1
+      fi
     fi
+  fi
+
+  # If we found pyenv, load it but show a caveat about non-interactive shells
+  if [[ $FOUND_PYENV -eq 1 ]]; then
+    cat <<EOF
+Found pyenv, but it is badly configured. pyenv might not work for
+non-interactive shells (for example, when run from a script).
+${bold_color}
+To fix this message, add these lines to the '.profile' and '.zprofile' files
+in your home directory:
+
+export PYENV_ROOT="${dir/#$HOME/\$HOME}"
+export PATH="\$PYENV_ROOT/bin:\$PATH"
+eval "\$(pyenv init --path)"
+${reset_color}
+For more info go to https://github.com/pyenv/pyenv/#installation.
+EOF
+
+    # Configuring in .zshrc only makes pyenv available for interactive shells
+    export PYENV_ROOT=$dir
+    export PATH="$PYENV_ROOT/bin:$PATH"
+    eval "$(pyenv init --path)"
+  fi
 fi
 
 if [[ $FOUND_PYENV -eq 1 ]]; then
-    eval "$(pyenv init - --no-rehash zsh)"
-    if (( $+commands[pyenv-virtualenv-init] )); then
-        eval "$(pyenv virtualenv-init - zsh)"
-    fi
-    function pyenv_prompt_info() {
-        echo "$(pyenv version-name)"
-    }
+  eval "$(pyenv init - --no-rehash zsh)"
+
+  if (( ${+commands[pyenv-virtualenv-init]} )); then
+    eval "$(pyenv virtualenv-init - zsh)"
+  fi
+
+  function pyenv_prompt_info() {
+    echo "$(pyenv version-name)"
+  }
 else
-    # fallback to system python
-    function pyenv_prompt_info() {
-        echo "system: $(python -V 2>&1 | cut -f 2 -d ' ')"
-    }
+  # Fall back to system python
+  function pyenv_prompt_info() {
+    echo "system: $(python -V 2>&1 | cut -f 2 -d ' ')"
+  }
 fi
 
 unset FOUND_PYENV pyenvdirs dir