#!/usr/bin/env bash
# Usage: pyenv version-file [<dir>]
# 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 notaion for Cygwin/MinGW
  # (https://github.com/rbenv/rbenv/pull/529)
  # POSIX.1-2024 still allows to treat //<name> 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
