fix: pyenv-rehash | do NOT create conda_exclusion_list if conda is not installed.

I was doing some debugging with PYENV_DEBUG=1 and noticed that a lot of
work was being done in conda.bash, even though I had not installed any
conda versions like `mambaforge`.

The solution is pretty simple, put all the code inside an if-block.
This aligns with what @varikin found in his pull request #3037

Additionally, I have refactored the code slightly for readability
(created function `build_conda_exclusion_list`), and added comments
which should make it easier to understand what's going on.

This commit simplifies debugging and should reduce the execution time of

```bash
eval "$(pyenv init -)"
```

slightly.
This commit is contained in:
Christian Fredrik Johnsen 2024-12-23 14:47:36 +03:00 committed by Ivan Pozdeev
parent 4c6b0e9c3b
commit 09fbed1d4f

View File

@ -11,19 +11,35 @@ conda_exists() {
[ -n "${condas}" ] [ -n "${condas}" ]
} }
shims=() if conda_exists; then
shopt -s nullglob
for shim in $(cat "${BASH_SOURCE%/*}/conda.d/"*".list" | sort | uniq | sed -e 's/#.*$//' | sed -e '/^[[:space:]]*$/d'); do # Reads the list of `blacklisted` conda binaries
# from `conda.d/default.list` and creates a function
# `conda_shim` to skip creating shims for those binaries.
build_conda_exclusion_list() {
shims=()
shopt -s nullglob
for shim in $(cat "${BASH_SOURCE%/*}/conda.d/"*".list" | sort -u | sed -e 's/#.*$//' | sed -e '/^[[:space:]]*$/d'); do
if [ -n "${shim##*/}" ]; then if [ -n "${shim##*/}" ]; then
shims[${#shims[*]}]="${shim})return 0;;" shims[${#shims[*]}]="${shim})return 0;;"
fi fi
done done
shopt -u nullglob shopt -u nullglob
eval "conda_shim(){ case \"\${1##*/}\" in ${shims[@]} *)return 1;;esac;}" eval \
"conda_shim() {
case \"\${1##*/}\" in
${shims[@]}
*) return 1;;
esac
}"
}
# override `make_shims` to avoid conflict between pyenv-virtualenv's `envs.bash` # override `make_shims` to avoid conflict between pyenv-virtualenv's `envs.bash`
# https://github.com/pyenv/pyenv-virtualenv/blob/v20160716/etc/pyenv.d/rehash/envs.bash # https://github.com/pyenv/pyenv-virtualenv/blob/v20160716/etc/pyenv.d/rehash/envs.bash
make_shims() { # The only difference between this `make_shims` and the `make_shims` defined
# in `libexec/pyenv-rehash` is that this one calls `conda_shim` to check
# if shim is blacklisted. If blacklisted -> skip creating shim.
make_shims() {
local file shim local file shim
for file do for file do
shim="${file##*/}" shim="${file##*/}"
@ -31,9 +47,9 @@ make_shims() {
register_shim "$shim" register_shim "$shim"
fi fi
done done
} }
deregister_conda_shims() { deregister_conda_shims() {
# adapted for Bash 4.x's associative array (#1749) # adapted for Bash 4.x's associative array (#1749)
if declare -p registered_shims 2> /dev/null | grep -Eq '^(declare|typeset) -A'; then if declare -p registered_shims 2> /dev/null | grep -Eq '^(declare|typeset) -A'; then
for shim in ${!registered_shims[*]}; do for shim in ${!registered_shims[*]}; do
@ -51,8 +67,8 @@ deregister_conda_shims() {
done done
registered_shims=" ${shims[@]} " registered_shims=" ${shims[@]} "
fi fi
} }
if conda_exists; then build_conda_exclusion_list
deregister_conda_shims deregister_conda_shims
fi fi