From c8a258698de6a56145211657f05f8b554a8140b7 Mon Sep 17 00:00:00 2001
From: Neil Girdhar <mistersheik@gmail.com>
Date: Mon, 26 Jul 2021 05:45:02 -0400
Subject: [PATCH] fix(pyenv): fix pyenv PATH settings with a warning (#9935)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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>
---
 plugins/pyenv/pyenv.plugin.zsh | 81 ++++++++++++++++++++++------------
 1 file changed, 52 insertions(+), 29 deletions(-)

diff --git a/plugins/pyenv/pyenv.plugin.zsh b/plugins/pyenv/pyenv.plugin.zsh
index 82ba6ff8c..fedde6342 100644
--- a/plugins/pyenv/pyenv.plugin.zsh
+++ b/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
-
-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
+  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 (( $+commands[brew] )) && dir=$(brew --prefix pyenv 2>/dev/null); then
+      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