From bb623bd8bfb55d83be9b847b20fba94065e785e9 Mon Sep 17 00:00:00 2001 From: "Yamashita, Yuu" Date: Mon, 9 Nov 2015 05:56:42 +0000 Subject: [PATCH] Prevent removing symlinks bound to different version (#106) --- bin/pyenv-virtualenv-delete | 8 +++++++- test/delete.bats | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/bin/pyenv-virtualenv-delete b/bin/pyenv-virtualenv-delete index 612b233..90900f5 100755 --- a/bin/pyenv-virtualenv-delete +++ b/bin/pyenv-virtualenv-delete @@ -11,6 +11,7 @@ # See `pyenv virtualenvs` for a complete list of installed versions. # set -e +[ -n "$PYENV_DEBUG" ] && set -x # Provide pyenv completions if [ "$1" = "--complete" ]; then @@ -54,11 +55,16 @@ COMPAT_PREFIX="${PYENV_ROOT}/versions/${VERSION_NAME}" if [[ "${DEFINITION}" != "${DEFINITION%/envs/*}" ]]; then PREFIX="${PYENV_ROOT}/versions/${DEFINITION}" + if [ -L "${COMPAT_PREFIX}" ]; then + if [[ "${PREFIX}" != "$(resolve_link "${COMPAT_PREFIX}" 2>/dev/null || true)" ]]; then + unset COMPAT_PREFIX + fi + fi else if [ -L "${COMPAT_PREFIX}" ]; then PREFIX="$(resolve_link "${COMPAT_PREFIX}" 2>/dev/null || true)" if [[ "${PREFIX}" == "${PREFIX%/envs/*}" ]]; then - echo "pyenv-virtualenv: \`${PREFIX}' is a symlink for unknown location." 1>&2 + echo "pyenv-virtualenv: \`${COMPAT_PREFIX}' is a symlink for unknown location." 1>&2 exit 1 fi else diff --git a/test/delete.bats b/test/delete.bats index 304beec..3818aa5 100644 --- a/test/delete.bats +++ b/test/delete.bats @@ -54,6 +54,23 @@ setup() { [ ! -L "${PYENV_ROOT}/versions/venv27" ] } +@test "not delete virtualenv with different symlink" { + mkdir -p "${PYENV_ROOT}/versions/2.7.8/envs/venv27" + mkdir -p "${PYENV_ROOT}/versions/2.7.10/envs/venv27" + ln -fs "${PYENV_ROOT}/versions/2.7.8/envs/venv27" "${PYENV_ROOT}/versions/venv27" + + stub pyenv-rehash "true" + + run pyenv-virtualenv-delete -f "2.7.10/envs/venv27" + + assert_success + + unstub pyenv-rehash + + [ ! -d "${PYENV_ROOT}/versions/2.7.10/envs/venv27" ] + [ -L "${PYENV_ROOT}/versions/venv27" ] +} + @test "not delete virtualenv with same name" { mkdir -p "${PYENV_ROOT}/versions/2.7.10/envs/venv27" mkdir -p "${PYENV_ROOT}/versions/venv27"