diff --git a/bin/pyenv-virtualenv-prefix b/bin/pyenv-virtualenv-prefix index 901f2da..4c63a62 100755 --- a/bin/pyenv-virtualenv-prefix +++ b/bin/pyenv-virtualenv-prefix @@ -19,17 +19,6 @@ else IFS=: versions=($(pyenv-version-name)) fi -real_prefix() { # virtualenv - local version="$1" - PYENV_VERSION="${version}" pyenv-exec python -c 'import sys;print(sys.real_prefix)' 2>/dev/null -} - -base_prefix() { # pyvenv - # FIXME: non-pyvenv versions also have sys.base_prefix - local version="$1" - PYENV_VERSION="${version}" pyenv-exec python -c 'import sys;print(sys.base_prefix)' 2>/dev/null -} - VIRTUALENV_PREFIX_PATHS=() for version in "${versions[@]}"; do if [ "$version" = "system" ]; then @@ -39,8 +28,27 @@ for version in "${versions[@]}"; do PYENV_PREFIX_PATH="$(pyenv-prefix "${version}")" if [ -x "${PYENV_PREFIX_PATH}/bin/python" ]; then if [ -f "${PYENV_PREFIX_PATH}/bin/activate" ]; then - VIRTUALENV_PREFIX_PATH="$(real_prefix "${version}" || base_prefix "${version}" || true)" - VIRTUALENV_PREFIX_PATHS=("${VIRTUALENV_PREFIX_PATHS[@]}" "${VIRTUALENV_PREFIX_PATH:-${PYENV_PREFIX_PATH}}") + if [ -f "${PYENV_PREFIX_PATH}/bin/conda" ]; then + # conda + VIRTUALENV_PREFIX_PATH="${PYENV_PREFIX_PATH}" + else + if [ -f "${PYENV_ROOT}/versions/${version}/pyvenv.cfg" ]; then + # pyvenv + virtualenv_binpath="$(cut -b 1-1024 "${PYENV_ROOT}/versions/${version}/pyvenv.cfg" | sed -n '/^ *home *= */s///p' || true)" + VIRTUALENV_PREFIX_PATH="${virtualenv_binpath%/bin}" + else + # virtualenv + shopt -s nullglob + VIRTUALENV_PREFIX_PATH="$(cat "${PYENV_ROOT}/versions/${version}/lib/"*"/orig-prefix.txt" &1 || true)" + shopt -u nullglob + fi + fi + if [ -d "${VIRTUALENV_PREFIX_PATH}" ]; then + VIRTUALENV_PREFIX_PATHS=("${VIRTUALENV_PREFIX_PATHS[@]}" "${VIRTUALENV_PREFIX_PATH:-${PYENV_PREFIX_PATH}}") + else + echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2 + exit 1 + fi else echo "pyenv-virtualenv: version \`${version}' is not a virtualenv" 1>&2 exit 1 diff --git a/test/prefix.bats b/test/prefix.bats index 95a9cae..140285a 100644 --- a/test/prefix.bats +++ b/test/prefix.bats @@ -17,99 +17,112 @@ remove_version() { } create_virtualenv() { - create_version "$@" + create_version "$1" + create_version "${2:-$1}" + mkdir -p "${PYENV_ROOT}/versions/$1/lib/python${2:-$1}" + echo "${PYENV_ROOT}/versions/${2:-$1}" > "${PYENV_ROOT}/versions/$1/lib/python${2:-$1}/orig-prefix.txt" touch "${PYENV_ROOT}/versions/$1/bin/activate" } remove_virtualenv() { - remove_version "$@" + remove_version "$1" + remove_version "${2:-$1}" +} + +create_pyvenv() { + create_version "$1" + create_version "${2:-$1}" + echo "home = ${PYENV_ROOT}/versions/${2:-$1}/bin" > "${PYENV_ROOT}/versions/$1/pyvenv.cfg" + touch "${PYENV_ROOT}/versions/$1/bin/activate" +} + +remove_pyvenv() { + remove_version "${2:-$1}" +} + +create_conda() { + create_version "$1" + create_version "${2:-$1}" + touch "${PYENV_ROOT}/versions/$1/bin/conda" + touch "${PYENV_ROOT}/versions/$1/bin/activate" +} + +remove_conda() { + remove_version "${2:-$1}" } @test "display prefix with using sys.real_prefix" { stub pyenv-version-name "echo venv27" stub pyenv-prefix "venv27 : echo \"${PYENV_ROOT}/versions/venv27\"" - stub pyenv-exec "echo \"${PYENV_ROOT}/versions/2.7.6\"" - create_virtualenv "venv27" + create_virtualenv "venv27" "2.7.6" PYENV_VERSION="venv27" run pyenv-virtualenv-prefix - unstub pyenv-version-name - unstub pyenv-prefix - unstub pyenv-exec - remove_virtualenv "venv27" - assert_success assert_output <