From 47feedc9347be88c3056809073ee631b7b86cb02 Mon Sep 17 00:00:00 2001 From: "Yamashita, Yuu" Date: Thu, 12 Nov 2015 13:24:09 +0000 Subject: [PATCH 1/2] exits as 0 if there is some virtualenv outside from pyenv is already activated (#114) --- bin/pyenv-sh-activate | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/bin/pyenv-sh-activate b/bin/pyenv-sh-activate index d80f742..fe02ae0 100755 --- a/bin/pyenv-sh-activate +++ b/bin/pyenv-sh-activate @@ -65,6 +65,19 @@ fi venv="${versions}" +# exit as success if some virtualenv outside from pyenv is already activated +if [ -n "${VIRTUAL_ENV}" ]; then + if [[ "${VIRTUAL_ENV}" != "$(pyenv-root)/"* ]]; then + if [ -z "${FORCE}" ]; then + if [ -z "${QUIET}" ]; then + echo "pyenv-virtualenv: virtualenv \`${VIRTUAL_ENV}' is already activated" 1>&2 + fi + echo "true" + exit 0 + fi + fi +fi + if ! pyenv-virtualenv-prefix "${venv}" 1>/dev/null 2>&1; then if [ -z "$QUIET" ]; then echo "pyenv-virtualenv: version \`${venv}' is not a virtualenv" 1>&2 @@ -94,12 +107,15 @@ if [ -L "${prefix}" ]; then prefix="$(resolve_link "${prefix}" 2>/dev/null)" fi +# exit as success if the virtualenv is already activated if [[ "${VIRTUAL_ENV}" == "${prefix}" ]]; then - if [ -z "${QUIET}" ]; then - echo "pyenv-virtualenv: version \`${venv}' is already activated" 1>&2 + if [ -z "${FORCE}" ]; then + if [ -z "${QUIET}" ]; then + echo "pyenv-virtualenv: version \`${venv}' is already activated" 1>&2 + fi + echo "true" + exit 0 fi - echo "true" - exit 0 fi if [[ "${PYENV_DEACTIVATE}" == "${prefix}" ]]; then From 83bc6a49e4945374a9abd11f7cf0078e83e0e944 Mon Sep 17 00:00:00 2001 From: "Yamashita, Yuu" Date: Thu, 12 Nov 2015 13:45:33 +0000 Subject: [PATCH 2/2] Restore variables set by `activate` script of virtualenv properly (#150) The `activate` script does't export the variables of `_OLD_VIRTUAL_*`, most the deactivation code needed to be moved to `sh-deactivate`. --- bin/pyenv-sh-deactivate | 76 ++++++++++++++----- test/activate.bats | 8 +- test/conda-deactivate.bats | 41 +++++++++++ test/deactivate.bats | 145 +++++++++++++++++++++++++++++++++++++ 4 files changed, 248 insertions(+), 22 deletions(-) diff --git a/bin/pyenv-sh-deactivate b/bin/pyenv-sh-deactivate index cd96dbb..4186512 100755 --- a/bin/pyenv-sh-deactivate +++ b/bin/pyenv-sh-deactivate @@ -98,33 +98,71 @@ if [ -n "${CONDA_DEFAULT_ENV}" ]; then esac fi -if [ -n "${_OLD_VIRTUAL_PYTHONHOME}" ]; then - case "${shell}" in - fish ) - cat </dev/null 2>&1; then + unset -f deactivate; +fi; EOS - fi ;; esac diff --git a/test/activate.bats b/test/activate.bats index 2113d0b..250cc3b 100644 --- a/test/activate.bats +++ b/test/activate.bats @@ -263,13 +263,15 @@ EOS export VIRTUAL_ENV="${PYENV_ROOT}/versions/venv" export PYENV_ACTIVATE_SHELL= + stub pyenv-sh-deactivate "echo deactivated" + run pyenv-sh-activate --unset + unstub pyenv-sh-deactivate + assert_success assert_output </dev/null 2>&1; then + unset -f deactivate; +fi; EOS } @@ -51,6 +66,17 @@ pyenv-virtualenv: deactivate anaconda-2.3.0 setenv PYENV_DEACTIVATE "${PYENV_ROOT}/versions/anaconda-2.3.0"; set -e VIRTUAL_ENV; set -e CONDA_DEFAULT_ENV; +if [ -n "\$_OLD_VIRTUAL_PATH" ]; + setenv PATH "\$_OLD_VIRTUAL_PATH"; + set -e _OLD_VIRTUAL_PATH; +end; +if [ -n "\$_OLD_VIRTUAL_PYTHONHOME" ]; + setenv PYTHONHOME "\$_OLD_VIRTUAL_PYTHONHOME"; + set -e _OLD_VIRTUAL_PYTHONHOME; +end; +if functions -g deactivate; + functions -e deactivate; +end; EOS } @@ -70,5 +96,20 @@ pyenv-virtualenv: deactivate anaconda-2.3.0/envs/foo export PYENV_DEACTIVATE="${PYENV_ROOT}/versions/anaconda-2.3.0/envs/foo"; unset VIRTUAL_ENV; unset CONDA_DEFAULT_ENV; +if [ -n "\${_OLD_VIRTUAL_PATH}" ]; then + export PATH="\${_OLD_VIRTUAL_PATH}"; + unset _OLD_VIRTUAL_PATH; +fi; +if [ -n "\${_OLD_VIRTUAL_PYTHONHOME}" ]; then + export PYTHONHOME="\${_OLD_VIRTUAL_PYTHONHOME}"; + unset _OLD_VIRTUAL_PYTHONHOME; +fi; +if [ -n "\${_OLD_VIRTUAL_PS1}" ]; then + export PS1="\${_OLD_VIRTUAL_PS1}"; + unset _OLD_VIRTUAL_PS1; +fi; +if declare -f deactivate 1>/dev/null 2>&1; then + unset -f deactivate; +fi; EOS } diff --git a/test/deactivate.bats b/test/deactivate.bats index d2be300..10299a4 100644 --- a/test/deactivate.bats +++ b/test/deactivate.bats @@ -28,6 +28,21 @@ setup() { pyenv-virtualenv: deactivate venv export PYENV_DEACTIVATE="${PYENV_ROOT}/versions/venv"; unset VIRTUAL_ENV; +if [ -n "\${_OLD_VIRTUAL_PATH}" ]; then + export PATH="\${_OLD_VIRTUAL_PATH}"; + unset _OLD_VIRTUAL_PATH; +fi; +if [ -n "\${_OLD_VIRTUAL_PYTHONHOME}" ]; then + export PYTHONHOME="\${_OLD_VIRTUAL_PYTHONHOME}"; + unset _OLD_VIRTUAL_PYTHONHOME; +fi; +if [ -n "\${_OLD_VIRTUAL_PS1}" ]; then + export PS1="\${_OLD_VIRTUAL_PS1}"; + unset _OLD_VIRTUAL_PS1; +fi; +if declare -f deactivate 1>/dev/null 2>&1; then + unset -f deactivate; +fi; EOS } @@ -42,6 +57,21 @@ EOS pyenv-virtualenv: deactivate venv export PYENV_DEACTIVATE="${PYENV_ROOT}/versions/venv"; unset VIRTUAL_ENV; +if [ -n "\${_OLD_VIRTUAL_PATH}" ]; then + export PATH="\${_OLD_VIRTUAL_PATH}"; + unset _OLD_VIRTUAL_PATH; +fi; +if [ -n "\${_OLD_VIRTUAL_PYTHONHOME}" ]; then + export PYTHONHOME="\${_OLD_VIRTUAL_PYTHONHOME}"; + unset _OLD_VIRTUAL_PYTHONHOME; +fi; +if [ -n "\${_OLD_VIRTUAL_PS1}" ]; then + export PS1="\${_OLD_VIRTUAL_PS1}"; + unset _OLD_VIRTUAL_PS1; +fi; +if declare -f deactivate 1>/dev/null 2>&1; then + unset -f deactivate; +fi; EOS } @@ -56,6 +86,21 @@ EOS pyenv-virtualenv: deactivate venv export PYENV_DEACTIVATE="${PYENV_ROOT}/versions/venv"; unset VIRTUAL_ENV; +if [ -n "\${_OLD_VIRTUAL_PATH}" ]; then + export PATH="\${_OLD_VIRTUAL_PATH}"; + unset _OLD_VIRTUAL_PATH; +fi; +if [ -n "\${_OLD_VIRTUAL_PYTHONHOME}" ]; then + export PYTHONHOME="\${_OLD_VIRTUAL_PYTHONHOME}"; + unset _OLD_VIRTUAL_PYTHONHOME; +fi; +if [ -n "\${_OLD_VIRTUAL_PS1}" ]; then + export PS1="\${_OLD_VIRTUAL_PS1}"; + unset _OLD_VIRTUAL_PS1; +fi; +if declare -f deactivate 1>/dev/null 2>&1; then + unset -f deactivate; +fi; EOS } @@ -72,6 +117,21 @@ unset PYENV_VERSION; unset PYENV_ACTIVATE_SHELL; export PYENV_DEACTIVATE="${PYENV_ROOT}/versions/venv"; unset VIRTUAL_ENV; +if [ -n "\${_OLD_VIRTUAL_PATH}" ]; then + export PATH="\${_OLD_VIRTUAL_PATH}"; + unset _OLD_VIRTUAL_PATH; +fi; +if [ -n "\${_OLD_VIRTUAL_PYTHONHOME}" ]; then + export PYTHONHOME="\${_OLD_VIRTUAL_PYTHONHOME}"; + unset _OLD_VIRTUAL_PYTHONHOME; +fi; +if [ -n "\${_OLD_VIRTUAL_PS1}" ]; then + export PS1="\${_OLD_VIRTUAL_PS1}"; + unset _OLD_VIRTUAL_PS1; +fi; +if declare -f deactivate 1>/dev/null 2>&1; then + unset -f deactivate; +fi; EOS } @@ -88,6 +148,21 @@ unset PYENV_VERSION; unset PYENV_ACTIVATE_SHELL; export PYENV_DEACTIVATE="${PYENV_ROOT}/versions/venv"; unset VIRTUAL_ENV; +if [ -n "\${_OLD_VIRTUAL_PATH}" ]; then + export PATH="\${_OLD_VIRTUAL_PATH}"; + unset _OLD_VIRTUAL_PATH; +fi; +if [ -n "\${_OLD_VIRTUAL_PYTHONHOME}" ]; then + export PYTHONHOME="\${_OLD_VIRTUAL_PYTHONHOME}"; + unset _OLD_VIRTUAL_PYTHONHOME; +fi; +if [ -n "\${_OLD_VIRTUAL_PS1}" ]; then + export PS1="\${_OLD_VIRTUAL_PS1}"; + unset _OLD_VIRTUAL_PS1; +fi; +if declare -f deactivate 1>/dev/null 2>&1; then + unset -f deactivate; +fi; EOS } @@ -102,6 +177,21 @@ EOS pyenv-virtualenv: deactivate venv export PYENV_DEACTIVATE="${PYENV_ROOT}/versions/venv"; unset VIRTUAL_ENV; +if [ -n "\${_OLD_VIRTUAL_PATH}" ]; then + export PATH="\${_OLD_VIRTUAL_PATH}"; + unset _OLD_VIRTUAL_PATH; +fi; +if [ -n "\${_OLD_VIRTUAL_PYTHONHOME}" ]; then + export PYTHONHOME="\${_OLD_VIRTUAL_PYTHONHOME}"; + unset _OLD_VIRTUAL_PYTHONHOME; +fi; +if [ -n "\${_OLD_VIRTUAL_PS1}" ]; then + export PS1="\${_OLD_VIRTUAL_PS1}"; + unset _OLD_VIRTUAL_PS1; +fi; +if declare -f deactivate 1>/dev/null 2>&1; then + unset -f deactivate; +fi; EOS } @@ -116,6 +206,17 @@ EOS pyenv-virtualenv: deactivate venv setenv PYENV_DEACTIVATE "${PYENV_ROOT}/versions/venv"; set -e VIRTUAL_ENV; +if [ -n "\$_OLD_VIRTUAL_PATH" ]; + setenv PATH "\$_OLD_VIRTUAL_PATH"; + set -e _OLD_VIRTUAL_PATH; +end; +if [ -n "\$_OLD_VIRTUAL_PYTHONHOME" ]; + setenv PYTHONHOME "\$_OLD_VIRTUAL_PYTHONHOME"; + set -e _OLD_VIRTUAL_PYTHONHOME; +end; +if functions -g deactivate; + functions -e deactivate; +end; EOS } @@ -130,6 +231,17 @@ EOS pyenv-virtualenv: deactivate venv setenv PYENV_DEACTIVATE "${PYENV_ROOT}/versions/venv"; set -e VIRTUAL_ENV; +if [ -n "\$_OLD_VIRTUAL_PATH" ]; + setenv PATH "\$_OLD_VIRTUAL_PATH"; + set -e _OLD_VIRTUAL_PATH; +end; +if [ -n "\$_OLD_VIRTUAL_PYTHONHOME" ]; + setenv PYTHONHOME "\$_OLD_VIRTUAL_PYTHONHOME"; + set -e _OLD_VIRTUAL_PYTHONHOME; +end; +if functions -g deactivate; + functions -e deactivate; +end; EOS } @@ -146,6 +258,17 @@ set -e PYENV_VERSION; set -e PYENV_ACTIVATE_SHELL; setenv PYENV_DEACTIVATE "${PYENV_ROOT}/versions/venv"; set -e VIRTUAL_ENV; +if [ -n "\$_OLD_VIRTUAL_PATH" ]; + setenv PATH "\$_OLD_VIRTUAL_PATH"; + set -e _OLD_VIRTUAL_PATH; +end; +if [ -n "\$_OLD_VIRTUAL_PYTHONHOME" ]; + setenv PYTHONHOME "\$_OLD_VIRTUAL_PYTHONHOME"; + set -e _OLD_VIRTUAL_PYTHONHOME; +end; +if functions -g deactivate; + functions -e deactivate; +end; EOS } @@ -162,6 +285,17 @@ set -e PYENV_VERSION; set -e PYENV_ACTIVATE_SHELL; setenv PYENV_DEACTIVATE "${PYENV_ROOT}/versions/venv"; set -e VIRTUAL_ENV; +if [ -n "\$_OLD_VIRTUAL_PATH" ]; + setenv PATH "\$_OLD_VIRTUAL_PATH"; + set -e _OLD_VIRTUAL_PATH; +end; +if [ -n "\$_OLD_VIRTUAL_PYTHONHOME" ]; + setenv PYTHONHOME "\$_OLD_VIRTUAL_PYTHONHOME"; + set -e _OLD_VIRTUAL_PYTHONHOME; +end; +if functions -g deactivate; + functions -e deactivate; +end; EOS } @@ -176,6 +310,17 @@ EOS pyenv-virtualenv: deactivate venv setenv PYENV_DEACTIVATE "${PYENV_ROOT}/versions/venv"; set -e VIRTUAL_ENV; +if [ -n "\$_OLD_VIRTUAL_PATH" ]; + setenv PATH "\$_OLD_VIRTUAL_PATH"; + set -e _OLD_VIRTUAL_PATH; +end; +if [ -n "\$_OLD_VIRTUAL_PYTHONHOME" ]; + setenv PYTHONHOME "\$_OLD_VIRTUAL_PYTHONHOME"; + set -e _OLD_VIRTUAL_PYTHONHOME; +end; +if functions -g deactivate; + functions -e deactivate; +end; EOS }