diff --git a/bin/pyenv-virtualenv b/bin/pyenv-virtualenv index 6e23c107..bedbb695 100755 --- a/bin/pyenv-virtualenv +++ b/bin/pyenv-virtualenv @@ -287,13 +287,24 @@ if ! pyenv-prefix 1>/dev/null 2>&1; then exit 1 fi +if pyenv-virtualenv-prefix "${VERSION_NAME}" 1>/dev/null 2>&1; then + echo "pyenv-virtualenv: nested virtualenv is not supported." 1>&2 + exit 1 +fi + if [ -z "$TMPDIR" ]; then TMP="/tmp" else TMP="${TMPDIR%/}" fi -VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}" +VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VERSION_NAME}/envs/${VIRTUALENV_NAME}" + +COMPAT_VIRTUALENV_PATH="${PYENV_ROOT}/versions/${VIRTUALENV_NAME}" +if [ -e "${COMPAT_VIRTUALENV_PATH}" ] || [ -L "${COMPAT_VIRTUALENV_PATH}" ]; then + echo "pyenv-virtualenv: \`${COMPAT_VIRTUALENV_PATH}' already exists." 1>&2 + exit 1 +fi unset HAS_VIRTUALENV unset HAS_PYVENV @@ -400,7 +411,7 @@ if [ -d "${VIRTUALENV_PATH}/bin" ]; then fi if [ -n "$UPGRADE" ]; then - PYENV_VERSION="${VIRTUALENV_NAME}" prepare_requirements + PYENV_VERSION="${VERSION_NAME}/envs/${VIRTUALENV_NAME}" prepare_requirements fi fi @@ -422,11 +433,16 @@ mkdir -p "${PYENV_VIRTUALENV_CACHE_PATH}" cd "${PYENV_VIRTUALENV_CACHE_PATH}" venv $QUIET $VERBOSE "${VIRTUALENV_OPTIONS[@]}" "${VIRTUALENV_PATH}" || STATUS="$?" +## Create symlink in the `versions` directory for backward compatibility +if [ -d "${VIRTUALENV_PATH}" ]; then + ln -fs "${VIRTUALENV_PATH}" "${COMPAT_VIRTUALENV_PATH}" +fi + ## Install setuptools and pip. -PYENV_VERSION="${VIRTUALENV_NAME}" build_package_ensurepip +PYENV_VERSION="${VERSION_NAME}/envs/${VIRTUALENV_NAME}" build_package_ensurepip ## Migrate previously installed packages from requirements.txt. -PYENV_VERSION="${VIRTUALENV_NAME}" install_requirements || true +PYENV_VERSION="${VERSION_NAME}/envs/${VIRTUALENV_NAME}" install_requirements || true # Execute `after_virtualenv` hooks. for hook in "${after_hooks[@]}"; do eval "$hook"; done diff --git a/test/hooks.bats b/test/hooks.bats index 5828bc60..d8a4efc0 100644 --- a/test/hooks.bats +++ b/test/hooks.bats @@ -27,8 +27,8 @@ OUT assert_success assert_output <<-OUT -before: ${PYENV_ROOT}/versions/venv -PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/venv +before: ${PYENV_ROOT}/versions/3.2.1/envs/venv +PYENV_VERSION=3.2.1 virtualenv ${PYENV_ROOT}/versions/3.2.1/envs/venv after: 0 rehashed OUT diff --git a/test/pip.bats b/test/pip.bats index b7337d56..fa4fde4b 100644 --- a/test/pip.bats +++ b/test/pip.bats @@ -25,8 +25,9 @@ unstub_pyenv() { stub_pyenv "${PYENV_VERSION}" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" - stub pyenv-exec "pyvenv ${PYENV_ROOT}/versions/venv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";mkdir -p \${PYENV_ROOT}/versions/venv/bin" - stub pyenv-exec "python -s -m ensurepip : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";touch \${PYENV_ROOT}/versions/venv/bin/pip" + stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + 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" remove_executable "3.4.1" "virtualenv" create_executable "3.4.1" "pyvenv" @@ -35,11 +36,11 @@ unstub_pyenv() { assert_success assert_output <