Skip to content

Instantly share code, notes, and snippets.

@fledman
Last active July 19, 2019 05:24
Show Gist options
  • Save fledman/96b48d6ff42ea20e554d2a001311ef1c to your computer and use it in GitHub Desktop.
Save fledman/96b48d6ff42ea20e554d2a001311ef1c to your computer and use it in GitHub Desktop.
joint auto switching for postmodern ruby tools chruby and gem_home (ZSH)
source /usr/local/share/chruby/chruby.sh
source /usr/local/share/gem_home/gem_home.sh
unset RUBY_SWITCH_DEFAULT
unset RUBY_SWITCH_CURRENT
unset RUBY_SWITCH_GEMHOME
RUBY_SWITCH_DEFAULT=$(cat ~/.ruby-switch-default)
if [[ -z "$RUBY_SWITCH_DEFAULT" ]]; then
RUBY_SWITCH_DEFAULT="system"
fi
chruby "$RUBY_SWITCH_DEFAULT"
function __ruby_switch_check_gemset() {
if [ -f "$1/.ruby-gemset" ]; then
local real
if [ -d "$1/.gem" ]; then
real=$(realpath "$1/.gem/..")
else
real=$(realpath "$1")
fi
if [[ "$real" != "$RUBY_SWITCH_GEMHOME" ]]; then
__ruby_switch_revert_gemset
RUBY_SWITCH_GEMHOME="$real"
gem_home "$real"
fi
else
__ruby_switch_revert_gemset
fi
}
function __ruby_switch_revert_gemset() {
if [[ -n "$RUBY_SWITCH_GEMHOME" ]]; then
unset RUBY_SWITCH_GEMHOME
gem_home -
fi
}
function ruby_switch_auto() {
local dir="$PWD/" version
until [[ -z "$dir" ]]; do
dir="${dir%/*}"
if { read -r version <"$dir/.ruby-version"; } 2>/dev/null || [[ -n "$version" ]]; then
version="${version%%[[:space:]]}"
if [[ "$version" == "$RUBY_SWITCH_CURRENT" ]]; then
__ruby_switch_check_gemset "$dir"
return
else
__ruby_switch_revert_gemset
RUBY_SWITCH_CURRENT="$version"
chruby "$version"
local retval=$?
if (( $retval != 0 )); then return $retval; fi
__ruby_switch_check_gemset "$dir"
return $retval
fi
fi
done
if [[ -n "$RUBY_SWITCH_CURRENT" ]]; then
__ruby_switch_revert_gemset
unset RUBY_SWITCH_CURRENT
chruby "$RUBY_SWITCH_DEFAULT"
return $?
fi
}
if [[ ! "$precmd_functions" == *ruby_switch_auto* ]]; then
precmd_functions+=("ruby_switch_auto")
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment