diff --git a/bin/pyenv-sh-deactivate b/bin/pyenv-sh-deactivate index 7638de9..0be5bc3 100755 --- a/bin/pyenv-sh-deactivate +++ b/bin/pyenv-sh-deactivate @@ -9,6 +9,10 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x +if [ -z "${PYENV_ROOT}" ]; then + PYENV_ROOT="$(pyenv-root)" +fi + unset FORCE unset QUIET unset VERBOSE @@ -48,8 +52,8 @@ fi shell="$(basename "${PYENV_SHELL:-$SHELL}")" prefix="${VIRTUAL_ENV}" -if [[ "${prefix}" != "${prefix%/envs/*}" ]]; then - venv="$(basename "${prefix%/envs/*}")/envs/${prefix##*/}" +if [[ "${prefix%/*/envs/*}" == "${PYENV_ROOT}/versions" ]]; then + venv="${prefix#${PYENV_ROOT}/versions/}" else venv="${prefix##*/}" fi diff --git a/bin/pyenv-virtualenv b/bin/pyenv-virtualenv index 2af1567..05a7b12 100755 --- a/bin/pyenv-virtualenv +++ b/bin/pyenv-virtualenv @@ -11,13 +11,13 @@ PYENV_VIRTUALENV_VERSION="20151103" +set -e +[ -n "$PYENV_DEBUG" ] && set -x + if [ -z "${PYENV_ROOT}" ]; then PYENV_ROOT="$(pyenv-root)" fi -set -e -[ -n "$PYENV_DEBUG" ] && set -x - # Provide pyenv completions if [ "$1" = "--complete" ]; then exec pyenv-versions --bare @@ -328,11 +328,6 @@ if [ ! -d "${PREFIX}" ]; then exit 1 fi -if [[ "${PREFIX}" != "${PREFIX%/envs/*}" ]]; then - echo "pyenv-virtualenv: nested virtualenv is not supported." 1>&2 - exit 1 -fi - if [ -z "$TMPDIR" ]; then TMP="/tmp" else @@ -343,11 +338,16 @@ fi if [[ "${VERSION_NAME%/envs/*}" == "system" ]]; then VIRTUALENV_NAME="${VIRTUALENV_NAME##*/}" else - VIRTUALENV_NAME="${VERSION_NAME}/envs/${VIRTUALENV_NAME##*/}" + VIRTUALENV_PREFIX="$(pyenv-virtualenv-prefix 2>/dev/null || true)" + if [[ "${VIRTUALENV_PREFIX%/*}" == "${PYENV_ROOT}/versions" ]]; then + VIRTUALENV_NAME="${VIRTUALENV_PREFIX#${PYENV_ROOT}/versions/}/envs/${VIRTUALENV_NAME##*/}" + else + VIRTUALENV_NAME="${VERSION_NAME}/envs/${VIRTUALENV_NAME##*/}" + fi fi VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}" -if [[ "${VIRTUALENV_PATH}" != "${VIRTUALENV_PATH%/envs/*}" ]]; then +if [[ "${VIRTUALENV_PATH/*/envs/*}" != "${PYENV_ROOT}/versions" ]]; then COMPAT_VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME##*/}" fi diff --git a/bin/pyenv-virtualenv-delete b/bin/pyenv-virtualenv-delete index 90900f5..99d23d4 100755 --- a/bin/pyenv-virtualenv-delete +++ b/bin/pyenv-virtualenv-delete @@ -13,6 +13,10 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x +if [ -z "${PYENV_ROOT}" ]; then + PYENV_ROOT="$(pyenv-root)" +fi + # Provide pyenv completions if [ "$1" = "--complete" ]; then exec pyenv virtualenvs --bare @@ -63,7 +67,7 @@ if [[ "${DEFINITION}" != "${DEFINITION%/envs/*}" ]]; then else if [ -L "${COMPAT_PREFIX}" ]; then PREFIX="$(resolve_link "${COMPAT_PREFIX}" 2>/dev/null || true)" - if [[ "${PREFIX}" == "${PREFIX%/envs/*}" ]]; then + if [[ "${PREFIX%/*/envs/*}" != "${PYENV_ROOT}/versions" ]]; then echo "pyenv-virtualenv: \`${COMPAT_PREFIX}' is a symlink for unknown location." 1>&2 exit 1 fi diff --git a/test/conda.bats b/test/conda.bats index 0eb79d6..3c6ef02 100644 --- a/test/conda.bats +++ b/test/conda.bats @@ -25,6 +25,7 @@ unstub_pyenv() { setup_conda "${PYENV_VERSION}" stub_pyenv "${PYENV_VERSION}" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-virtualenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "conda * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : true" @@ -37,6 +38,7 @@ rehashed OUT unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec teardown_pyvenv "miniconda3-3.16.0" } @@ -46,6 +48,7 @@ OUT setup_conda "${PYENV_VERSION}" stub_pyenv "${PYENV_VERSION}" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-virtualenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "conda * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : true" @@ -58,6 +61,7 @@ rehashed OUT unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec teardown_pyvenv "miniconda3-3.16.0" } @@ -67,6 +71,7 @@ OUT setup_conda "${PYENV_VERSION}" stub_pyenv "${PYENV_VERSION}" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-virtualenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-exec "conda * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : true" @@ -79,6 +84,7 @@ rehashed OUT unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec teardown_pyvenv "miniconda3-3.16.0" } diff --git a/test/envs.bats b/test/envs.bats new file mode 100644 index 0000000..4da2a75 --- /dev/null +++ b/test/envs.bats @@ -0,0 +1,46 @@ +#!/usr/bin/env bats + +load test_helper + +setup() { + export PYENV_ROOT="${TMP}/envs/pyenv" +} + +stub_pyenv() { + stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-hooks "virtualenv : echo" + stub pyenv-rehash " : echo rehashed" +} + +unstub_pyenv() { + unstub pyenv-prefix + unstub pyenv-hooks + unstub pyenv-rehash +} + +@test "path should be handled properly even if there is 'envs' in PYENV_ROOT" { + export PYENV_VERSION="3.4.1" + setup_pyvenv "3.4.1" + stub_pyenv "${PYENV_VERSION}" + stub pyenv-version-name "echo '${PYENV_VERSION}'" + stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-virtualenv-prefix " : false" + stub pyenv-exec "pyvenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/3.4.1/envs/venv/bin" + stub pyenv-exec "python -s -m ensurepip : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";touch \${PYENV_ROOT}/versions/3.4.1/envs/venv/bin/pip" + + run pyenv-virtualenv venv + + assert_success + assert_output <