.shrc.d/prompt0-venv.sh
8d38feea
 VIRTUAL_ENV_DISABLE_PROMPT='1'
 
 __prompt_venv_rel()
 {
   __prompt_venv_rel_dir="$PWD"
   __prompt_venv_rel_up=''
   while [ "${1#$__prompt_venv_rel_dir/}" = "$1" ]
   do
     __prompt_venv_rel_dir="${__prompt_venv_rel_dir%/*}"
     __prompt_venv_rel_up="../$__prompt_venv_rel_up"
   done
   printf '%s' "$__prompt_venv_rel_up${1#$__prompt_venv_rel_dir/}"
 }
 
 __prompt_venv()
 {
   if [ "${VIRTUAL_ENV:-}" ]
   then
     printf "$1" "$(__prompt_venv_rel "$VIRTUAL_ENV")"
   fi
 }
 
 # Ask to activate the first virtual environment found, searching from the
 # current directory up to `$HOME` or `/`, whichever comes first.
 # https://github.com/python/cpython/blob/master/Lib/venv/scripts/common/activate
 __prompt_venv_activate()
 {
   if [ "${VIRTUAL_ENV:-}" ]
   then
     deactivate
   fi
   __prompt_venv_dir="$PWD"
   while
     [ "$__prompt_venv_dir" != "$HOME" ] &&
     [ "$__prompt_venv_dir" != '' ]
   do
     for __prompt_venv_activate in \
       "$__prompt_venv_dir/"*'/bin/activate' \
       "$__prompt_venv_dir/."*'/bin/activate'
     do
       [ -r "$__prompt_venv_activate" ] || continue
       grep -q 'VIRTUAL_ENV' "$__prompt_venv_activate" || continue
       __prompt_venv="${__prompt_venv_activate%/*/*}"
       if [ "$__prompt_venv" != "$__prompt_venv_prev" ]
       then
         while true
         do
           printf 'Activate %s? [y/N] ' "$(__prompt_venv_rel "$__prompt_venv")"
           read -r __prompt_venv_reply
           case "$__prompt_venv_reply" in
             'y'|'n'|'') break; ;;
           esac
         done
       fi
       case "$__prompt_venv_reply" in
         'y') . "$__prompt_venv_activate"; ;;
       esac
       __prompt_venv_prev="$__prompt_venv"
       return 0
     done
     __prompt_venv_dir="${__prompt_venv_dir%/*}"
   done
 }