diff --git a/libexec/pyenv-which b/libexec/pyenv-which index 8e2a6f4e..ccef0083 100755 --- a/libexec/pyenv-which +++ b/libexec/pyenv-which @@ -15,43 +15,17 @@ if [ "$1" = "--complete" ]; then exec pyenv shims --short fi -expand_path() { - if [ ! -d "$1" ]; then - return 1 - fi - - local cwd="$(pwd)" - cd "$1" - pwd - cd "$cwd" -} - remove_from_path() { - local path_to_remove="$(expand_path "$1")" - local result="" - - if [ -z "$path_to_remove" ]; then - echo "${PATH}" - return - fi - - local paths - IFS=: paths=($PATH) - - for path in "${paths[@]}"; do - path="$(expand_path "$path" || true)" - if [ -n "$path" ] && [ "$path" != "$path_to_remove" ]; then - result="${result}${path}:" - fi + local path_to_remove="$1" + local path_before + local result=":$PATH:" + while [ "$path_before" != "$result" ]; do + path_before="$result" + result="${result//:$path_to_remove:/:}" done - echo "${result%:}" } -OLDIFS="$IFS" -IFS=: versions=($(pyenv-version-name)) -IFS=: PYENV_VERSION="${versions[*]}" -IFS="$OLDIFS" PYENV_COMMAND="$1" if [ -z "$PYENV_COMMAND" ]; then @@ -59,6 +33,10 @@ if [ -z "$PYENV_COMMAND" ]; then exit 1 fi +OLDIFS="$IFS" +IFS=: versions=(${PYENV_VERSION:-$(pyenv-version-name)}) +IFS="$OLDIFS" + for version in "${versions[@]}"; do if [ "$version" = "system" ]; then PATH="$(remove_from_path "${PYENV_ROOT}/shims")" @@ -67,6 +45,7 @@ for version in "${versions[@]}"; do PYENV_COMMAND_PATH="${PYENV_ROOT}/versions/${version}/bin/${PYENV_COMMAND}" fi if [ -x "$PYENV_COMMAND_PATH" ]; then + PYENV_VERSION="$version" break fi done @@ -80,6 +59,9 @@ done if [ -x "$PYENV_COMMAND_PATH" ]; then echo "$PYENV_COMMAND_PATH" +elif ! [ -d "${PYENV_ROOT}/versions/${PYENV_VERSION}" ]; then + echo "pyenv: version \`$PYENV_VERSION' is not installed" >&2 + exit 1 else echo "pyenv: $PYENV_COMMAND: command not found" >&2 diff --git a/test/which.bats b/test/which.bats index dcce6665..d3b69f2b 100644 --- a/test/which.bats +++ b/test/which.bats @@ -21,6 +21,9 @@ create_executable() { PYENV_VERSION=3.4 run pyenv-which py.test assert_success "${PYENV_ROOT}/versions/3.4/bin/py.test" + + PYENV_VERSION=3.4:2.7 run pyenv-which py.test + assert_success "${PYENV_ROOT}/versions/3.4/bin/py.test" } @test "searches PATH for system version" { @@ -31,6 +34,31 @@ create_executable() { assert_success "${PYENV_TEST_DIR}/bin/kill-all-humans" } +@test "searches PATH for system version (shims prepended)" { + create_executable "${PYENV_TEST_DIR}/bin" "kill-all-humans" + create_executable "${PYENV_ROOT}/shims" "kill-all-humans" + + PATH="${PYENV_ROOT}/shims:$PATH" PYENV_VERSION=system run pyenv-which kill-all-humans + assert_success "${PYENV_TEST_DIR}/bin/kill-all-humans" +} + +@test "searches PATH for system version (shims appended)" { + create_executable "${PYENV_TEST_DIR}/bin" "kill-all-humans" + create_executable "${PYENV_ROOT}/shims" "kill-all-humans" + + PATH="$PATH:${PYENV_ROOT}/shims" PYENV_VERSION=system run pyenv-which kill-all-humans + assert_success "${PYENV_TEST_DIR}/bin/kill-all-humans" +} + +@test "searches PATH for system version (shims spread)" { + create_executable "${PYENV_TEST_DIR}/bin" "kill-all-humans" + create_executable "${PYENV_ROOT}/shims" "kill-all-humans" + + PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/shims:/tmp/non-existent:$PATH:${PYENV_ROOT}/shims" \ + PYENV_VERSION=system run pyenv-which kill-all-humans + assert_success "${PYENV_TEST_DIR}/bin/kill-all-humans" +} + @test "version not installed" { create_executable "3.4" "py.test" PYENV_VERSION=3.3 run pyenv-which py.test @@ -68,7 +96,19 @@ echo HELLO="\$(printf ":%s" "\${hellos[@]}")" exit SH - PYENV_HOOK_PATH="$hook_path" IFS=$' \t\n' run pyenv-which anything + PYENV_HOOK_PATH="$hook_path" IFS=$' \t\n' PYENV_VERSION=system run pyenv-which anything assert_success assert_output "HELLO=:hello:ugly:world:again" } + +@test "discovers version from pyenv-version-name" { + mkdir -p "$PYENV_ROOT" + cat > "${PYENV_ROOT}/version" <<<"3.4" + create_executable "3.4" "python" + + mkdir -p "$PYENV_TEST_DIR" + cd "$PYENV_TEST_DIR" + + PYENV_VERSION= run pyenv-which python + assert_success "${PYENV_ROOT}/versions/3.4/bin/python" +}