From 23a42cda46d65397872f62ee9b8b10549e29ebea Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Mon, 7 Sep 2026 18:09:09 -0700 Subject: [PATCH] Cleans up ruby script. --- .rc.d/ruby.sh | 106 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 100 insertions(+), 6 deletions(-) diff --git a/.rc.d/ruby.sh b/.rc.d/ruby.sh index 28d7385..ae13101 100755 --- a/.rc.d/ruby.sh +++ b/.rc.d/ruby.sh @@ -1,6 +1,100 @@ -# Ruby -if [[ $(command -v rbenv) ]]; then - eval "$(rbenv init -)" - export PATH="$HOME/.gem/ruby/3.0.0/bin:$PATH" - export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$(brew --prefix openssl@1.1)" -fi +# Setup Ruby environment: version managers (rbenv, chruby, rvm), Homebrew Ruby, and gem bin paths +_setup_ruby() { + [ -n "$ZSH_VERSION" ] && setopt localoptions nonomatch nullglob + + _add_to_path() { + [ -d "$1" ] || return 0 + case ":$PATH:" in + *":$1:"*) ;; + *) PATH="$1:$PATH"; export PATH ;; + esac + } + + _ruby_manager_active=0 + + # 1. Check for rbenv (prefer managed Ruby) + if [ -d "$HOME/.rbenv/bin" ]; then + _add_to_path "$HOME/.rbenv/bin" + fi + if command -v rbenv >/dev/null 2>&1; then + eval "$(rbenv init - 2>/dev/null)" + _ruby_manager_active=1 + + # Fast OpenSSL detection for ruby-build without calling slow `brew --prefix` + if [ -z "$RUBY_CONFIGURE_OPTS" ]; then + for _ssl_dir in \ + "/opt/homebrew/opt/openssl@3" \ + "/opt/homebrew/opt/openssl@1.1" \ + "/usr/local/opt/openssl@3" \ + "/usr/local/opt/openssl@1.1" + do + if [ -d "$_ssl_dir" ]; then + export RUBY_CONFIGURE_OPTS="--with-openssl-dir=$_ssl_dir" + break + fi + done + fi + fi + + # 2. Check for chruby + if [ "$_ruby_manager_active" -eq 0 ]; then + for _chruby_sh in \ + "/opt/homebrew/opt/chruby/share/chruby/chruby.sh" \ + "/usr/local/share/chruby/chruby.sh" \ + "/usr/share/chruby/chruby.sh" + do + if [ -r "$_chruby_sh" ]; then + \. "$_chruby_sh" + [ -r "${_chruby_sh%/*}/auto.sh" ] && \. "${_chruby_sh%/*}/auto.sh" + _ruby_manager_active=1 + break + fi + done + fi + + # 3. Check for RVM + if [ "$_ruby_manager_active" -eq 0 ]; then + if [ -s "$HOME/.rvm/scripts/rvm" ]; then + \. "$HOME/.rvm/scripts/rvm" + _ruby_manager_active=1 + fi + fi + + # 4. If no version manager is active, fallback to Homebrew keg-only Ruby or standard locations + # (Avoids Apple's deprecated /usr/bin/ruby on macOS when Homebrew Ruby is installed) + if [ "$_ruby_manager_active" -eq 0 ]; then + for _brew_ruby in $( + for _r in /opt/homebrew/opt/ruby/bin \ + /opt/homebrew/opt/ruby@*/bin \ + /usr/local/opt/ruby/bin \ + /usr/local/opt/ruby@*/bin; do + [ -x "$_r/ruby" ] && echo "$_r" + done | sort -V -r 2>/dev/null + ); do + _add_to_path "$_brew_ruby" + break + done + fi + + # 5. Add user gem binaries to PATH (dynamically resolved, not hardcoded to a fixed version) + if command -v ruby >/dev/null 2>&1; then + _gem_user_bin="$(ruby -e 'puts Gem.user_dir' 2>/dev/null)/bin" + if [ -n "$_gem_user_bin" ] && [ -d "$_gem_user_bin" ]; then + _add_to_path "$_gem_user_bin" + fi + unset _gem_user_bin + + for _gbin in $( + for _gd in "$HOME/.gem/ruby"/*/bin "$HOME/.local/share/gem/ruby"/*/bin; do + [ -d "$_gd" ] && echo "$_gd" + done | sort -V -r 2>/dev/null + ); do + _add_to_path "$_gbin" + break + done + fi + + unset _ruby_manager_active +} +_setup_ruby +unset -f _setup_ruby _add_to_path