@@ -54,11 +54,45 @@ export PATH="${TMP}/pyenv/plugins/pyenv-virtualenv/shims:\${PATH}";
5454export PYENV_VIRTUALENV_INIT=1;
5555_pyenv_virtualenv_hook() {
5656 local ret=\$ ?
57+ # Cache: env vars checked once, path list and stat rebuilt on miss only
58+ if [ "\$ {PYENV_VERSION-}" = "\$ {_PYENV_VH_VERSION-}" ] \\
59+ && [ "\$ {VIRTUAL_ENV-}" = "\$ {_PYENV_VH_VENV-}" ]; then
60+ if [ -n "\$ {PYENV_VERSION-}" ]; then
61+ return \$ ret
62+ fi
63+ if [ "\$ {PWD}" = "\$ {_PYENV_VH_PWD-}" ] \\
64+ && [ "\$ (stat ${_stat_fmt} "\$ {_PYENV_VH_PATHS[@]}" 2>/dev/null)" = "\$ {_PYENV_VH_MTIMES-}" ]; then
65+ return \$ ret
66+ fi
67+ fi
5768 if [ -n "\$ {VIRTUAL_ENV-}" ]; then
5869 eval "\$ (pyenv sh-activate --quiet || pyenv sh-deactivate --quiet || true)" || true
5970 else
6071 eval "\$ (pyenv sh-activate --quiet || true)" || true
6172 fi
73+ _PYENV_VH_PWD="\$ {PWD}"
74+ _PYENV_VH_VERSION="\$ {PYENV_VERSION-}"
75+ _PYENV_VH_VENV="\$ {VIRTUAL_ENV-}"
76+ local _pvh_d="\$ {PWD}" _pvh_found_local=0
77+ _PYENV_VH_PATHS=()
78+ while :; do
79+ if [ -f "\$ {_pvh_d}/.python-version" ] || [ -L "\$ {_pvh_d}/.python-version" ]; then
80+ _PYENV_VH_PATHS+=("\$ {_pvh_d}/.python-version")
81+ if [ -f "\$ {_pvh_d}/.python-version" ]; then
82+ _pvh_found_local=1
83+ break
84+ fi
85+ else
86+ _PYENV_VH_PATHS+=("\$ {_pvh_d}")
87+ fi
88+ [ "\$ {_pvh_d}" = "/" ] && break
89+ _pvh_d="\$ {_pvh_d%/*}"
90+ [ -z "\$ {_pvh_d}" ] && _pvh_d="/"
91+ done
92+ if [ "\$ {_pvh_found_local}" = "0" ]; then
93+ _PYENV_VH_PATHS+=("\$ {PYENV_ROOT}/version")
94+ fi
95+ _PYENV_VH_MTIMES="\$ (stat ${_stat_fmt} "\$ {_PYENV_VH_PATHS[@]}" 2>/dev/null)"
6296 return \$ ret
6397};
6498if ! [[ "\$ {PROMPT_COMMAND-}" =~ _pyenv_virtualenv_hook ]]; then
@@ -78,11 +112,45 @@ set -gx PATH '${TMP}/pyenv/plugins/pyenv-virtualenv/shims' \$PATH;
78112set -gx PYENV_VIRTUALENV_INIT 1;
79113function _pyenv_virtualenv_hook --on-event fish_prompt;
80114 set -l ret \$ status
115+ if test "\$ PYENV_VERSION" = "\$ _PYENV_VH_VERSION" \\
116+ -a "\$ VIRTUAL_ENV" = "\$ _PYENV_VH_VENV"
117+ if test -n "\$ PYENV_VERSION"
118+ return \$ ret
119+ end
120+ if test "\$ PWD" = "\$ _PYENV_VH_PWD" \\
121+ -a "(stat ${_stat_fmt} \$ _PYENV_VH_PATHS 2>/dev/null)" = "\$ _PYENV_VH_MTIMES"
122+ return \$ ret
123+ end
124+ end
81125 if [ -n "\$ VIRTUAL_ENV" ]
82126 pyenv activate --quiet; or pyenv deactivate --quiet; or true
83127 else
84128 pyenv activate --quiet; or true
85129 end
130+ set -g _PYENV_VH_PWD "\$ PWD"
131+ set -g _PYENV_VH_VERSION "\$ PYENV_VERSION"
132+ set -g _PYENV_VH_VENV "\$ VIRTUAL_ENV"
133+ set -l d "\$ PWD"
134+ set -l _pvh_found_local 0
135+ set -g _PYENV_VH_PATHS
136+ while true
137+ if test -f "\$ d/.python-version"; or test -L "\$ d/.python-version"
138+ set -g _PYENV_VH_PATHS \$ _PYENV_VH_PATHS "\$ d/.python-version"
139+ if test -f "\$ d/.python-version"
140+ set _pvh_found_local 1
141+ break
142+ end
143+ else
144+ set -g _PYENV_VH_PATHS \$ _PYENV_VH_PATHS "\$ d"
145+ end
146+ test "\$ d" = "/"; and break
147+ set d (string replace -r '/[^/]*\$ ' '' -- "\$ d")
148+ test -z "\$ d"; and set d "/"
149+ end
150+ if test "\$ _pvh_found_local" = "0"
151+ set -g _PYENV_VH_PATHS \$ _PYENV_VH_PATHS "\$ PYENV_ROOT/version"
152+ end
153+ set -g _PYENV_VH_MTIMES (stat ${_stat_fmt} \$ _PYENV_VH_PATHS 2>/dev/null)
86154 return \$ ret
87155end
88156EOS
@@ -97,11 +165,45 @@ export PATH="${TMP}/pyenv/plugins/pyenv-virtualenv/shims:\${PATH}";
97165export PYENV_VIRTUALENV_INIT=1;
98166_pyenv_virtualenv_hook() {
99167 local ret=\$ ?
168+ # Cache: env vars checked once, path list and stat rebuilt on miss only
169+ if [ "\$ {PYENV_VERSION-}" = "\$ {_PYENV_VH_VERSION-}" ] \\
170+ && [ "\$ {VIRTUAL_ENV-}" = "\$ {_PYENV_VH_VENV-}" ]; then
171+ if [ -n "\$ {PYENV_VERSION-}" ]; then
172+ return \$ ret
173+ fi
174+ if [ "\$ {PWD}" = "\$ {_PYENV_VH_PWD-}" ] \\
175+ && [ "\$ (stat ${_stat_fmt} "\$ {_PYENV_VH_PATHS[@]}" 2>/dev/null)" = "\$ {_PYENV_VH_MTIMES-}" ]; then
176+ return \$ ret
177+ fi
178+ fi
100179 if [ -n "\$ {VIRTUAL_ENV-}" ]; then
101180 eval "\$ (pyenv sh-activate --quiet || pyenv sh-deactivate --quiet || true)" || true
102181 else
103182 eval "\$ (pyenv sh-activate --quiet || true)" || true
104183 fi
184+ _PYENV_VH_PWD="\$ {PWD}"
185+ _PYENV_VH_VERSION="\$ {PYENV_VERSION-}"
186+ _PYENV_VH_VENV="\$ {VIRTUAL_ENV-}"
187+ local _pvh_d="\$ {PWD}" _pvh_found_local=0
188+ _PYENV_VH_PATHS=()
189+ while :; do
190+ if [ -f "\$ {_pvh_d}/.python-version" ] || [ -L "\$ {_pvh_d}/.python-version" ]; then
191+ _PYENV_VH_PATHS+=("\$ {_pvh_d}/.python-version")
192+ if [ -f "\$ {_pvh_d}/.python-version" ]; then
193+ _pvh_found_local=1
194+ break
195+ fi
196+ else
197+ _PYENV_VH_PATHS+=("\$ {_pvh_d}")
198+ fi
199+ [ "\$ {_pvh_d}" = "/" ] && break
200+ _pvh_d="\$ {_pvh_d%/*}"
201+ [ -z "\$ {_pvh_d}" ] && _pvh_d="/"
202+ done
203+ if [ "\$ {_pvh_found_local}" = "0" ]; then
204+ _PYENV_VH_PATHS+=("\$ {PYENV_ROOT}/version")
205+ fi
206+ _PYENV_VH_MTIMES="\$ (stat ${_stat_fmt} "\$ {_PYENV_VH_PATHS[@]}" 2>/dev/null)"
105207 return \$ ret
106208};
107209typeset -g -a precmd_functions
0 commit comments