From c4de2555b7343c95a3380dece3098eaf3baa4e73 Mon Sep 17 00:00:00 2001 From: Andrew Christianson Date: Thu, 13 Oct 2022 18:37:08 -0700 Subject: [PATCH] Use realpath of scripts to determine relative locations (#308) Just using paths relative to ${BASH_SOURCE} to access `libexec` fails if the scripts are symlinked to a location, such as when installed with Homebrew, since the `libexec` directory is not linked into `brew --prefix`. Implement a simple version of `realpath` and run `${BASH_SOURCE}` through it. This gets the actual installation directory relative to which `libexec` is located. Co-authored-by: Andrew Christianson --- bin/pyenv-virtualenv-prefix | 16 +++++++++++++++- bin/pyenv-virtualenvs | 16 +++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/bin/pyenv-virtualenv-prefix b/bin/pyenv-virtualenv-prefix index aa71777d..bbe58719 100755 --- a/bin/pyenv-virtualenv-prefix +++ b/bin/pyenv-virtualenv-prefix @@ -6,7 +6,21 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -. "${BASH_SOURCE%/*}"/../libexec/pyenv-virtualenv-realpath +if [ -L "${BASH_SOURCE}" ]; then + READLINK=$(type -p greadlink readlink | head -1) + if [ -z "$READLINK" ]; then + echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2 + exit 1 + fi + resolve_link() { + $READLINK -f "$1" + } + script_path=$(resolve_link ${BASH_SOURCE}) +else + script_path=${BASH_SOURCE} +fi + +. ${script_path%/*}/../libexec/pyenv-virtualenv-realpath if [ -z "$PYENV_ROOT" ]; then PYENV_ROOT="${HOME}/.pyenv" diff --git a/bin/pyenv-virtualenvs b/bin/pyenv-virtualenvs index f9426bb5..fec12868 100755 --- a/bin/pyenv-virtualenvs +++ b/bin/pyenv-virtualenvs @@ -7,7 +7,21 @@ set -e [ -n "$PYENV_DEBUG" ] && set -x -. "${BASH_SOURCE%/*}"/../libexec/pyenv-virtualenv-realpath +if [ -L "${BASH_SOURCE}" ]; then + READLINK=$(type -p greadlink readlink | head -1) + if [ -z "$READLINK" ]; then + echo "pyenv: cannot find readlink - are you missing GNU coreutils?" >&2 + exit 1 + fi + resolve_link() { + $READLINK -f "$1" + } + script_path=$(resolve_link ${BASH_SOURCE}) +else + script_path=${BASH_SOURCE} +fi + +. ${script_path%/*}/../libexec/pyenv-virtualenv-realpath if [ -z "$PYENV_ROOT" ]; then PYENV_ROOT="${HOME}/.pyenv"