From 8187bc84e3f42d41ebd70537b55f1a1b753b5619 Mon Sep 17 00:00:00 2001 From: Yamashita Yuu Date: Fri, 31 Aug 2012 16:09:46 +0900 Subject: [PATCH] search commands from python version stack. users can use multiple python versions at once. --- libexec/pyenv-global | 19 ++++++++++++------- libexec/pyenv-help | 6 +++--- libexec/pyenv-local | 21 +++++++++++++-------- libexec/pyenv-prefix | 25 +++++++++++++++---------- libexec/pyenv-sh-shell | 22 ++++++++++++++-------- libexec/pyenv-version | 6 +++++- libexec/pyenv-version-file-read | 14 +++++++++----- libexec/pyenv-version-file-write | 19 ++++++++++++++----- libexec/pyenv-version-name | 22 ++++++++++++---------- libexec/pyenv-versions | 8 ++++---- libexec/pyenv-which | 29 ++++++++++++----------------- 11 files changed, 113 insertions(+), 78 deletions(-) diff --git a/libexec/pyenv-global b/libexec/pyenv-global index b89d0220..e7f64156 100755 --- a/libexec/pyenv-global +++ b/libexec/pyenv-global @@ -8,14 +8,19 @@ if [ "$1" = "--complete" ]; then exec pyenv-versions --bare fi -PYENV_VERSION="$1" +PYENV_VERSIONS=($@) PYENV_VERSION_FILE="${PYENV_ROOT}/version" -if [ -n "$PYENV_VERSION" ]; then - pyenv-version-file-write "$PYENV_VERSION_FILE" "$PYENV_VERSION" +if [ -n "$PYENV_VERSIONS" ]; then + pyenv-version-file-write "$PYENV_VERSION_FILE" "${PYENV_VERSIONS[@]}" else - pyenv-version-file-read "$PYENV_VERSION_FILE" || - pyenv-version-file-read "${PYENV_ROOT}/global" || - pyenv-version-file-read "${PYENV_ROOT}/default" || - echo system + IFS=: PYENV_VERSIONS=($( + pyenv-version-file-read "$PYENV_VERSION_FILE" || + pyenv-version-file-read "${PYENV_ROOT}/global" || + pyenv-version-file-read "${PYENV_ROOT}/default" || + echo system + )) + for PYENV_VERSION in "${PYENV_VERSIONS[@]}"; do + echo "$PYENV_VERSION" + done fi diff --git a/libexec/pyenv-help b/libexec/pyenv-help index 05629d94..442367fc 100755 --- a/libexec/pyenv-help +++ b/libexec/pyenv-help @@ -44,7 +44,7 @@ global) echo "usage: pyenv global Sets the global Python version. You can override the global version at any time by setting a directory-specific version with \`pyenv local' -or by setting the PYENV_VERSION environment variable. +or by setting the PYENV_VERSIONS environment variable. $(print_set_version)" ;; @@ -58,14 +58,14 @@ When you run a Python command, pyenv will look for an '.pyenv-version' file in the current directory and each parent directory. If no such file is found in the tree, pyenv will use the global Python version specified with \`pyenv global', or the version specified in the -PYENV_VERSION environment variable. +PYENV_VERSIONS environment variable. $(print_set_version)" ;; shell) echo "usage: pyenv shell pyenv shell --unset -Sets a shell-specific Python version by setting the 'PYENV_VERSION' +Sets a shell-specific Python version by setting the 'PYENV_VERSIONS' environment variable in your shell. This version overrides both project-specific versions and the global version. diff --git a/libexec/pyenv-local b/libexec/pyenv-local index ce9f201f..5b62a95f 100755 --- a/libexec/pyenv-local +++ b/libexec/pyenv-local @@ -9,16 +9,21 @@ if [ "$1" = "--complete" ]; then exec pyenv-versions --bare fi -PYENV_VERSION="$1" +PYENV_VERSIONS=($@) PYENV_VERSION_FILE=".pyenv-version" -if [ "$PYENV_VERSION" = "--unset" ]; then +if [ "$PYENV_VERSIONS" = "--unset" ]; then rm -f "$PYENV_VERSION_FILE" -elif [ -n "$PYENV_VERSION" ]; then - pyenv-version-file-write "$PYENV_VERSION_FILE" "$PYENV_VERSION" +elif [ -n "$PYENV_VERSIONS" ]; then + pyenv-version-file-write "$PYENV_VERSION_FILE" "${PYENV_VERSIONS[@]}" else - pyenv-version-file-read "$PYENV_VERSION_FILE" || - { echo "pyenv: no local version configured for this directory" - exit 1 - } >&2 + IFS=: PYENV_VERSIONS=($( + pyenv-version-file-read "$PYENV_VERSION_FILE" || + { echo "pyenv: no local version configured for this directory" + exit 1 + } >&2 + )) + for PYENV_VERSION in "${PYENV_VERSIONS[@]}"; do + echo "$PYENV_VERSION" + done fi diff --git a/libexec/pyenv-prefix b/libexec/pyenv-prefix index b87c9d28..38163a33 100755 --- a/libexec/pyenv-prefix +++ b/libexec/pyenv-prefix @@ -9,21 +9,26 @@ if [ "$1" = "--complete" ]; then fi if [ -n "$1" ]; then - export PYENV_VERSION="$1" -elif [ -z "$PYENV_VERSION" ]; then - PYENV_VERSION="$(pyenv-version-name)" + export PYENV_VERSIONS=($@) +else + IFS=: PYENV_VERSIONS=($(pyenv-version-name)) fi -if [ "$PYENV_VERSION" = "system" ]; then +if [ "$PYENV_VERSIONS" = "system" ]; then PYTHON_PATH="$(pyenv-which python)" echo "${PYTHON_PATH%/*}" exit fi -PYENV_PREFIX_PATH="${PYENV_ROOT}/versions/${PYENV_VERSION}" -if [ ! -d "$PYENV_PREFIX_PATH" ]; then - echo "pyenv: version \`${PYENV_VERSION}' not installed" >&2 - exit 1 -fi +PYENV_PREFIX_PATHS=() +for PYENV_VERSION in "${PYENV_VERSIONS[@]}"; do + PYENV_PREFIX_PATH="${PYENV_ROOT}/versions/${PYENV_VERSION}" + if [ -d "$PYENV_PREFIX_PATH" ]; then + PYENV_PREFIX_PATHS=("${PYENV_PREFIX_PATHS[@]}" "$PYENV_PREFIX_PATH") + else + echo "pyenv: version \`${PYENV_VERSION}' not installed" >&2 + exit 1 + fi +done -echo "$PYENV_PREFIX_PATH" +IFS=: echo "${PYENV_PREFIX_PATHS[*]}" diff --git a/libexec/pyenv-sh-shell b/libexec/pyenv-sh-shell index 3b22fb4d..f54dceba 100755 --- a/libexec/pyenv-sh-shell +++ b/libexec/pyenv-sh-shell @@ -9,24 +9,30 @@ if [ "$1" = "--complete" ]; then exec pyenv-versions --bare fi -version="$1" +versions=() +for version in "$@"; do + versions=("${versions[@]}" "$version") +done -if [ -z "$version" ]; then - if [ -z "$PYENV_VERSION" ]; then +if [ -z "$versions" ]; then + if [ -z "$PYENV_VERSIONS" ]; then echo "pyenv: no shell-specific version configured" >&2 exit 1 else - echo "echo \"\$PYENV_VERSION\"" + echo "echo \"\$PYENV_VERSIONS\"" exit fi fi -if [ "$version" = "--unset" ]; then - echo "unset PYENV_VERSION" +if [ "$versions" = "--unset" ]; then + echo "unset PYENV_VERSIONS" exit 1 fi # Make sure the specified version is installed. -pyenv-prefix "$version" >/dev/null +pyenv-prefix $versions >/dev/null -echo "export PYENV_VERSION=\"${version}\"" +{ + IFS=: + echo "export PYENV_VERSIONS=\"${versions[*]}\"" +} diff --git a/libexec/pyenv-version b/libexec/pyenv-version index 25794212..992b1261 100755 --- a/libexec/pyenv-version +++ b/libexec/pyenv-version @@ -2,4 +2,8 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -echo "$(pyenv-version-name) (set by $(pyenv-version-origin))" +IFS=: PYENV_VERSION_NAMES=($(pyenv-version-name)) + +for PYENV_VERSION_NAME in "${PYENV_VERSION_NAMES[@]}"; do + echo "$PYENV_VERSION_NAME (set by $(pyenv-version-origin))" +done diff --git a/libexec/pyenv-version-file-read b/libexec/pyenv-version-file-read index 8c775b56..9fed7f69 100755 --- a/libexec/pyenv-version-file-read +++ b/libexec/pyenv-version-file-read @@ -7,16 +7,20 @@ VERSION_FILE="$1" if [ -e "$VERSION_FILE" ]; then # Read and print the first non-whitespace word from the specified # version file. - version="" + versions=() while read -a words; do word="${words[0]}" - if [ -z "$version" ] && [ -n "$word" ]; then - version="$word" + if [ -n "$word" ]; then + length="${#versions[@]}" + versions=("${versions[@]}" "$word") fi done < <( cat "$VERSION_FILE" && echo ) - if [ -n "$version" ]; then - echo "$version" + if [ -n "$versions" ]; then + { + IFS=: + echo "${versions[*]}" + } exit fi fi diff --git a/libexec/pyenv-version-file-write b/libexec/pyenv-version-file-write index d9e21b5a..befe595c 100755 --- a/libexec/pyenv-version-file-write +++ b/libexec/pyenv-version-file-write @@ -3,15 +3,24 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x PYENV_VERSION_FILE="$1" -PYENV_VERSION="$2" +shift +PYENV_VERSIONS=() +for version in "$@"; do + PYENV_VERSIONS=("${PYENV_VERSIONS[@]}" "$version") +done -if [ -z "$PYENV_VERSION" ] || [ -z "$PYENV_VERSION_FILE" ]; then - echo "usage: pyenv write-version-file FILENAME VERSION" >&2 +if [ -z "$PYENV_VERSIONS" ] || [ -z "$PYENV_VERSION_FILE" ]; then + echo "usage: pyenv write-version-file FILENAME VERSIONS..." >&2 exit 1 fi # Make sure the specified version is installed. -pyenv-prefix "$PYENV_VERSION" >/dev/null +for PYENV_VERSION in "${PYENV_VERSIONS[@]}"; do + pyenv-prefix "$PYENV_VERSION" >/dev/null +done # Write the version out to disk. -echo "$PYENV_VERSION" > "$PYENV_VERSION_FILE" +rm -f "$PYENV_VERSION_FILE" +for PYENV_VERSION in "${PYENV_VERSIONS[@]}"; do + echo "$PYENV_VERSION" >> "$PYENV_VERSION_FILE" +done diff --git a/libexec/pyenv-version-name b/libexec/pyenv-version-name index 8a8d317d..fec0f16a 100755 --- a/libexec/pyenv-version-name +++ b/libexec/pyenv-version-name @@ -2,21 +2,23 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -if [ -z "$PYENV_VERSION" ]; then +if [ -z "$PYENV_VERSIONS" ]; then PYENV_VERSION_FILE="$(pyenv-version-file)" - PYENV_VERSION="$(pyenv-version-file-read "$PYENV_VERSION_FILE" || true)" + IFS=: PYENV_VERSIONS=($(pyenv-version-file-read "$PYENV_VERSION_FILE" || true)) fi -if [ -z "$PYENV_VERSION" ] || [ "$PYENV_VERSION" = "system" ]; then +if [ -z "$PYENV_VERSIONS" ] || [ "$PYENV_VERSIONS" = "system" ] ; then echo "system" exit fi -PYENV_VERSION_PATH="${PYENV_ROOT}/versions/${PYENV_VERSION}" +for PYENV_VERSION in "${PYENV_VERSIONS[@]}"; do + PYENV_VERSION_PATH="${PYENV_ROOT}/versions/${PYENV_VERSION}" + + if [ ! -d "$PYENV_VERSION_PATH" ]; then + echo "pyenv: version \`$PYENV_VERSION' is not installed" >&2 + exit 1 + fi +done -if [ -d "$PYENV_VERSION_PATH" ]; then - echo "$PYENV_VERSION" -else - echo "pyenv: version \`$PYENV_VERSION' is not installed" >&2 - exit 1 -fi +IFS=: echo "${PYENV_VERSIONS[*]}" diff --git a/libexec/pyenv-versions b/libexec/pyenv-versions index d920649c..4e9ac05f 100755 --- a/libexec/pyenv-versions +++ b/libexec/pyenv-versions @@ -2,23 +2,23 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -PYENV_VERSION_NAME="$(pyenv-version-name)" +IFS=: PYENV_VERSION_NAMES=($(pyenv-version-name)) if [ "$1" = "--bare" ]; then hit_prefix="" miss_prefix="" - print_version="$PYENV_VERSION_NAME" + print_version="$PYENV_VERSION_NAMES" else hit_prefix="* " miss_prefix=" " - print_version="$(pyenv-version)" + print_version="$PYENV_VERSION_NAMES (set by $(pyenv-version-origin))" fi for path in "${PYENV_ROOT}/versions/"*; do if [ -d "$path" ]; then version="${path##*/}" - if [ "$version" == "$PYENV_VERSION_NAME" ]; then + if [ "$version" == "$PYENV_VERSION_NAMES" ]; then echo "${hit_prefix}${print_version}" else echo "${miss_prefix}${version}" diff --git a/libexec/pyenv-which b/libexec/pyenv-which index 0f78c136..26b1675d 100755 --- a/libexec/pyenv-which +++ b/libexec/pyenv-which @@ -40,7 +40,7 @@ remove_from_path() { echo "${result%:}" } -PYENV_VERSION="$(pyenv-version-name)" +IFS=: PYENV_VERSIONS=($(pyenv-version-name)) PYENV_COMMAND="$1" if [ -z "$PYENV_COMMAND" ]; then @@ -48,12 +48,17 @@ if [ -z "$PYENV_COMMAND" ]; then exit 1 fi -if [ "$PYENV_VERSION" = "system" ]; then - PATH="$(remove_from_path "${PYENV_ROOT}/shims")" - PYENV_COMMAND_PATH="$(command -v "$PYENV_COMMAND")" -else - PYENV_COMMAND_PATH="${PYENV_ROOT}/versions/${PYENV_VERSION}/bin/${PYENV_COMMAND}" -fi +for PYENV_VERSION in "${PYENV_VERSIONS[@]}"; do + if [ "$PYENV_VERSION" = "system" ]; then + PATH="$(remote_from_path "${PYENV_ROOT}/shims")" + PYENV_COMMAND_PATH="$(command -v "$PYENV_COMMAND")" + else + PYENV_COMMAND_PATH="${PYENV_ROOT}/versions/${PYENV_VERSION}/bin/${PYENV_COMMAND}" + if [ -x "$PYENV_COMMAND_PATH" ]; then + break + fi + fi +done for script in $(pyenv-hooks which); do source "$script" @@ -63,15 +68,5 @@ if [ -x "$PYENV_COMMAND_PATH" ]; then echo "$PYENV_COMMAND_PATH" else echo "pyenv: $PYENV_COMMAND: command not found" >&2 - - versions="$(pyenv-whence "$PYENV_COMMAND" || true)" - if [ -n "$versions" ]; then - { echo - echo "The \`$1' command exists in these Python versions:" - echo "$versions" | sed 's/^/ /g' - echo - } >&2 - fi - exit 127 fi