Skip to content

Instantly share code, notes, and snippets.

@steinybot
Created May 13, 2020 01:02
Show Gist options
  • Select an option

  • Save steinybot/948a07d2f8f3bb0c307357ace54337e9 to your computer and use it in GitHub Desktop.

Select an option

Save steinybot/948a07d2f8f3bb0c307357ace54337e9 to your computer and use it in GitHub Desktop.
Direnv configuration that actually works
use_nvm() {
local nvm_sh
if [[ -n ${NVM_DIR} && -e "$NVM_DIR/nvm.sh" ]]; then
nvm_sh="$NVM_DIR/nvm.sh"
elif [[ -e '~/.nvm/nvm.sh' ]]; then
nvm_sh='~/.nvm/nvm.sh'
elif [[ -e '/usr/local/opt/nvm/nvm.sh' ]]; then
nvm_sh='/usr/local/opt/nvm/nvm.sh'
else
>&2 echo 'ERROR: nvm.sh not found.'
return 1
fi
source "$nvm_sh"
nvm use
}
# https://github.com/direnv/direnv/wiki/Python#pyenv-virtualenv
# use a certain pyenv version
use_python() {
local python_version="$1"
pyenv local "${python_version}"
}
# https://github.com/direnv/direnv/wiki/Python#pyenv
layout_pyenv() {
unset PYENV_VERSION
# Because each python version is prepended to the PATH, add them in reverse order
for ((j = $#; j >= 1; j--)); do
local python_version=${!j}
local pyenv_python=$(pyenv root)/versions/${python_version}/bin/python
if [[ ! -x "$pyenv_python" ]]; then
log_error "Error: $pyenv_python can't be executed."
return 1
fi
unset PYTHONHOME
local ve=$(${pyenv_python} -c "import pkgutil; print('venv' if pkgutil.find_loader('venv') else ('virtualenv' if pkgutil.find_loader('virtualenv') else ''))")
case ${ve} in
"venv")
layout_venv "$python_version" "$pyenv_python"
;;
"virtualenv")
#layout_python "$pyenv_python"
layout_virtualenv "$pyenv_python"
;;
*)
log_error "Error: neither venv nor virtualenv are available to ${pyenv_python}."
return 1
;;
esac
# e.g. Given "use pyenv 3.6.9 2.7.16", PYENV_VERSION becomes "3.6.9:2.7.16"
[[ -z "${PYENV_VERSION-}" ]] && PYENV_VERSION=${python_version} || PYENV_VERSION="${python_version}:$PYENV_VERSION"
done
export PYENV_VERSION
}
layout_venv() {
local python_version="$1"
local python="${2:-python}"
local virtual_env="$(direnv_layout_dir)/python-$python_version"
if [[ ! -d "${virtual_env}" ]]; then
"${python}" -m venv "${virtual_env}"
add_python_link "${python_version}" "${virtual_env}/bin"
fi
}
layout_virtualenv() {
local python_version="$1"
local pvenv="$2"
name="${pvenv}-${python_version}"
local virtual_env="$(pyenv root)/versions/${python_version}/envs/${name}"
if [[ ! -d "${virtual_env}" ]]; then
pyenv virtualenv --quiet "${python_version}" "${name}"
add_python_link "${python_version}" "${virtual_env}/bin"
fi
}
add_python_link() {
local python_version="$1"
local bin_dir="$2"
if [[ "${python_version}" =~ ^([0-9]+\.[0-9]+)\. ]]; then
local major_minor_version="${BASH_REMATCH[1]}"
local python_link="${bin_dir}/python${major_minor_version}"
[[ -f "${python_link}" ]] || ln -s python "${python_link}"
fi
}
layout_activate() {
local python_version="$1"
pyenv local --unset
if [[ -d "$(direnv_layout_dir)/python-${python_version}" ]]; then
source "$(direnv_layout_dir)/python-${python_version}/bin/activate"
elif [[ -n "$(which pyenv)" ]]; then
source "$(pyenv root)/versions/${python_version}/bin/activate"
fi
}
# Workaround for https://github.com/sdkman/sdkman-cli/issues/597
set +u
source "${HOME}/.sdkman/bin/sdkman-init.sh"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment