diff --git a/libexec/rbenv b/libexec/rbenv index 4041df82..de7ea692 100755 --- a/libexec/rbenv +++ b/libexec/rbenv @@ -71,15 +71,20 @@ shopt -s nullglob bin_path="$(abs_dirname "$0")" for plugin_bin in "${RBENV_ROOT}/plugins/"*/bin; do - bin_path="${bin_path}:${plugin_bin}" + PATH="${plugin_bin}:${PATH}" done export PATH="${bin_path}:${PATH}" -hook_path="${RBENV_HOOK_PATH}:${RBENV_ROOT}/rbenv.d:/usr/local/etc/rbenv.d:/etc/rbenv.d:/usr/lib/rbenv/hooks" +RBENV_HOOK_PATH="${RBENV_HOOK_PATH}:${RBENV_ROOT}/rbenv.d" +if [ "${bin_path%/*}" != "$RBENV_ROOT" ]; then + # Add rbenv's own `rbenv.d` unless rbenv was cloned to RBENV_ROOT + RBENV_HOOK_PATH="${RBENV_HOOK_PATH}:${bin_path%/*}/rbenv.d" +fi +RBENV_HOOK_PATH="${RBENV_HOOK_PATH}:/usr/local/etc/rbenv.d:/etc/rbenv.d:/usr/lib/rbenv/hooks" for plugin_hook in "${RBENV_ROOT}/plugins/"*/etc/rbenv.d; do - hook_path="${hook_path}:${plugin_hook}" + RBENV_HOOK_PATH="${RBENV_HOOK_PATH}:${plugin_hook}" done -export RBENV_HOOK_PATH="$hook_path" +export RBENV_HOOK_PATH shopt -u nullglob diff --git a/libexec/rbenv-realpath.dylib b/libexec/rbenv-realpath.dylib deleted file mode 100755 index c42aca38..00000000 Binary files a/libexec/rbenv-realpath.dylib and /dev/null differ diff --git a/rbenv.d/exec/gem-rehash.bash b/rbenv.d/exec/gem-rehash.bash new file mode 100644 index 00000000..99614b53 --- /dev/null +++ b/rbenv.d/exec/gem-rehash.bash @@ -0,0 +1 @@ +export RUBYLIB="${BASH_SOURCE%.bash}:$RUBYLIB" diff --git a/rbenv.d/exec/gem-rehash/rubygems_plugin.rb b/rbenv.d/exec/gem-rehash/rubygems_plugin.rb new file mode 100644 index 00000000..e1d7b262 --- /dev/null +++ b/rbenv.d/exec/gem-rehash/rubygems_plugin.rb @@ -0,0 +1,18 @@ +hook = lambda do |installer| + begin + # Ignore gems that aren't installed in locations that rbenv searches for binstubs + if installer.spec.executables.any? && + [Gem.default_bindir, Gem.bindir(Gem.user_dir)].include?(installer.bin_dir) + system "rbenv", "rehash" + end + rescue + warn "rbenv: error in gem-rehash (#{$!})" + end +end + +begin + Gem.post_install(&hook) + Gem.post_uninstall(&hook) +rescue + warn "rbenv: error installing gem-rehash hooks (#{$!})" +end diff --git a/test/libexec/rbenv-echo b/test/libexec/rbenv-echo index 0a802df4..a94af7bb 100755 --- a/test/libexec/rbenv-echo +++ b/test/libexec/rbenv-echo @@ -1,2 +1,9 @@ #!/usr/bin/env bash -eval "echo \$$1" +# Usage: rbenv echo [-F] VAR + +if [[ $1 == -F* ]]; then + sep="${1:2}" + echo "${!2}" | tr "${sep:-:}" $'\n' +else + echo "${!1}" +fi diff --git a/test/rbenv.bats b/test/rbenv.bats index e8a939af..5b52adc1 100644 --- a/test/rbenv.bats +++ b/test/rbenv.bats @@ -45,3 +45,31 @@ load test_helper assert_failure assert_output "rbenv: cannot change working directory to \`$dir'" } + +@test "adds its own libexec to PATH" { + run rbenv echo "PATH" + assert_success "${BATS_TEST_DIRNAME%/*}/libexec:$PATH" +} + +@test "adds plugin bin dirs to PATH" { + mkdir -p "$RBENV_ROOT"/plugins/ruby-build/bin + mkdir -p "$RBENV_ROOT"/plugins/rbenv-each/bin + run rbenv echo -F: "PATH" + assert_success + assert_line 0 "${BATS_TEST_DIRNAME%/*}/libexec" + assert_line 1 "${RBENV_ROOT}/plugins/ruby-build/bin" + assert_line 2 "${RBENV_ROOT}/plugins/rbenv-each/bin" +} + +@test "RBENV_HOOK_PATH preserves value from environment" { + RBENV_HOOK_PATH=/my/hook/path:/other/hooks run rbenv echo -F: "RBENV_HOOK_PATH" + assert_success + assert_line 0 "/my/hook/path" + assert_line 1 "/other/hooks" + assert_line 2 "${RBENV_ROOT}/rbenv.d" +} + +@test "RBENV_HOOK_PATH includes rbenv built-in plugins" { + run rbenv echo "RBENV_HOOK_PATH" + assert_success ":${RBENV_ROOT}/rbenv.d:${BATS_TEST_DIRNAME%/*}/rbenv.d:/usr/local/etc/rbenv.d:/etc/rbenv.d:/usr/lib/rbenv/hooks" +}