Skip to content

Instantly share code, notes, and snippets.

@zendeavor
Created October 3, 2013 06:23
Show Gist options
  • Save zendeavor/6805824 to your computer and use it in GitHub Desktop.
Save zendeavor/6805824 to your computer and use it in GitHub Desktop.
function chrubylib_set_color {
if [[ -t 1 || -t 2 ]]; then
if tput setaf 0 >/dev/null 2>&1; then
chruby_coff=$(tput sgr0)
chruby_bold=$(tput bold)
chruby_red=${chruby_bold}$(tput af 1)
chruby_green=${chruby_bold}$(tput af 2)
chruby_yellow=${chruby_bold}$(tput af 3)
chruby_blue=${chruby_bold}$(tput af 4)
else
chruby_coff="\e[1;0m"
chruby_bold="\e[1;1m"
chruby_red="${chruby_bold}\e[1;31m"
chruby_green="${chruby_bold}\e[1;32m"
chruby_yellow="${chruby_bold}\e[1;33m"
chruby_blue="${chruby_bold}\e[1;34m"
fi
fi
}
function chrubylib_split_colon_list {
typeset lists=''
typeset elems=()
typeset out=()
for lists; do
elems=("${lists%%:*}")
until [[ $lists == "${elems[${#elems[@]}-1]}" ]]; do
lists=${lists#*:}
elems+=("${lists%%:*}")
done
out+=("${elems[@]}")
done
printf '%s\n' "${out[@]}"
}
function chrubylib_clean_env_paths {
typeset tail=${1:-/bin}
typeset list=$2
typeset paths=''
eval "$list=:\$$list:"
while IFS= read -r paths; do
eval "$list=\${$list//:\$paths\$tail:/:}"
done < <(chrubylib_split_colon_list "${@:3}")
eval "$list=\${list#:}"
eval "$list=\${list%:}"
eval [[ "\$$list" != \"$list\" ]]
}
function chrubylib_set_env_paths {
typeset tail=${1:-/bin}
typeset list=$2
while IFS= read -r paths; do
eval "$list=\$paths\$tail:\$$list"
done < <(chrubylib_split_colon_list "${@:3}")
eval [[ "\$$list" != \"$list\" ]]
}
function chrubylib_fuzzy_match {
{ setopt local_options ksh_arrays; } 2>/dev/null
typeset match=''
typeset ruby=$1
typeset rb=${#rubies[*]}
while (( --rb >= 0 )); do
if [[ ${rubies[rb]} == *$ruby* ]]; then
match=${rubies[rb]}
break
fi
done
if [[ -n $match ]]; then
chrubylib_set_env "$match" "${@:2}"
else
printf '%s\n' "No ruby found for '$ruby'" >&2
return 2
fi
}
function chrubylib_set_env_ruby_info {
typeset e=0
typeset ruby_root=$1
typeset ruby_opt=${1:-${*:2}}
typeset old_ruby_root=$RUBY_ROOT
typeset old_ruby_opt=$RUBYOPT
RUBY_ROOT=${ruby_root:-$def_ruby_root}
RUBYOPT=${ruby_opt:-$RUBYOPT}
[[ $RUBY_ROOT != "$old_ruby_root" ]] || e=1
[[ $RUBYOPT != "$old_ruby_opt" ]] || e+=2
return $e
}
function chrubylib_set_env_ruby_versinfo {
{ setopt local_options ksh_arrays; } 2>/dev/null
typeset env=''
typeset old_ruby_versinfo=${RUBY_VERSINFO[@]}
while IFS= read -r env; do
eval "$env"
done < <("$RUBY_ROOT"/bin/ruby - <<'EOR'
eng = defined?(RUBY_ENGINE) ? RUBY_ENGINE : 'ruby'
(RUBY_VERSION.split('.') + [RUBY_PATCHLEVEL, RUBY_REVISION, eng, RUBY_PLATFORM]
).each_with_index { |v, i| puts "RUBY_VERSINFO[#{i}]=#{v}" }
EOR
)
[[ ${RUBY_VERSINFO[@]} != "$old_ruby_versinfo" ]]
}
function chrubylib_set_default {
def_ruby_root=$(PATH=/usr/local/bin:/usr/bin:/bin command -v ruby)
def_ruby_root=${def_ruby_root%/bin/*}
chrubylib_set_env "$def_ruby_root"
}
function chrubylib_set_default_rubies {
{ setopt local_options no_nomatch; } 2>/dev/null
typeset dir=''
rubies=()
for dir in "$HOME"/.rubies/*; do
if [[ -e $dir && -x $dir/bin/ruby ]]; then
rubies+=("$dir")
fi
done
[[ -n ${rubies[0]} ]]
}
function chruby_auto {
typeset n=0
typeset ver=''
typeset dir=${1:-$PWD}
typeset stop=${HOME%/*}
[[ $dir == "$stop"* ]] || return
until [[ $dir == "$stop" ]] || (( ++n < 10 )); do
if { IFS= read -r ver <"$dir"/.ruby-version; } 2>/dev/null; then
chruby "$ver"
break
fi
dir=${dir%/*}
done
}
function chrubylib_set_env {
typeset new_ruby_root=${1%/bin/*}
typeset ruby_opt=${*:2}
typeset env_args=("$RUBY_ROOT" "$GEM_HOME" "$GEM_PATH")
chrubylib_clean_env_paths /bin PATH "${env_args[@]}"
chrubylib_set_env_ruby_info "$new_ruby_root" "$ruby_opt"
chrubylib_set_env_ruby_versinfo "$new_ruby_root" "$ruby_opt"
chrubylib_set_env_paths /bin PATH "${env_args[@]}"
hash -r
}
if (($#)); then
optstring=:acdr
o=''
while getopts $optstring o; do
case $o in
(a) enable_auto=1 ;;
(c) enable_color=1 ;;
(d) enable_defaults=1 ;;
(r) enable_rubies=1 ;;
esac
done
fi
RUBY_VERSINFO=()
((enable_defaults)) && chrubylib_set_default
((enable_rubies)) && chrubylib_set_default_rubies
((enable_color)) && chrubylib_set_color
((enable_auto)) && chrubylib_set_hook
unset optstring o enable_auto enable_color enable_defaults enable_rubies
export GEM_HOME GEM_PATH GEM_SKIP GEM_CACHE GEMCACHE RUBY_ROOT RUBYOPT
# vim: ft=sh sts=4 sw=4 et fdm=marker
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment