#!/usr/bin/env bash unset rvm_auto_flag install_source_path=$(dirname $0) if [[ -d "$install_source_path/scripts" ]] && [[ -s "$install_source_path/scripts/utility" ]] ; then builtin cd $install_source_path fi source scripts/version source scripts/utility usage() { printf " Usage: ${0} [options] options: --auto : Automatically update shell profile files. --prefix : Installation prefix directory. --help : Display help/usage (this) message --version : display rvm package version " } spinner_counter=0 spinner() { array=('/' '-' '\\' '|' '/' '-' '\\' '|') index=$((($spinner_counter % 8))) printf "\r${array[$index]}" let "spinner_counter=spinner_counter+1" command -v perl > /dev/null 2>&1 && perl -e 'sleep 0.5' } if echo "$*" | grep -q 'trace' ; then echo "$*" ; env | grep '^rvm_' ; set -x ; fi while [[ $# -gt 0 ]] ; do token="$1" ; shift case "$token" in --auto) rvm_auto_flag=1 ;; --prefix) rvm_prefix="$1" ; shift ;; --version) rvm_path="$(pwd)" ; __rvm_version ; unset rvm_path ; exit ;; --help|*) usage ;; esac done if [[ -z "$rvm_prefix" ]] ; then __rvm_load_rvmrc if [[ "root" = "$(whoami)" ]] ; then rvm_prefix="/usr/local/" else rvm_prefix="$HOME/." fi fi if [[ -z "$rvm_path" ]] ; then rvm_path="${rvm_prefix}rvm" ; fi source scripts/initialize if grep -q 'scripts/rvm' $HOME/.bash* || grep -q 'scripts/rvm' $HOME/.zsh*; then if [[ -d "$rvm_path" ]] && [[ -s "${rvm_path}/scripts/rvm" ]] ; then export upgrade_flag=1 else export upgrade_flag=0 fi else export upgrade_flag=0 fi __rvm_initialize # # Setup & Configuration # item="$(tput setaf 2)* $(tput sgr0)" question="\n$(tput setaf 2)$(tput sgr0)" cwd=$(pwd) source_path="${source_path:-$cwd}" rvm_archives_path="${rvm_archives_path:-"$rvm_path/archives"}" rvm_src_path="${rvm_src_path:-"$rvm_path/src"}" rvm_log_path="${rvm_log_path:-"$rvm_path/log"}" rvm_bin_path="${rvm_bin_path:-"$rvm_path/bin"}" rvm_gems_path="${rvm_gems_path:-"$rvm_path/gems"}" rvm_rubies_path="${rvm_rubies_path:-"$rvm_path/rubies"}" rvm_scripts_path="${rvm_scripts_path:-"$rvm_path/scripts"}" rvm_config_path="${rvm_config_path:-"$rvm_path/config"}" rvm_hooks_path="${rvm_hooks_path:-"$rvm_path/hooks"}" rvm_tmp_path="${rvm_tmp_path:-"$rvm_path/tmp"}" export rvm_gemset_separator="@" # TODO: Remove this after a while. printf "\n$(tput setaf 2)RVM:$(tput sgr0) shell scripts which allow management of multiple ruby interpreters and environments." printf "\n$(tput setaf 2)RTFM: $(tput sgr0) http://rvm.beginrescueend.com/" printf "\n$(tput setaf 2)HELP: $(tput sgr0) http://webchat.freenode.net/?channels=rvm (#rvm on irc.freenode.net)" if [[ "$upgrade_flag" -eq 1 ]] ;then printf "\n\n Upgrading the RVM installation in $rvm_path/" else printf "\n\n Installing rvm to $rvm_path/" fi spinner mkdir -p $rvm_archives_path $rvm_src_path $rvm_log_path $rvm_bin_path $rvm_gems_path $rvm_rubies_path $rvm_config_path $rvm_hooks_path $rvm_tmp_path for file in README LICENCE ; do spinner cp -f "$source_path/$file" "$rvm_path/" done # # Scripts # for dir_name in config scripts examples lib hooks help ; do spinner mkdir -p "$rvm_path/$dir_name" if [[ -d "$source_path/$dir_name" ]] ; then cp -Rf "$source_path/$dir_name" "$rvm_path" fi done ; unset dir_name spinner if [[ ! -s "$rvm_config_path/user" ]] ; then mkdir -p "$rvm_config_path/" echo '# Users settings file, overrides db file settings and persists across installs.' >> $rvm_config_path/user fi scripts=("monitor" "match" "log" "install" "color" "db" "fetch" "log" "set" "package") for script_name in $scripts ; do spinner chmod +x $rvm_scripts_path/$script_name done # # Bin Scripts # # Cleanse and purge... for file in rvm-prompt rvm rvmsudo ; do spinner && perl -e 'sleep 0.2' rm -f "$rvm_bin_path/$file" cp -f "$source_path/binscripts/$file" $rvm_bin_path/ done spinner chmod +x $rvm_bin_path/* # # RC Files # spinner if [[ ! -z "$rvm_auto_flag" ]] ; then printf "Checking rc files... ($rvm_rc_files)" if [[ "$rvm_loaded_flag" != "1" ]] ; then for rcfile in $(echo $rvm_rc_files) ; do if [[ ! -f $rcfile ]] ; then touch $rcfile ; fi if [[ -s "$HOME/.profile" ]] ; then if ! grep -q '.profile' "$rcfile" ; then echo " Adding 'if [[ -s \$HOME/.profile ]] ; then source \$HOME ; fi' to $rcfile." printf "\n# rvm-install added line:\nif [[ -s \$HOME/.profile ]] ; then source \$HOME/.profile ; fi\n" >> $rcfile fi fi if ! grep -q "scripts\/rvm" "$rcfile" ; then echo " Adding 'if [[ -s $rvm_scripts_path/rvm ]] ; then source $rvm_scripts_path/rvm ; fi' to $rcfile." printf "\n# rvm-install added:\nif [[ -s $rvm_scripts_path/rvm ]] ; then source $rvm_scripts_path/rvm ; fi\n" >> $rcfile fi done fi fi # # Migrate ~/.rvm/ruby-X,jruby-X,... to ~/.rvm/rubies/ for 0.1.0. # rvm_rubies_path="${rvm_rubies_path:-"$rvm_path/rubies"}" mkdir -p "$rvm_rubies_path/" spinner for ruby in $rvm_path/ruby-* $rvm_path/jruby-* $rvm_path/mput-* $rvm_path/rbx-* $rvm_path/maglev-* $rvm_path/ree-* ; do if [[ -d "$ruby" ]] ; then mv "$ruby" "$rvm_rubies_path/" new_path="$rvm_rubies_path/$(basename $ruby)" for file in gem rake ; do spinner if [[ -s "$new_path/bin/$file" ]] ; then sed -e '1,1s=.*=#!'"${new_path}/bin/ruby=" "${new_path}/bin/${file}" > "${new_path}/bin/${file}.new" mv -f "$new_path/bin/$file.new" "$new_path/bin/$file" chmod +x "$new_path/bin/$file" fi done fi done # # End of rubies migration. # # # Migrate old gemset directories to new gemset pattern. # spinner printf "\r*" # Stop spinner. for gemset in $rvm_path/gems/*\%* ; do new_path=${gemset/\%/${rvm_gemset_separator}} if [[ -d "$gemset" ]] && [[ ! -d "$new_path" ]] ; then printf "\n Renaming $(basename $gemset) to $(basename $new_path) for new gemset separator." mv $gemset $new_path fi done for gemset in $rvm_path/gems/*\+* ; do new_path=${gemset/\+/${rvm_gemset_separator}} if [[ -d "$gemset" ]] && [[ ! -d "$new_path" ]] ; then printf "\n Renaming $(basename $gemset) to $(basename $new_path) for new gemset separator." mv $gemset $new_path fi done for gemset in $rvm_path/gems/*\@ ; do new_path=$(echo $gemset | sed -e 's#\@$##') if [[ -d "$gemset" ]] && [[ ! -d "$new_path" ]] ; then printf "\n Fixing: $(basename $gemset) to $(basename $new_path) for new gemset separator." mv $gemset $new_path fi done # Move from legacy defaults to the new, alias based system. if [[ -s "$rvm_config_path/default" ]]; then original_version="$(basename "$(grep GEM_HOME "$rvm_config_path/default" | awk -F"'" '{print $2}' | sed "s#\%#${rvm_gemset_separator}#")")" if [[ -n "$original_version" ]]; then $rvm_scripts_path/alias create default "$original_version" &> /dev/null fi unset original_version rm -rf "$rvm_config_path/default" fi # # End of gemset migration. # if [[ "root" = "$(whoami)" ]] ; then printf "\n Symlinking rvm to $rvm_bin_path/rvm ..." mkdir -p $rvm_bin_path chmod +x $rvm_bin_path/rvm chmod +x $rvm_bin_path/rvmsudo fi if [[ "$upgrade_flag" -eq 0 ]] ; then ./scripts/notes fi name="$(awk -F= '/^[[:space:]]*name/{print $2}' ~/.gitconfig 2>/dev/null)" printf "\n\n${name:-"$(whoami)"},\n" printf "\nThank you for using rvm. I hope that it makes your work easier and more enjoyable." printf "\nIf you have any questions, issues and/or ideas for improvement please hop in #rvm on irc.freenode.net and let me know." printf "\nMy irc nickname is 'wayneeseguin' and I hang out from ~09:00-17:00EST and again from ~21:00EST-~00:00EST." printf "\nIf I do not respond right away, please hang around after asking your question, I will respond as soon as I am back." printf "\nBe sure to get head often as rvm development happens fast, you can do this by typing 'rvm update --head'." printf "\n w$(tput setaf 2)⦿‿⦿$(tput sgr0)t!" printf "\n ~ Wayne\n" if [[ "$upgrade_flag" -eq 1 ]] ; then printf "\n$(tput setaf 6)Upgrade Notes\n" printf "\n * Gemset separator is '@' and will remain unless any rubies error using it." printf "\n * If you encounter any issues with a ruby your best bet is to 'rvm remove X ; rvm install X' " printf "\n * 'rvm notes' tells you OS dependency packages for installing rubies." printf "\n * 1.8.7 default patchlevel is p174, override ~/.rvm/config/db in ~/.rvm/config/user" printf "\n$(tput sgr0)\n" printf "\nUpgrade of RVM in $rvm_path/ is complete.\n\n" else if [[ "root" != "$(whoami)" ]] ; then printf "\n$(tput setaf 1)You must now finish the install manually:$(tput sgr0)" printf "\n1) Place the folowing line at the end of your shell's loading files(.bashrc or .bash_profile for bash and .zshrc for zsh), after all path/variable settings:" printf "\n [[ -s \$HOME/.rvm/scripts/rvm ]] && source \$HOME/.rvm/scripts/rvm" printf "\n2) Ensure that there is no 'return' from inside the .bashrc file. (otherwise rvm will be prevented from working properly)." printf "\n This means that if you see '[ -z "$PS1" ] && return' then you must change this line to:" printf "\n if [[ ! -z "$PS1" ]] ; then" printf "\n ... original content that was below the && return line ..." printf "\n fi # <= be sure to close the if." printf "\n #EOF .bashrc" printf "\n Be absolutely *sure* to REMOVE the '&& return'." printf "\n If you wish to DRY up your config you can 'source ~/.bashrc' at the bottom of your .bash_profile." printf "\n placing all non-interactive items in the .bashrc, including the 'source' line above" printf "\n3) Then $(tput setaf 1)CLOSE THIS SHELL$(tput sgr0) and open a new one in order to use rvm.\n" fi if [[ -s $HOME/.bashrc ]] && grep '&& return' $HOME/.bashrc ; then printf "\n\nWARNING: you have a 'return' statement in your .bashrc, likely this will cause untold havoc." printf "\n This means that if you see '[ -z "\$PS1" ] && return' then you must change this line to:" printf "\n if [[ -n "\$PS1" ]] ; then" printf "\n ... original content that was below the && return line ..." printf "\n fi # <= be sure to close the if." printf "\n #EOF .bashrc" printf "\nEven if you use zsh you should still adjust the .bashrc as above." printf "\nIf you have any questions about this please visit #rvm on irc.freenode.net.\n" fi printf "\nInstallation of RVM to $rvm_path/ is complete.\n\n" fi exit 0