From aae3bf2786619a400465af07b4e32db9b270f14f Mon Sep 17 00:00:00 2001 From: "Yamashita, Yuu" Date: Fri, 4 Dec 2015 00:27:09 +0000 Subject: [PATCH 1/4] Add workaround for rywyo/anyenv --- bin/pyenv-sh-deactivate | 8 ++++++-- bin/pyenv-virtualenv | 8 ++++---- bin/pyenv-virtualenv-delete | 6 +++++- 3 files changed, 15 insertions(+), 7 deletions(-) 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..5b52662 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 @@ -347,7 +347,7 @@ else 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 From 3fc832f4c7a51e53bedb0bf8a6aef0e54ed0d77a Mon Sep 17 00:00:00 2001 From: "Yamashita, Yuu" Date: Fri, 4 Dec 2015 00:42:28 +0000 Subject: [PATCH 2/4] Create virtualenv inside `real_prefix` --- bin/pyenv-virtualenv | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/bin/pyenv-virtualenv b/bin/pyenv-virtualenv index 5b52662..05a7b12 100755 --- a/bin/pyenv-virtualenv +++ b/bin/pyenv-virtualenv @@ -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,7 +338,12 @@ 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}" From 9c49fcd734750e98a4c6aeedb67421cfaae30606 Mon Sep 17 00:00:00 2001 From: "Yamashita, Yuu" Date: Fri, 4 Dec 2015 02:33:37 +0000 Subject: [PATCH 3/4] Fix broken tests --- test/conda.bats | 6 ++++++ test/pip.bats | 4 ++++ test/pyvenv.bats | 12 ++++++++++++ test/virtualenv.bats | 10 ++++++++++ 4 files changed, 32 insertions(+) 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/pip.bats b/test/pip.bats index e1af4fd..67381c1 100644 --- a/test/pip.bats +++ b/test/pip.bats @@ -25,6 +25,7 @@ unstub_pyenv() { setup_pyvenv "3.4.1" stub_pyenv "${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" @@ -39,6 +40,7 @@ OUT assert [ -e "${PYENV_ROOT}/versions/3.4.1/envs/venv/bin/pip" ] unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec teardown_pyvenv "3.4.1" } @@ -48,6 +50,7 @@ OUT setup_pyvenv "3.3.5" stub_pyenv "${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.3.5/envs/venv/bin" stub pyenv-exec "python -s -m ensurepip : false" stub pyenv-exec "python -s */get-pip.py : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\";touch \${PYENV_ROOT}/versions/3.3.5/envs/venv/bin/pip" @@ -65,6 +68,7 @@ OUT assert [ -e "${PYENV_ROOT}/versions/3.3.5/envs/venv/bin/pip" ] unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec teardown_pyvenv "3.3.5" } diff --git a/test/pyvenv.bats b/test/pyvenv.bats index 32bde99..7a23078 100644 --- a/test/pyvenv.bats +++ b/test/pyvenv.bats @@ -25,6 +25,7 @@ unstub_pyenv() { setup_pyvenv "3.4.1" stub_pyenv "${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} \"\$@\"" 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 "3.4.1" } @@ -47,6 +49,7 @@ OUT create_executable "3.4.1" "virtualenv" stub_pyenv "${PYENV_VERSION}" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : true" @@ -59,6 +62,7 @@ rehashed OUT unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec teardown_pyvenv "3.4.1" } @@ -68,6 +72,7 @@ OUT setup_version "3.2.1" stub_pyenv "${PYENV_VERSION}" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : false" @@ -85,6 +90,7 @@ rehashed OUT unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec unstub curl teardown_version "3.2.1" @@ -95,6 +101,7 @@ OUT setup_pyvenv "3.4.1" stub_pyenv "${PYENV_VERSION}" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : true" @@ -109,6 +116,7 @@ OUT assert_success unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec teardown_pyvenv "3.4.1" } @@ -118,6 +126,7 @@ OUT setup_pyvenv "3.4.1" stub_pyenv "${PYENV_VERSION}" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "pip install virtualenv : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : true" @@ -132,6 +141,7 @@ OUT assert_success unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec teardown_pyvenv "3.4.1" } @@ -141,6 +151,7 @@ OUT setup_version "3.2.1" stub_pyenv "${PYENV_VERSION}" stub pyenv-prefix " : echo '${PYENV_ROOT}/versions/${PYENV_VERSION}'" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "pip install virtualenv : echo PIP_REQUIRE_VENV=\${PIP_REQUIRE_VENV} PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "virtualenv * : echo PIP_REQUIRE_VENV=\${PIP_REQUIRE_VENV} PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : false" @@ -158,6 +169,7 @@ rehashed OUT unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec unstub curl teardown_version "3.2.1" diff --git a/test/virtualenv.bats b/test/virtualenv.bats index 1baba15..7567deb 100644 --- a/test/virtualenv.bats +++ b/test/virtualenv.bats @@ -25,6 +25,7 @@ unstub_pyenv() { @test "create virtualenv from given version" { export PYENV_VERSION="3.2.1" stub_pyenv "${PYENV_VERSION}" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : false" stub pyenv-exec "python -s */get-pip.py : true" @@ -40,6 +41,7 @@ rehashed OUT unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec unstub curl } @@ -48,6 +50,7 @@ OUT export PYENV_VERSION="3.2.1" stub_pyenv "${PYENV_VERSION}" stub pyenv-version-name "echo \${PYENV_VERSION}" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : false" stub pyenv-exec "python -s */get-pip.py : true" @@ -64,6 +67,7 @@ OUT unstub_pyenv unstub pyenv-version-name + unstub pyenv-virtualenv-prefix unstub pyenv-exec unstub curl } @@ -72,6 +76,7 @@ OUT export PYENV_VERSION="3.2.1" stub_pyenv "${PYENV_VERSION}" stub pyenv-version-name "echo \${PYENV_VERSION}" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : false" stub pyenv-exec "python -s */get-pip.py : true" @@ -88,6 +93,7 @@ OUT unstub_pyenv unstub pyenv-version-name + unstub pyenv-virtualenv-prefix unstub pyenv-exec unstub curl } @@ -96,6 +102,7 @@ OUT export PYENV_VERSION="3.2.1" stub_pyenv "${PYENV_VERSION}" stub pyenv-version-name "echo \${PYENV_VERSION}" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : false" stub pyenv-exec "python -s */get-pip.py : true" @@ -112,6 +119,7 @@ OUT unstub_pyenv unstub pyenv-version-name + unstub pyenv-virtualenv-prefix unstub pyenv-exec unstub curl } @@ -155,6 +163,7 @@ OUT @test "slash allowed if it is the long name of the virtualenv" { export PYENV_VERSION="3.2.1" stub_pyenv "${PYENV_VERSION}" + stub pyenv-virtualenv-prefix " : false" stub pyenv-exec "virtualenv * : echo PYENV_VERSION=\${PYENV_VERSION} \"\$@\"" stub pyenv-exec "python -s -m ensurepip : false" stub pyenv-exec "python -s */get-pip.py : true" @@ -170,6 +179,7 @@ rehashed OUT unstub_pyenv + unstub pyenv-virtualenv-prefix unstub pyenv-exec unstub curl } From a5d406a5456e65b98cee699631f97a796d004190 Mon Sep 17 00:00:00 2001 From: "Yamashita, Yuu" Date: Fri, 4 Dec 2015 02:41:43 +0000 Subject: [PATCH 4/4] Add tests for extra `envs` in `PYENV_ROOT` --- test/envs.bats | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 test/envs.bats 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 <