From 83ab314b77d7e6bd92b7aed6275ad03018b378c1 Mon Sep 17 00:00:00 2001 From: Indrajit Raychaudhuri Date: Thu, 17 Aug 2017 22:53:25 -0500 Subject: [PATCH] [python] Refine pyenv based virtualenv management Now that pyenv plugins availability is detected by directly probing 'pyenv', we need to rely on the same mechanism consistently. Further, we perform available pyenv plugin scan with native zsh techniques instead of relying on external commands. --- modules/python/init.zsh | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/modules/python/init.zsh b/modules/python/init.zsh index 4b07770..be48487 100644 --- a/modules/python/init.zsh +++ b/modules/python/init.zsh @@ -92,18 +92,25 @@ if (( $+VIRTUALENVWRAPPER_VIRTUALENV || $+commands[virtualenv] )) && \ # Disable the virtualenv prompt. VIRTUAL_ENV_DISABLE_PROMPT=1 - # Enable 'virtualenv' with 'pyenv'. - if (( $+commands[pyenv] )) && \ - pyenv commands | command grep -q virtualenv-init - then + # Create a sorted array of available virtualenv related 'pyenv' commands to + # look for plugins of interest. Scanning shell '$path' isn't enough as they + # can exist in 'pyenv' synthesized paths (e.g., '~/.pyenv/plugins') instead. + local -a pyenv_plugins + if (( $+commands[pyenv] )); then + pyenv_plugins=(${(@oM)${(f)"$(pyenv commands --no-sh 2>/dev/null)"}:#virtualenv*}) + fi + + if (( $pyenv_plugins[(i)virtualenv-init] <= $#pyenv_plugins )); then + # Enable 'virtualenv' with 'pyenv'. eval "$(pyenv virtualenv-init -)" - # Optionall activate 'virtualenvwrapper' with 'pyenv' is available. - if (( $#commands[(i)pyenv-virtualenvwrapper(_lazy|)] )); then - pyenv "${${(@O)commands[(I)pyenv-virtualenvwrapper(_lazy|)]}[1]#pyenv-}" + + # Optionally activate 'virtualenvwrapper' plugin when available. + if (( $pyenv_plugins[(i)virtualenvwrapper(_lazy|)] <= $#pyenv_plugins )); then + pyenv "$pyenv_plugins[(R)virtualenvwrapper(_lazy|)]" fi else - # Fallback to 'virtualenvwrapper' without 'pyenv' wrapper in '$path' - # and other known locations on a Debian based system. + # Fallback to 'virtualenvwrapper' without 'pyenv' wrapper if available + # in '$path' or in an alternative location on a Debian based system. virtenv_sources=( ${(@Ov)commands[(I)virtualenvwrapper(_lazy|).sh]} /usr/share/virtualenvwrapper/virtualenvwrapper(_lazy|).sh(OnN) @@ -114,6 +121,8 @@ if (( $+VIRTUALENVWRAPPER_VIRTUALENV || $+commands[virtualenv] )) && \ unset virtenv_sources fi + + unset pyenv_plugins fi # Load PIP completion.