#!/usr/bin/env bash # Usage: pyenv version-file [] # Summary: Detect the file that sets the current pyenv version set -e [ -n "$PYENV_DEBUG" ] && set -x target_dir="$1" find_local_version_file() { local root="$1" # Nonexistent paths are UB as of this writing. # Relative ones cause a failure but absolute ones don't [[ $root != /* ]] && root=$(CDPATH= cd -- "$root" && pwd) # Original Rbenv code supports UNC notation for Cygwin/MinGW # (https://github.com/rbenv/rbenv/pull/529) # POSIX.1-2024 still allows to treat // in implementation-specific manner # (https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap04.html#tag_04_16) # even though few UNIX variants do that local unc; [[ $root =~ ^//[^/] && ! / -ef // ]] && unc=1 root="${root%/}" # when testing root, $root is "" while true; do # don't test //.python-version if // is special # as it's pointless and possibly very slow # if it e.g. leads to a network search [[ $unc && $root == / ]] && break if [[ -f $root/.python-version ]]; then echo "$root/.python-version" return 0 fi [[ -n $root ]] || break root="${root%/*}" done return 1 } if [ -n "$target_dir" ]; then find_local_version_file "$target_dir" else find_local_version_file "$PYENV_DIR" || { [ "$PYENV_DIR" != "$PWD" ] && find_local_version_file "$PWD" } || echo "${PYENV_ROOT}/version" fi