From bf39d88d11ef341d0be5a845f170699bd40678c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Sun, 19 Oct 2014 14:34:27 +0200 Subject: [PATCH 1/3] Add tests for rbenv PATH and RBENV_HOOK_PATH handling --- test/libexec/rbenv-echo | 9 ++++++++- test/rbenv.bats | 23 +++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) 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..e7cea6f0 100644 --- a/test/rbenv.bats +++ b/test/rbenv.bats @@ -45,3 +45,26 @@ 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" +} From 632263568e637817e8efb0b460667f5a021f2dd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Thu, 16 Oct 2014 16:31:51 +0200 Subject: [PATCH 2/3] Add rbenv's own `rbenv.d` directory to hook paths This allows rbenv source code to ship with built-in hooks. --- libexec/rbenv | 13 +++++++++---- libexec/rbenv-realpath.dylib | Bin 8672 -> 0 bytes test/rbenv.bats | 5 +++++ 3 files changed, 14 insertions(+), 4 deletions(-) delete mode 100755 libexec/rbenv-realpath.dylib 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 c42aca38256af4e3c9531371636e35fb94e1bfe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8672 zcmeHNL2MgE6#Z@rN!vgi)I*?vrd3h}N;gIzQA8`*D2q0tL}?O4B`DLiJ*ihXYiD=e zBo!7#r3cF@#foo2c-Gd?Eml2 z%-fmgwX`$i@3#N^XAmGY008%5xgX2eJpk7sjS;|uSSI%YaK31sUkp?Im#A4UCoysY z(uAB;$$22w0*WF_@^$Wu@}J9k!uw?$y8Uo94mtOOTHfDHCHX$4iJ(0YIUt;pF}Weh zM{_2N_;^W_tHKL$|9rocd`8$BfH2C^vpdFD@B`0rFUc0k@%<(FK9ThbE5bf*Ombdx zR~@&=9e1e`;{Ng79Eo~bl7MiMLso^3b5Y_;p1mxhY;t^?l5b3QB23T7UPjN!DHNFV z>D*#2)=E7edw6XSNcBVnDerIH@>taQu8Dn z@2{R?;wIy~Xa{x_N4S5!8Of)<2f}^Naj$C_k#5wM^RqLvFPhUc>Nm#1YLGue0Et_u zF&T|Zh9Rb(&nYZ4k9giNrpiuUtck*umly8klb*24RXZpd#dWNJV*pn(#K59krO_)b zC_RaocrQv%&lJ_S5Yrf{N3ozkgk=s(+(<_%cboql_8*FOlJODrbf2F;-G1S{b7wN2 zjZd$9u=3&HIOb4NfCC4^^0>m3LmS3IP^vynPC$YQ9HGP+3^_1F>v8FD1ZM z0LQTq@B1to&tnqbL`-%93)K_OqSvMs&B&5qT~4p~jG8s=@QS--uxO!)gz>lSQ26NdFx!~Ah`f|_8F#KhBSzt!z_o90%-+-aIS z*0rxQ7rxr)PP~S6-HF%3>qWetz41s6U2dT}@g(|<64A8(z`iA#RQnf-9-`<6j3)ep zFzxu&vc1lPT_~}++@dv`d&y+Bcd524+~5i33BOXlj4L-5Ekm3FD?9ERzQGntf{8UJ zV18f+H6I+GWtg*+U|O|($svl*F}LELydt~`s{|$CtvbFiK)r(R28>?FU0jQ?S5;&f z#s!)R&Iul-04?t6-ImtKPot-z*1HtbJNGd5OozP@AkE>>VQ^(0Qfui{dU$YXgUA#1 zyivFt7d;od|Iv#RX&hdt>YE7S`XC|?NvYRwE|iJt$7lgfWk{4BlIldVE5UcG N`=!3)Tf=dY{R^K+djJ3c diff --git a/test/rbenv.bats b/test/rbenv.bats index e7cea6f0..5b52adc1 100644 --- a/test/rbenv.bats +++ b/test/rbenv.bats @@ -68,3 +68,8 @@ load test_helper 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" +} From 67f429c41de851052950ffdb372fda90a21a4356 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Thu, 16 Oct 2014 16:33:22 +0200 Subject: [PATCH 3/3] Bring automatic gem-rehash functionality to rbenv core This bakes in the functionality of rbenv-gem-rehash plugin. The Rubygems hook is improved: - It will not rehash for gems installed in locations that rbenv otherwise doesn't search for binstubs; for instance in case of `bundle --path vendor/bundle`. - It rescues exceptions and makes them non-lethal by warning on stderr. --- rbenv.d/exec/gem-rehash.bash | 1 + rbenv.d/exec/gem-rehash/rubygems_plugin.rb | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 rbenv.d/exec/gem-rehash.bash create mode 100644 rbenv.d/exec/gem-rehash/rubygems_plugin.rb 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