From a1df551bcf5165d375fcbbbc26b583ee53cfb611 Mon Sep 17 00:00:00 2001 From: Daniel Hahler Date: Mon, 13 Oct 2014 20:31:32 +0200 Subject: [PATCH] Merge tests and remove_from_path from rbenv This adds the missing parts from the upstream rbenv merge: https://github.com/sstephenson/rbenv/commit/f4652fbbf0bbc3d07a36e8781b2be54ec1f75518 - https://github.com/sstephenson/rbenv/commit/e4cbf04592cfcd9d244fb83284e14524c8ba0377 - https://github.com/sstephenson/rbenv/commit/3ee395f9b576e4111650cef67328f4ffe3687b5a --- libexec/pyenv-which | 30 +++++++++++++++++++++--------- test/which.bats | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 9 deletions(-) diff --git a/libexec/pyenv-which b/libexec/pyenv-which index c5e06978..ccef0083 100755 --- a/libexec/pyenv-which +++ b/libexec/pyenv-which @@ -15,10 +15,17 @@ if [ "$1" = "--complete" ]; then exec pyenv shims --short fi -OLDIFS="$IFS" -IFS=: versions=($(pyenv-version-name)) -IFS=: PYENV_VERSION="${versions[*]}" -IFS="$OLDIFS" +remove_from_path() { + 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%:}" +} + PYENV_COMMAND="$1" if [ -z "$PYENV_COMMAND" ]; then @@ -26,17 +33,19 @@ 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 - # Remove shims from PATH: - _path=":$PATH:" - _remove="${PYENV_ROOT}/shims" - _path="${_path//:$_remove:/:}" - PYENV_COMMAND_PATH="$(PATH=$_path command -v "$PYENV_COMMAND" || true)" + PATH="$(remove_from_path "${PYENV_ROOT}/shims")" + PYENV_COMMAND_PATH="$(command -v "$PYENV_COMMAND" || true)" else PYENV_COMMAND_PATH="${PYENV_ROOT}/versions/${version}/bin/${PYENV_COMMAND}" fi if [ -x "$PYENV_COMMAND_PATH" ]; then + PYENV_VERSION="$version" break fi done @@ -50,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..6d80eea8 100644 --- a/test/which.bats +++ b/test/which.bats @@ -31,6 +31,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 @@ -72,3 +97,15 @@ SH 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" +}