2011-08-12 05:33:45 -04:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
set -e
|
2011-08-02 19:01:46 -04:00
|
|
|
|
2013-01-23 20:06:08 -05:00
|
|
|
if [ "$1" = "--debug" ]; then
|
|
|
|
export RBENV_DEBUG=1
|
|
|
|
shift
|
|
|
|
fi
|
2013-01-23 20:05:26 -05:00
|
|
|
|
|
|
|
if [ -n "$RBENV_DEBUG" ]; then
|
2023-05-13 03:14:21 -04:00
|
|
|
# https://web.archive.org/web/20221105082147/https://wiki-dev.bash-hackers.org/scripting/debuggingtips#making_xtrace_more_useful
|
2021-02-10 14:46:08 -05:00
|
|
|
export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
|
2013-01-23 20:05:26 -05:00
|
|
|
set -x
|
|
|
|
fi
|
2013-01-23 20:06:08 -05:00
|
|
|
|
2015-11-17 15:30:33 -05:00
|
|
|
abort() {
|
|
|
|
{ if [ "$#" -eq 0 ]; then cat -
|
|
|
|
else echo "rbenv: $*"
|
|
|
|
fi
|
|
|
|
} >&2
|
|
|
|
exit 1
|
|
|
|
}
|
|
|
|
|
2011-09-11 13:05:56 -04:00
|
|
|
if [ -z "${RBENV_ROOT}" ]; then
|
|
|
|
RBENV_ROOT="${HOME}/.rbenv"
|
2011-09-14 13:45:44 -04:00
|
|
|
else
|
|
|
|
RBENV_ROOT="${RBENV_ROOT%/}"
|
2011-09-11 13:05:56 -04:00
|
|
|
fi
|
|
|
|
export RBENV_ROOT
|
2011-08-25 03:24:44 -04:00
|
|
|
|
2011-09-27 16:50:39 -04:00
|
|
|
if [ -z "${RBENV_DIR}" ]; then
|
2015-11-17 15:09:09 -05:00
|
|
|
RBENV_DIR="$PWD"
|
2011-10-01 13:15:20 -04:00
|
|
|
else
|
2017-11-29 09:51:03 -05:00
|
|
|
[[ $RBENV_DIR == /* ]] || RBENV_DIR="$PWD/$RBENV_DIR"
|
2015-11-17 15:30:33 -05:00
|
|
|
cd "$RBENV_DIR" 2>/dev/null || abort "cannot change working directory to \`$RBENV_DIR'"
|
2015-11-17 15:09:09 -05:00
|
|
|
RBENV_DIR="$PWD"
|
2011-12-25 16:41:15 -05:00
|
|
|
cd "$OLDPWD"
|
2011-09-27 16:50:39 -04:00
|
|
|
fi
|
|
|
|
export RBENV_DIR
|
|
|
|
|
Have shims survive symlinked rbenv updates a la Homebrew
Homebrew places the rbenv executable in a location such as
`/usr/local/bin/rbenv`, which is in PATH. However, that is a symlink to
`/usr/local/Cellar/rbenv/<VERSION>/bin/rbenv`, which is itself a symlink to
`/usr/local/Cellar/rbenv/<VERSION>/libexec/rbenv`. Upon executing, rbenv
will add its own directory to PATH so that it can easily invoke its
subcommands.
When generating shims during `rbenv rehash`, rbenv will try to put the
absolute path to itself inside each shim so that shims would work even
if rbenv itself isn't in PATH. Under Homebrew, rbenv's directory will be
the versioned directory in Homebrew's Cellar. However, due to Homebrew's
auto-cleanup functionality, shims generated this way will be broken
after upgrading rbenv because of the versioned Cellar path.
This changes how rbenv discovers itself in PATH: it will look at the
original PATH, not in the one modified by rbenv, with the intention of
excluding results under rbenv's own `libexec/`. If rbenv wasn't found in
PATH, return the absolute path to rbenv's own `bin/rbenv`.
2021-09-29 11:50:03 -04:00
|
|
|
[ -n "$RBENV_ORIG_PATH" ] || export RBENV_ORIG_PATH="$PATH"
|
2011-09-21 14:00:23 -04:00
|
|
|
|
2023-02-15 11:09:20 -05:00
|
|
|
canonicalize() {
|
|
|
|
local readlink resolved_path
|
2022-09-30 06:29:49 -04:00
|
|
|
if readlink="$(type -P greadlink)" || readlink="$(type -P readlink)"; then
|
2023-02-15 11:09:20 -05:00
|
|
|
# happy path: GNU & BSD readlink, macOS 12.3+
|
|
|
|
if resolved_path="$("$readlink" -f "$1" 2>/dev/null)"; then
|
|
|
|
printf "%s\n" "$resolved_path"
|
|
|
|
return 0
|
2022-09-29 09:27:17 -04:00
|
|
|
fi
|
2023-02-15 11:09:20 -05:00
|
|
|
# likely macOS < 12.3 with old readlink
|
|
|
|
local path="$1"
|
|
|
|
while [ -L "$path" ]; do
|
|
|
|
resolved_path="$("$readlink" "$path" 2>/dev/null)"
|
|
|
|
[[ $resolved_path == /* ]] || resolved_path="$(cd "${path%/*}/${resolved_path%/*}" && pwd)/${resolved_path##*/}"
|
|
|
|
path="$resolved_path"
|
|
|
|
done
|
|
|
|
printf "%s\n" "$path"
|
|
|
|
return 0
|
2022-09-29 09:27:17 -04:00
|
|
|
fi
|
2023-02-15 11:09:20 -05:00
|
|
|
# fail if the argument is a symlink and was not canonicalized
|
|
|
|
[ ! -L "$1" ] || return 1
|
|
|
|
}
|
|
|
|
|
|
|
|
shopt -s nullglob
|
|
|
|
|
|
|
|
# all this trouble just to find out where rbenv's executables live
|
|
|
|
rbenv_bin="${BASH_SOURCE:-$0}"
|
|
|
|
if libexec_dir="$(canonicalize "$rbenv_bin")"; then
|
|
|
|
libexec_dir="${libexec_dir%/*}"
|
2022-09-29 09:27:17 -04:00
|
|
|
else
|
|
|
|
libexec_dir="${rbenv_bin%/*}"
|
2023-02-15 11:09:20 -05:00
|
|
|
[ "$libexec_dir" != "." ] || libexec_dir="$PWD"
|
2022-09-29 09:27:17 -04:00
|
|
|
fi
|
|
|
|
|
2011-09-23 11:44:00 -04:00
|
|
|
for plugin_bin in "${RBENV_ROOT}/plugins/"*/bin; do
|
2014-10-16 10:31:51 -04:00
|
|
|
PATH="${plugin_bin}:${PATH}"
|
2011-09-23 11:44:00 -04:00
|
|
|
done
|
2022-09-29 09:27:17 -04:00
|
|
|
export PATH="${libexec_dir}:${PATH}"
|
2011-09-23 11:44:00 -04:00
|
|
|
|
2014-10-16 10:31:51 -04:00
|
|
|
RBENV_HOOK_PATH="${RBENV_HOOK_PATH}:${RBENV_ROOT}/rbenv.d"
|
2022-09-29 09:27:17 -04:00
|
|
|
if [ ! "${libexec_dir%/*}"/rbenv.d -ef "$RBENV_ROOT"/rbenv.d ]; then
|
2014-10-16 10:31:51 -04:00
|
|
|
# Add rbenv's own `rbenv.d` unless rbenv was cloned to RBENV_ROOT
|
2022-09-29 09:27:17 -04:00
|
|
|
RBENV_HOOK_PATH="${RBENV_HOOK_PATH}:${libexec_dir%/*}/rbenv.d"
|
2014-10-16 10:31:51 -04:00
|
|
|
fi
|
|
|
|
RBENV_HOOK_PATH="${RBENV_HOOK_PATH}:/usr/local/etc/rbenv.d:/etc/rbenv.d:/usr/lib/rbenv/hooks"
|
2011-09-23 11:47:45 -04:00
|
|
|
for plugin_hook in "${RBENV_ROOT}/plugins/"*/etc/rbenv.d; do
|
2014-10-16 10:31:51 -04:00
|
|
|
RBENV_HOOK_PATH="${RBENV_HOOK_PATH}:${plugin_hook}"
|
2011-09-23 11:47:45 -04:00
|
|
|
done
|
2015-12-24 12:33:39 -05:00
|
|
|
RBENV_HOOK_PATH="${RBENV_HOOK_PATH#:}"
|
2014-10-16 10:31:51 -04:00
|
|
|
export RBENV_HOOK_PATH
|
2011-09-23 11:47:45 -04:00
|
|
|
|
|
|
|
shopt -u nullglob
|
2011-09-23 11:44:00 -04:00
|
|
|
|
2011-08-02 19:01:46 -04:00
|
|
|
|
|
|
|
command="$1"
|
2011-08-14 14:51:51 -04:00
|
|
|
case "$command" in
|
2015-11-18 19:52:48 -05:00
|
|
|
"" )
|
|
|
|
{ rbenv---version
|
|
|
|
rbenv-help
|
2015-11-17 15:30:33 -05:00
|
|
|
} | abort
|
2012-12-12 18:40:29 -05:00
|
|
|
;;
|
2015-11-17 14:46:02 -05:00
|
|
|
-v | --version )
|
2012-12-12 18:40:29 -05:00
|
|
|
exec rbenv---version
|
2011-08-14 09:30:13 -04:00
|
|
|
;;
|
2015-11-18 19:52:48 -05:00
|
|
|
-h | --help )
|
|
|
|
exec rbenv-help
|
|
|
|
;;
|
2011-08-14 14:51:51 -04:00
|
|
|
* )
|
2022-10-07 10:34:38 -04:00
|
|
|
command_path="$(type -P "rbenv-$command" || true)"
|
2017-03-23 09:47:12 -04:00
|
|
|
if [ -z "$command_path" ]; then
|
|
|
|
if [ "$command" == "shell" ]; then
|
|
|
|
abort "shell integration not enabled. Run \`rbenv init' for instructions."
|
|
|
|
else
|
|
|
|
abort "no such command \`$command'"
|
|
|
|
fi
|
|
|
|
fi
|
2011-08-02 19:01:46 -04:00
|
|
|
|
|
|
|
shift 1
|
2015-11-17 14:51:10 -05:00
|
|
|
if [ "$1" = --help ]; then
|
2016-06-30 20:08:19 -04:00
|
|
|
if [[ "$command" == "sh-"* ]]; then
|
2016-07-03 20:56:08 -04:00
|
|
|
echo "rbenv help \"$command\""
|
2016-06-30 20:08:19 -04:00
|
|
|
else
|
|
|
|
exec rbenv-help "$command"
|
|
|
|
fi
|
2015-11-17 14:51:10 -05:00
|
|
|
else
|
|
|
|
exec "$command_path" "$@"
|
|
|
|
fi
|
2011-08-14 09:30:13 -04:00
|
|
|
;;
|
|
|
|
esac
|