diff --git a/libexec/pyenv-latest b/libexec/pyenv-latest index 5c247105..d4c44b60 100755 --- a/libexec/pyenv-latest +++ b/libexec/pyenv-latest @@ -31,7 +31,7 @@ exitcode=0 IFS=$'\n' if [[ -z $FROM_KNOWN ]]; then - DEFINITION_CANDIDATES=( $(pyenv-versions --bare) ) + DEFINITION_CANDIDATES=( $(pyenv-versions --bare --skip-envs) ) else DEFINITION_CANDIDATES=( $(python-build --definitions ) ) fi @@ -48,10 +48,9 @@ IFS=$'\n' $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ grep -Ee "^$prefix_re[-.]" || true)) - #FIXME: /envs/ should be excluded in Pyenv-Virtualenv via a hook DEFINITION_CANDIDATES=(\ $(printf '%s\n' "${DEFINITION_CANDIDATES[@]}" | \ - sed -E -e '/-dev$/d' -e '/-src$/d' -e '/-latest$/d' -e '/(a|b|rc)[0-9]+$/d' -e '/\/envs\//d')); + sed -E -e '/-dev$/d' -e '/-src$/d' -e '/-latest$/d' -e '/(a|b|rc)[0-9]+$/d')); # Compose a sorting key, followed by | and original value DEFINITION_CANDIDATES=(\ diff --git a/libexec/pyenv-versions b/libexec/pyenv-versions index fc309a03..3aaaa055 100755 --- a/libexec/pyenv-versions +++ b/libexec/pyenv-versions @@ -1,23 +1,24 @@ #!/usr/bin/env bash # Summary: List all Python versions available to pyenv -# Usage: pyenv versions [--bare] [--skip-aliases] +# Usage: pyenv versions [--bare] [--skip-aliases] [--skip-envs] # # Lists all Python versions found in `$PYENV_ROOT/versions/*'. set -e [ -n "$PYENV_DEBUG" ] && set -x -unset bare -unset skip_aliases +unset bare skip_aliases skip_envs # Provide pyenv completions for arg; do case "$arg" in --complete ) echo --bare echo --skip-aliases + echo --skip-envs exit ;; --bare ) bare=1 ;; --skip-aliases ) skip_aliases=1 ;; + --skip-envs ) skip_envs=1 ;; * ) pyenv-help --usage versions >&2 exit 1 @@ -70,8 +71,6 @@ else current_versions=() fi if [ -n "$bare" ]; then - hit_prefix="" - miss_prefix="" include_system="" else hit_prefix="* " @@ -105,11 +104,15 @@ exists() { print_version() { local version="${1:?}" + if [[ -n $bare ]]; then + echo "$version" + return + fi local path="${2:?}" - if [[ -z "$bare" && -L "$path" ]]; then + if [[ -L "$path" ]]; then # Only resolve the link itself for printing, do not resolve further. # Doing otherwise would misinform the user of what the link contains. - version_repr="$version --> $(resolve_link "$version")" + version_repr="$version --> $(resolve_link "$path")" else version_repr="$version" fi @@ -152,12 +155,14 @@ for path in "${versions_dir_entries[@]}"; do [ "${target%/*/envs/*}" == "$versions_dir" ] && continue fi print_version "${path##*/}" "$path" - # virtual environments created by anaconda/miniconda - for env_path in "${path}/envs/"*; do - if [ -d "${env_path}" ]; then - print_version "${env_path#${PYENV_ROOT}/versions/}" "${env_path}" - fi - done + # virtual environments created by anaconda/miniconda/pyenv-virtualenv + if [[ -z $skip_envs ]]; then + for env_path in "${path}/envs/"*; do + if [ -d "${env_path}" ]; then + print_version "${env_path#${PYENV_ROOT}/versions/}" "${env_path}" + fi + done + fi fi done shopt -u dotglob nullglob diff --git a/test/versions.bats b/test/versions.bats index 36db4967..ce101d30 100644 --- a/test/versions.bats +++ b/test/versions.bats @@ -66,18 +66,38 @@ OUT assert_success "3.3" } -@test "multiple versions" { +@test "multiple versions and envs" { stub_system_python create_version "2.7.6" - create_version "3.3.3" create_version "3.4.0" + create_version "3.4.0/envs/foo" + create_version "3.4.0/envs/bar" + create_version "3.5.2" run pyenv-versions assert_success assert_output <