#!/usr/bin/env bash original_ruby_version=${rvm_ruby_version:-""} original_ruby_string=${rvm_ruby_string:-""} source "$rvm_path/scripts/base" source "$rvm_path/scripts/patches" unset RUBYLIB RUBYOPT # Sanity check. __rvm_check_for_clang() { if [[ -n "${rvm_clang_flag:-""}" ]] && ! command -v clang >/dev/null ; then "$rvm_path/scripts/log" "fail" "\nYou passed the --clang option and clang is not in your path. \nPlease try again or do not use --clang.\n" return 1 fi } # Checks for bison, returns zero iff it is found __rvm_check_for_bison() { if [[ ${rvm_head_flag:-0} -gt 0 ]]; then command -v bison > /dev/null result=$? if [[ $result -gt 0 ]] ; then "$rvm_path/scripts/log" "fail" \ "\nbison is not available in your path. \nPlease ensure bison is installed before compiling from head.\n" fi fi return ${result:-0} } # Emits a number of patches to STDOUT, each on a new name # Expands patchsets etc. __rvm_current_patch_names() { # TODO: Lookup default patches on rvm_ruby_string heirarchy. local separator patches level name separator="%" patches="${rvm_patch_names:-""} default" for patch_name in $(echo ${patches//,/ }); do level=1 name="$patch_name" if echo "$name" | grep -q "$separator"; then level="${name/*${separator}/}" name="${name//${separator}*/}" fi local expanded_name="$(__rvm_expand_patch_name "$name")" echo "${expanded_name}${separator}${level}" done return 0 } __rvm_apply_patches() { local patches patch_name patch_level_separator patch_fuzziness patch_level source_directory full_patch_path result=0 patch_level_separator="%" patch_fuzziness="25" patch_level=1 source_directory="${1:-""}" if [[ -z "$source_directory" ]] ; then source_directory="${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" fi ( builtin cd "$source_directory" patches=($(__rvm_current_patch_names)) for patch_name in "${patches[@]}" ; do # If set, extract the patch level from the patch name. patch_level=1 if echo "$patch_name" | \grep -q "$patch_level_separator"; then patch_level=${patch_name//*${patch_level_separator}/} patch_name="${patch_name//${patch_level_separator}*/}" fi full_patch_path="$(__rvm_lookup_full_patch_path "$patch_name")" # Expand paths, and for those we found we then apply the patches. if [[ -n "${full_patch_path:-""}" ]]; then if [[ -f "$full_patch_path" ]] ; then __rvm_run "patch.apply.${patch_name/*\/}" \ "patch -F$patch_fuzziness -p$patch_level -f <\"$full_patch_path\"" \ "Applying patch '$patch_name' (located at $full_patch_path)" [[ $? -gt 0 ]] && result=1 # Detect failed patches fi else "$rvm_path/scripts/log" "warn" \ "Patch '$patch_name' not found." result=1 fi done ) return ${result:-0} } __rvm_install_source() { local directory configure_parameters db_configure_flags [[ ${rvm_ruby_selected_flag:-0} -eq 0 ]] && __rvm_select case ${rvm_ruby_string:-""} in ruby-head|1.9.*-head) __rvm_ensure_has_18_compat_ruby || return 1 ;; esac "$rvm_path/scripts/log" "info" \ "Installing Ruby from source to: $rvm_ruby_home, this may take a while depending on your cpu(s)...\n" builtin cd "${rvm_src_path:-"$rvm_path/src"}" if [[ ${rvm_force_flag:-0} -eq 1 ]] ; then for directory in "$rvm_ruby_home" "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" ; do if [[ -d "$directory" ]] ; then rm -rf "$directory" fi done fi result=0 __rvm_fetch_ruby result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error fetching the ruby interpreter. Halting the installation." return $result fi builtin cd "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" result=$? ; if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "Source directory is missing. Did the download or extraction fail? Halting the installation." return $result fi if [[ -d "${rvm_path}/usr" ]] ; then export PATH="${rvm_path}/usr/bin:${PATH}" builtin hash -r fi __rvm_apply_patches result="$?" if [[ $result -gt 0 ]]; then "$rvm_path/scripts/log" "fail" \ "There has been an error applying the specified patches. Halting the installation." return $result fi if [[ -z "${rvm_ruby_configure:-""}" \ && ! -s "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/configure" ]] ; then if command -v autoconf > /dev/null ; then __rvm_run "autoconf" "autoconf" "Running autoconf" else "$rvm_path/scripts/log" "fail" \ "rvm requires autoconf to install the selected ruby interpreter however autoconf was not found in the PATH." return 1 fi fi if [[ -n "${rvm_ruby_configure:-""}" ]] ; then __rvm_run "configure" "$rvm_ruby_configure" result=$? if [[ $result -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while configuring. Halting the installation." return $result fi elif [[ -s ./configure ]] ; then # REE stores configure flags differently for head vs. the distributed release. if [[ "ree" != "${rvm_ruby_interpreter:-""}" ]]; then __rvm_db "${rvm_ruby_interpreter}_configure_flags" "db_configure_flags" fi # On 1.9.2, we manually set the --with-baseruby option # to point to an expanded path. if [[ "${rvm_ruby_string:-""}" = "ruby-1.9.2-head" ]] ; then local compatible_baseruby="$rvm_path/wrappers/$(__rvm_18_compat_ruby)/ruby" if [[ -x "$compatible_baseruby" ]] ; then configure_parameters="--with-baseruby=$compatible_baseruby" fi fi local configure_command="./configure --prefix=$rvm_ruby_home ${db_configure_flags:-""} ${rvm_configure_flags:-""} ${configure_parameters:-""}" __rvm_run "configure" "$configure_command" "$rvm_ruby_string - #configuring " result=$? if [[ $result -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while running configure. Halting the installation." return $result fi else "$rvm_path/scripts/log" "error" \ "Skipping configure step, 'configure' does not exist, did autoconf not run successfully?" fi rvm_ruby_make=${rvm_ruby_make:-"make"} __rvm_run "make" "$rvm_ruby_make ${rvm_make_flags:-""}" "$rvm_ruby_string - #compiling " result=$? if [[ $result -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while running make. Halting the installation." return $result fi if [[ -d .ext/rdoc ]] ; then rm -rf .ext/rdoc fi rvm_ruby_make_install=${rvm_ruby_make_install:-"make install"} __rvm_run "install" "$rvm_ruby_make_install" "$rvm_ruby_string - #installing " result=$? if [[ $result -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while running make install. Halting the installation." return $result fi export GEM_HOME="$rvm_ruby_gem_home" export GEM_PATH="$rvm_ruby_gem_path" export BUNDLE_PATH="$rvm_ruby_gem_home" __rvm_rubygems_setup result=$? __rvm_bin_script __rvm_run "chmod.bin" "chmod +x $rvm_ruby_home/bin/*" __rvm_post_install result=$? "$rvm_path/scripts/log" "info" \ "Install of $rvm_ruby_string - #complete " return ${result:-0} } __rvm_install_ruby() { if [[ ${rvm_ruby_selected_flag:-0} -eq 0 ]] ; then __rvm_select ; fi if [[ -n "${RUBYOPT:-""}" ]] ; then ruby_options="$RUBYOPT" ; fi unset RUBYOPT # Check for clang if the flag is set __rvm_check_for_clang result=$? [[ $result -gt 0 ]] && return $result case "$rvm_ruby_interpreter" in macruby) if [[ "Darwin" = "$(uname)" ]] ; then if [[ "$rvm_head_flag" = 1 ]] ; then if [[ -n "$rvm_llvm_flag" ]] ; then "$rvm_path/scripts/package" llvm install fi macruby_path="/usr/local/bin" # TODO: configure & make variables should be set here. rvm_ruby_configure=" true " rvm_ruby_make="rake" rvm_ruby_make_install="sudo rake install" __rvm_db "${rvm_ruby_interpreter}_repo_url" "rvm_ruby_url" rvm_ruby_repo_url=$rvm_ruby_url __rvm_install_source $* result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to install from source. \ \nHalting the installation." return $result fi elif [[ "nightly" = "$rvm_ruby_version" ]] ; then macruby_path="/Library/Frameworks/MacRuby.framework/Versions/0.6/usr/bin" # TODO: Separated nightly from head. "$rvm_path/scripts/log" "info" "Retrieving the latest nightly macruby build..." "$rvm_path/scripts/fetch" "$rvm_ruby_url" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the source. \ \nHalting the installation." return $result fi mv "${rvm_archives_path:-"$rvm_path/archives"}/macruby_nightly-latest.pkg" \ "$rvm_archives_path/macruby_nightly.pkg" __rvm_run "macruby/extract" \ "sudo /usr/sbin/installer -pkg '${rvm_archives_path:-"$rvm_path/archives"}/macruby_nightly.pkg' -target '/'" mkdir -p "$rvm_ruby_home/bin" else macruby_path="/Library/Frameworks/MacRuby.framework/Versions/${rvm_ruby_version}/usr/bin" # TODO: Separated nightly from head. "$rvm_path/scripts/log" "info" "Retrieving MacRuby ${rvm_ruby_version} ..." "$rvm_path/scripts/fetch" "$rvm_ruby_url" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the source. Halting the installation." return $result fi mkdir -p ${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string unzip -o -j "${rvm_archives_path:-"$rvm_path/archives"}/$rvm_ruby_package_file" \ "MacRuby ${rvm_ruby_version}/MacRuby ${rvm_ruby_version}.pkg" \ -d "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" mv "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/MacRuby ${rvm_ruby_version}.pkg" \ "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/$rvm_ruby_string.pkg" __rvm_run "macruby/extract" \ "sudo /usr/sbin/installer -pkg '${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/$rvm_ruby_string.pkg' -target '/'" mkdir -p "$rvm_ruby_home/bin" fi binaries=(erb gem irb rake rdoc ri ruby testrb) for binary_name in ${binaries[@]}; do # TODO: This should be generated via an external script. ruby_wrapper=$(cat < "$file_name" if [[ -f "$file_name" ]] ; then chmod +x $file_name fi if [[ "$binary_name" = "ruby" ]] ; then echo "$ruby_wrapper" \ > "${rvm_bin_path:-"$rvm_bin_path/bin"}/$rvm_ruby_string" fi done ; unset binaries __rvm_irbrc else "$rvm_path/scripts/log" "fail" \ "MacRuby can only be installed on a Darwin OS." fi ;; ree) if [[ -n "$(echo "$rvm_ruby_version" | awk '/^1\.8/')" \ && $rvm_head_flag -eq 0 ]] ; then rvm_ruby_url="$(__rvm_db "ree_${rvm_ruby_version}_url")/$rvm_ruby_package_file.tar.gz" "$rvm_path/scripts/log" "info" \ "Installing Ruby Enterprise Edition from source to: $rvm_ruby_home" builtin cd "${rvm_src_path:-"$rvm_path/src"}" if [[ ${rvm_force_flag:-0} -eq 0 \ && -d "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" \ && ! -x "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/installer" ]] ; then "$rvm_path/scripts/log" \ "It appears that the archive has already been extracted. Skipping extract (use --force to force re-download and extract)." else "$rvm_path/scripts/log" \ "$rvm_ruby_string - #fetching ($rvm_ruby_package_file)" "$rvm_path/scripts/fetch" \ "$rvm_ruby_url" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the source. \ \nHalting the installation." return $result fi rm -rf "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" __rvm_run "extract" \ "gunzip < \"${rvm_archives_path:-"$rvm_path/archives"}/$rvm_ruby_package_file.$rvm_archive_extension\" | tar xf - -C ${rvm_src_path:-"$rvm_path/src"}" \ "$rvm_ruby_string - #extracting $rvm_ruby_package_file to ${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to extract the source. Halting the installation." return $result fi mv "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_package_file" \ "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" fi builtin cd "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" # wait, what? v v v TODO: Investigate line smell. mkdir -p "${rvm_ruby_home}/lib/ruby/gems/1.8/gems" if [[ -n "$rvm_configure_flags" ]] ; then rvm_configure_flags="${rvm_configure_flags//--/-c --}" fi if [[ "Darwin" = "$(uname)" && "1.8.6" = "$rvm_ruby_version" \ && -z "$rvm_ree_options" ]] ; then rvm_ree_options="${rvm_ree_options} --no-tcmalloc" fi __rvm_db "${rvm_ruby_interpreter}_configure_flags" "db_configure_flags" __rvm_apply_patches "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/source" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to apply patches to ree. \ \nHalting the installation." return $result fi __rvm_run "install" \ "./installer -a $rvm_path/rubies/$rvm_ruby_string $rvm_ree_options $db_configure_flags $rvm_configure_flags" "$rvm_ruby_string - #installing " result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to run the ree installer. Halting the installation." return $result fi chmod +x "$rvm_ruby_home"/bin/* __rvm_rubygems_setup __rvm_irbrc __rvm_bin_script __rvm_post_install else __rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_repo_url" "rvm_ruby_url" if [[ -z "$rvm_ruby_url" ]] ; then "$rvm_path/scripts/log" "fail" \ "rvm does not know the rvm repo url for '${rvm_ruby_interpreter}_${rvm_ruby_version}'" result=1 else rvm_ruby_repo_url="$rvm_ruby_url" if [[ ${rvm_make_flags_flag:-0} -eq 1 ]] ; then __rvm_make_flags ; fi __rvm_install_source $* fi fi ;; rbx|rubinius) "$rvm_path/scripts/log" "info" "$rvm_ruby_string installing #dependencies " # Ensure we have a 1.8.7 compatible ruby installed. __rvm_ensure_has_18_compat_ruby || return 1 # TODO: use 'rvm gems load' here: unset CFLAGS LDFLAGS ARCHFLAGS # Important. unset BUNDLE_PATH GEM_HOME GEM_PATH MY_RUBY_HOME IRBRC __rvm_remove_rvm_from_path __rvm_conditionally_add_bin_path ; export PATH builtin hash -r if [[ -n "$(printf "${rvm_ruby_version:-""}" | awk '/^1\./')" \ && ${rvm_head_flag:-0} -eq 0 ]] ; then "$rvm_path/scripts/log" "info" \ "$rvm_ruby_string #downloading ($rvm_ruby_package_file), this may take a while depending on your connection..." "$rvm_path/scripts/fetch" "$rvm_ruby_url" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the source. Halting the installation." return $result fi __rvm_run "extract" \ "gunzip < \"${rvm_archives_path:-"$rvm_path/archives"}/$(basename $rvm_ruby_package_file)\" | tar xf - -C ${rvm_src_path:-"$rvm_path/src"}" \ "$rvm_ruby_string - #extracting" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to extract the source. \ \nHalting the installation." return $result fi # Remove the left over folder first. rm -rf "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" mv "${rvm_src_path:-"$rvm_path/src"}/rubinius-${rvm_ruby_version}" \ "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" else __rvm_db "rubinius_repo_url" "rvm_ruby_repo_url" #rvm_ruby_home="$rvm_path/rubies/$rvm_ruby_interpreter-$rvm_ruby_version" __rvm_fetch_from_github "rbx" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while fetching the rbx git repo. \ \nHalting the installation." return $result fi fi builtin cd "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" chmod +x ./configure __rvm_apply_patches result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to apply patches to rubinius. \ \nHalting the installation." return $result fi __rvm_db "${rvm_ruby_interpreter}_configure_flags" "db_configure_flags" export ruby="$(__rvm_18_compat_ruby)" rvm_configure_flags="${rvm_configure_flags:-"--skip-system"}" rvm_ruby_configure="$rvm_path/wrappers/$ruby/ruby ./configure --prefix=$rvm_ruby_home $db_configure_flags $rvm_configure_flags" message="$rvm_ruby_string - #configuring" if [[ "$rvm_llvm_flag" = "0" ]] ; then rvm_ruby_configure="$rvm_ruby_configure --disable-llvm" else if [[ "$rvm_ruby_patch_level" = "rc1" ]] ; then rvm_ruby_configure="$rvm_ruby_configure --enable-llvm" fi fi __rvm_run "configure" "$rvm_ruby_configure" "$message" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while running '$rvm_ruby_configure'. \ \nHalting the installation." return $result fi if [[ "$rvm_trace_flag" -eq 1 ]] ; then rvm_ruby_make="$rvm_path/wrappers/$ruby/rake install --trace" message="$rvm_ruby_string - #compiling (with --trace)" else rvm_ruby_make="$rvm_path/wrappers/$ruby/rake install" message="$rvm_ruby_string - #compiling" fi __rvm_run "rake" "$rvm_ruby_make" "$message" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while running '$rvm_ruby_configure'.\nHalting the installation." return $result fi ; unset ruby # Symlink rubinius wrappers ln -fs "$rvm_ruby_home/bin/rbx" "$rvm_ruby_home/bin/ruby" # Install IRB Wrapper on Rubinius. file_name="$rvm_ruby_home/bin/irb" rm -f "$file_name" printf '#!/usr/bin/env bash\n' > "$file_name" printf "exec '$rvm_ruby_home/bin/rbx' 'irb' \"\$@\"\n" >> "$file_name" [[ -f "$file_name" ]] && chmod +x "$file_name" # Install Gem Wrapper on Rubinius. file_name="$rvm_ruby_home/bin/gem" cp -f "$rvm_ruby_home/lib/bin/gem.rb" "$file_name" __rvm_inject_ruby_shebang "$file_name" if [[ -f "$file_name" ]] ; then chmod +x "$file_name" fi unset file_name binaries=(erb ri rdoc) __rvm_post_install __rvm_irbrc __rvm_bin_script ;; jruby) if ! command -v java > /dev/null; then printf "java must be installed and in PATH in order to install JRuby." return 1 fi builtin cd "${rvm_src_path:-"$rvm_path/src"}" __rvm_fetch_ruby result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the source. \ \nHalting the installation." return $result fi builtin cd "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" if [[ ${rvm_head_flag:-0} -eq 1 ]] ; then __rvm_apply_patches __rvm_run "ant.dist" "ant dist" "$rvm_ruby_string - #ant dist" fi mkdir -p "$rvm_ruby_home/bin/" case "$rvm_ruby_version" in 1.3|1.2) __rvm_run "nailgun" \ "builtin cd \"${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/tool/nailgun\" && make $rvm_make_flags" \ "Building Nailgun" ;; *) __rvm_run "nailgun" \ "builtin cd \"${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/tool/nailgun\" && ./configure --prefix=$rvm_ruby_home && make $rvm_make_flags" \ "Building Nailgun" ;; esac if [[ -z "${rvm_ruby_home:-""}" || "$rvm_ruby_home" = "/" ]] ; then echo "WTH?!?! rvm_ruby_home == / ??? not removing." ; return 1000000 fi rm -rf "$rvm_ruby_home" __rvm_run "install" \ "/bin/cp -Rf ${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string $rvm_ruby_home" "$rvm_ruby_string - #installing to $rvm_ruby_home" ( builtin cd "$rvm_ruby_home/bin/" for binary in jirb jruby jgem ; do ln -nfs "$binary" "${binary#j}" done ; unset binary ) # -server is "a lot slower for short-lived scripts like rake tasks, and takes longer to load" #sed -e 's#^JAVA_VM=-client#JAVA_VM=-server#' $rvm_ruby_home/bin/jruby > $rvm_ruby_home/bin/jruby.new && # mv $rvm_ruby_home/bin/jruby.new $rvm_ruby_home/bin/jruby chmod +x "$rvm_ruby_home/bin/jruby" binaries=(jrubyc jirb_swing jirb jgem rdoc ri spec autospec testrb ast generate_yaml_index.rb) for binary in "${binaries[@]}" ; do __rvm_inject_gem_env "$rvm_ruby_home/bin/$binary" done __rvm_inject_ruby_shebang "$rvm_ruby_home/bin/rake" __rvm_rubygems_setup __rvm_irbrc __rvm_bin_script __rvm_use __rvm_post_install # jruby ships with some built in gems, copy them in to place. if [[ -d "$rvm_ruby_home/lib/ruby/gems/1.8" ]]; then "$rvm_path/scripts/log" "info" "Copying across included gems" cp -R "$rvm_ruby_home/lib/ruby/gems/1.8/" "$rvm_ruby_gem_home/" fi ;; maglev) __rvm_ensure_has_18_compat_ruby "$rvm_path/scripts/log" "info" \ "Running MagLev prereqs checking script." "$rvm_path/scripts/maglev" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "Prerequisite checks have failed. Halting the installation." return $result fi builtin cd "${rvm_src_path:-"$rvm_path/src"}" if [[ ! -d "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" \ || ${rvm_force_flag:-0} -eq 1 ]] ; then rm -rf "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/" \ "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/" __rvm_fetch_ruby result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the source. \ \nHalting the installation." return $result fi fi if [[ ${rvm_head_flag:-0} -eq 1 ]] ; then builtin cd "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" rvm_gemstone_package_file="GemStone-$(\grep ^GEMSTONE version.txt | cut -f2 -d-).$(uname -sm | \tr ' ' '-')" rvm_gemstone_url="${rvm_gemstone_url:-"$maglev_url/${rvm_gemstone_package_file}.${rvm_archive_extension}"}" fi "$rvm_path/scripts/log" "info" \ "Downloading the GemStone package, this may take a while depending on your connection..." "$rvm_path/scripts/fetch" "$rvm_gemstone_url" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the GemStone package. \ \nHalting the installation." return $result fi builtin cd "${rvm_src_path:-"$rvm_path/src"}" if [[ -s "$rvm_ruby_package_file" ]] ; then mv "$rvm_ruby_package_file" "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" fi builtin cd "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" __rvm_run "gemstone.extract" \ "gunzip < \"${rvm_archives_path:-"$rvm_path/archives"}/${rvm_gemstone_package_file}.${rvm_archive_extension}\" | tar xf - -C ${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to extract the GemStone package. \ \nHalting the installation." return $result fi chmod -R 777 "$rvm_gemstone_package_file" # for now. # WTF?! Crack.smoke!(:huff) ln -nfs "$rvm_gemstone_package_file" "gemstone" if [[ -z "${rvm_ruby_home:-""}" || "$rvm_ruby_home" = "/" ]] ; then echo "WTH?!?! rvm_ruby_home == / ??? not removing." ; return 1000000 else rm -rf $rvm_ruby_home fi __rvm_run "install" \ "/bin/cp -Rf ${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string $rvm_ruby_home" \ "Installing maglev to $rvm_ruby_home" ( builtin cd "$rvm_ruby_home/bin/" for binary in maglev-irb maglev-ruby maglev-gem ; do ln -nfs "$binary" "${binary#maglev-}" done ; unset binary ) binaries=(maglev-ruby maglev-irb maglev-gem) for binary in "${binaries[@]}" ; do __rvm_inject_gem_env "$rvm_ruby_home/bin/$binary" done builtin cd "$rvm_ruby_home" if [[ $rvm_head_flag -eq 1 ]] ; then git submodule update --init "$rvm_ruby_home/bin/maglev" force-reload ln -sf maglev.demo.key-$(uname -sm | \tr ' ' '-') etc/maglev.demo.key fi #ln -fs "$rvm_ruby_home/$(echo $rvm_gemstone_package_file | awk -F'.' '{print $1}')" "$rvm_ruby_home/gemstone" compatible_ruby="$(__rvm_18_compat_ruby)" if [[ ! -e ${rvm_ruby_home}/etc/conf.d/maglev.conf ]] ; then "$rvm_path/scripts/log" "info" "Creating default 'maglev' repository." "$rvm_path/wrappers/$compatible_ruby/rake" "stone:create[maglev]" >/dev/null 2>&1 fi "$rvm_path/scripts/log" "info" "Generating maglev HTML documentation" "$rvm_path/wrappers/$compatible_ruby/rake" rdoc >/dev/null 2>&1 "$rvm_path/scripts/log" "info" "Generating smalltalk FFI." "$rvm_path/wrappers/$compatible_ruby/rake" stwrappers >/dev/null 2>&1 unset compatible_ruby # TODO: Figure out if anything needs to be done with rubygems. #__rvm_rubygems_setup __rvm_irbrc __rvm_bin_script __rvm_use ;; ironruby|ir) if ! command -v mono > /dev/null ; then printf "mono must be installed and in your path in order to install IronRuby." ; return 1 fi if [[ $rvm_head_flag -eq 1 ]] ; then mono_version="$(mono -V | head -n 1 | cut -d ' ' -f5)" if "$rvm_path/scripts/match" "$mono_version" "([0-9]+)\.([0-9]+)\.?([0-9]+)?" ; then mono_major_ver="$(echo "$mono_version" | cut -d '.' -f1)" mono_minor_ver="$(echo "$mono_version" | cut -d '.' -f2)" if [[ $mono_major_ver -lt 2 ]] \ || ( [[ $mono_major_ver -eq 2 && $mono_minor_ver -lt 6 ]] ) ; then printf "Mono 2.6 (or greater) must be installed and in your path in order to build IronRuby from the repository." printf "Version detected: ${mono_version}" return 1 fi else printf "Cannot recognize mono version." return 1 fi __rvm_ensure_has_18_compat_ruby __rvm_fetch_ruby if [[ $? -gt 0 ]] ; then result=$? ; return $result ; fi builtin cd "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" compatible_ruby="$(__rvm_18_compat_ruby)" "$rvm_path/wrappers/$compatible_ruby/gem" install pathname2 --no-rdoc --no-ri # MONO_LIB=/Library/Frameworks/Mono.framework/Versions/current/lib/ rvm_ruby_make="$rvm_path/wrappers/$compatible_ruby/rake MERLIN_ROOT=\"${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/Merlin/Main\" compile mono=1 configuration=release --trace" __rvm_run "rake" "$rvm_ruby_make" "Building IronRuby..." unset compatible_ruby if [[ $? -gt 0 ]] ; then result=$? ; return $result ; fi rm -rf "$rvm_ruby_home"/* mkdir -p "$rvm_ruby_home/bin" "$rvm_ruby_home/lib" \ "$rvm_ruby_home/lib/ruby" "$rvm_ruby_home/lib/IronRuby" cp -r "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/Merlin/Main/Bin/mono_release"/* "$rvm_ruby_home/bin/" cp -r "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/Merlin/Main/Languages/Ruby/Scripts/bin"/* "$rvm_ruby_home/bin/" cp -r "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/Merlin/External.LCA_RESTRICTED/Languages/Ruby/redist-libs/ruby"/* "$rvm_ruby_home/lib/ruby" cp -r "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/Merlin/Main/Languages/Ruby/Libs"/* "$rvm_ruby_home/lib/IronRuby" else "$rvm_path/scripts/log" "info" \ "Retrieving IronRuby" "$rvm_path/scripts/fetch" "$rvm_ruby_url" \ "$rvm_ruby_package_file" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the source. Halting the installation." return $result fi mkdir -p "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" "$rvm_ruby_home" unzip -o -d "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" \ "${rvm_archives_path:-"$rvm_path/archives"}/${rvm_ruby_package_file}" >> \ "${rvm_log_path:-"$rvm_path/log"}/$rvm_ruby_string/extract.log" 2>> \ "${rvm_log_path:-"$rvm_path/log"}/$rvm_ruby_string/extract.error.log" result=$? if [[ "$result" -gt 1 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to extract $rvm_ruby_package_file. \ \nHalting the installation." return $result fi for dir in bin lib silverlight ; do cp -Rf "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/$dir" "$rvm_ruby_home/$dir" done fi binaries=(gem irb rdoc rake ri ruby) for binary_name in "${binaries[@]}" ; do if [[ -s "$rvm_ruby_home/bin/$binary_name" ]] ; then tr -d '\r' < "$rvm_ruby_home/bin/$binary_name" > "$rvm_ruby_home/bin/$binary_name.new" #sed -e '1,1s=.*=#!'"/usr/bin/env ir=" "$rvm_ruby_home/bin/$binary_name" > "$rvm_ruby_home/bin/$binary_name.new" mv -f "$rvm_ruby_home/bin/$binary_name.new" "$rvm_ruby_home/bin/$binary_name" chmod +x "$rvm_ruby_home/bin/$binary_name" fi done ; unset binaries sed -e '1,1s=.*=#!'"/usr/bin/env bash=" "$rvm_ruby_home/bin/ir" \ | \tr -d '\r' > "$rvm_ruby_home/bin/ir.new" mv -f "$rvm_ruby_home/bin/ir.new" "$rvm_ruby_home/bin/ir" chmod +x "$rvm_ruby_home/bin/ir" ln -fs "$rvm_ruby_home/bin/ir" "$rvm_ruby_home/bin/ruby" builtin hash -r __rvm_run "gems.install" \ "PATH=\"$rvm_ruby_gem_home/bin:$rvm_ruby_global_gems_path/bin:$rvm_ruby_home/bin:$PATH\" GEM_HOME=\"$rvm_ruby_gem_home\" GEM_PATH=\"$rvm_ruby_gem_home:$rvm_ruby_global_gems_path\" $rvm_ruby_home/bin/gem install --no-rdoc --no-ri rake $rvm_gem_options" \ "Installing $rvm_gem_name to $dir" ;; mput|shyouhei) if [[ ${rvm_make_flags_flag:-0} -eq 1 ]] ; then __rvm_make_flags ; fi unset BUNDLE_PATH GEM_HOME GEM_PATH MY_RUBY_HOME IRBRC __rvm_remove_rvm_from_path __rvm_conditionally_add_bin_path ; export PATH builtin hash -r rvm_ruby_home="$rvm_path/rubies/$rvm_ruby_interpreter-$rvm_ruby_version" __rvm_fetch_from_github "mput" "trunk" __rvm_apply_patches ; result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to apply patches to mput. \ \nHalting the installation." return $result fi if [[ ! -s "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/configure" ]] ; then if command -v autoconf &> /dev/null ; then __rvm_run "autoconf" "autoconf" "Running autoconf" else "$rvm_path/scripts/log" "fail" \ "rvm expects autoconf to install this ruby interpreter, autoconf was not found in PATH. \ \nHalting installation." return $result fi fi if [[ -s ./Makefile && -z "$rvm_reconfigure_flag" ]] ; then if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then "$rvm_path/scripts/log" "debug" \ "Skipping configure step, Makefile exists so configure must have already been run." fi elif [[ -n "$rvm_ruby_configure" ]] ; then __rvm_run "configure" "$rvm_ruby_configure" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to configure the source. \ \nHalting the installation." return $result fi elif [[ -s ./configure ]] ; then local configure_command="./configure --prefix=$rvm_ruby_home $rvm_configure_flags" __rvm_run "configure" "" \ "Configuring $rvm_ruby_string using $rvm_configure_flags, this may take a while depending on your cpu(s)..." result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to configure the source.\ \nHalting the installation." return $result fi else "$rvm_path/scripts/log" "error" \ "Skipping configure step, 'configure' script does not exist, did autoconf not run successfully?" fi rvm_ruby_make=${rvm_ruby_make:-"make"} __rvm_run "make" "$rvm_ruby_make $rvm_make_flags" \ "Compiling $rvm_ruby_string, this may take a while depending on your cpu(s)..." result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to run make.\ \nHalting the installation." return $result fi rvm_ruby_make_install=${rvm_ruby_make_install:-"make install"} __rvm_run "install" "$rvm_ruby_make_install" "Installing $rvm_ruby_string" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to run make install. \ \nHalting the installation." return $result fi "$rvm_path/scripts/log" "info" \ "Installation of $rvm_ruby_string is complete." export GEM_HOME="$rvm_ruby_gem_home" export GEM_PATH="$rvm_ruby_gem_path" export BUNDLE_PATH="$rvm_ruby_gem_home" __rvm_rubygems_setup __rvm_bin_script __rvm_run "chmod.bin" "chmod +x $rvm_ruby_home/bin/*" __rvm_post_install ;; ruby) __rvm_check_for_bison # && Run like hell... if [[ $? -gt 0 ]] ; then return $result ; fi if [[ ${rvm_make_flags_flag:-0} -eq 1 ]] ; then __rvm_make_flags ; fi ( __rvm_install_source $* ) result=$? ;; default) "$rvm_path/scripts/log" "fail" \ "a ruby interpreter to install must be specified and not simply 'default'." ;; *) "$rvm_path/scripts/log" "fail" \ "Either the ruby interpreter is unknown or there was an error!." ;; esac rvm_hook="after_install" ; source "$rvm_path/scripts/hook" if [[ -n "$ruby_options" ]] ; then RUBYOPT="$ruby_options" export RUBYOPT fi return ${result:-0} } __rvm_fetch_from_github() { rm -rf "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" if [[ ! -d "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string/.git" ]] ; then rm -rf "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" builtin cd "$rvm_home" __rvm_run "$1.repo" \ "git clone --depth 1 $rvm_ruby_repo_url ${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" \ "Cloning $rvm_ruby_repo_url" result=$? if [[ "$result" -gt 0 ]] ; then rvm_ruby_repo_http_url="${rvm_ruby_repo_url//git:/http:}" "$rvm_path/scripts/log" "info" "Could not fetch $rvm_ruby_repo_url - trying $rvm_ruby_repo_http_url" __rvm_run "$1.repo" "git clone --depth 1 $rvm_ruby_repo_http_url ${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" "Cloning $rvm_ruby_repo_http_url" fi else local branch="${2:-"master"}" builtin cd "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" __rvm_run "$1.repo" "git pull origin $branch" "Pulling from origin $branch" fi __rvm_run "$1.copy" "\\cp -R \"${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string\" \"${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string\"" "Copying from repo to source..." builtin cd "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" return ${result:-0} } __rvm_fetch_ruby() { [[ ${rvm_ruby_selected_flag:-0} -eq 0 ]] && __rvm_select "$rvm_path/scripts/log" "info" "$rvm_ruby_string - #fetching " if [[ ${rvm_head_flag:-0} -eq 0 && -z "${rvm_ruby_tag:-""}" && -z "${rvm_ruby_revision:-""}" ]] ; then rvm_ruby_package_name="${rvm_ruby_package_name:-"$rvm_ruby_string"}" rvm_ruby_package_file="${rvm_ruby_package_file:-"$rvm_ruby_package_name"}" if [[ "ruby" = "$rvm_ruby_interpreter" ]]; then rvm_archive_extension="${rvm_archive_extension:-tar.bz2}" else rvm_archive_extension="${rvm_archive_extension:-tar.gz}" fi if [[ ! -s "${rvm_archives_path:-"$rvm_path/archives"}/$rvm_ruby_package_file.$rvm_archive_extension" ]] ; then case "$rvm_ruby_interpreter" in ruby) rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_release_version}.${rvm_ruby_major_version}_url")/$rvm_ruby_package_file.$rvm_archive_extension" ;; ree) rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_url")/${rvm_ruby_package_file}.${rvm_archive_extension}" ;; jruby) rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_url")/${rvm_ruby_version}/${rvm_ruby_package_file}.${rvm_archive_extension}" ;; maglev) : # Should already be set from selector ;; *) rvm_ruby_url="$(__rvm_db "${rvm_ruby_interpreter}_url")/${rvm_ruby_package_file}.${rvm_archive_extension}" ;; esac "$rvm_path/scripts/log" "info" \ "$rvm_ruby_string - #downloading ${rvm_ruby_package_file}, this may take a while depending on your connection..." "$rvm_path/scripts/fetch" "${rvm_ruby_url}" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the source. \ \nHalting the installation." return $result fi fi if [[ ! -d "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" \ || ${rvm_force_flag:-0} -eq 1 ]] ; then if [[ -d "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" ]] ; then # Especially when forced, we want to ensure the destination is missing. rm -rf "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" fi mkdir -p "/tmp/rvm_src_$$" case "$rvm_archive_extension" in tar.gz|tgz) __rvm_run "extract" "gunzip < \"${rvm_archives_path:-"$rvm_path/archives"}/$rvm_ruby_package_file.$rvm_archive_extension\" | tar xf - -C /tmp/rvm_src_$$" "$rvm_ruby_string - #extracting $rvm_ruby_package_file to ${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to extract the source. \ \nHalting the installation." return $result fi ;; zip) __rvm_run "extract" "unzip -q -o ${rvm_archives_path:-"$rvm_path/archives"}/$rvm_ruby_package_file -d /tmp/rvm_src_$$" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to extract $rvm_ruby_package_file. \ \nHalting the installation." return $result fi ;; tar.bz2) __rvm_run "extract" "bunzip2 < '${rvm_archives_path:-"$rvm_path/archives"}/$rvm_ruby_package_file.$rvm_archive_extension' | tar xf - -C /tmp/rvm_src_$$" "$rvm_ruby_string - #extracting $rvm_ruby_package_file to ${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to extract the source. \ \nHalting the installation." return $result fi ;; *) "$rvm_path/scripts/log" "error" \ "Unknown archive format extension '$rvm_archive_extension'. \ \nHalting the installation." return 1 ;; esac if [[ -d "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" ]] ; then rm -rf "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" fi mv "/tmp/rvm_src_$$/$(builtin cd /tmp/rvm_src_$$ ; ls)" "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" ; rm -rf "/tmp/rvm_src_$$" if [[ -n "${rvm_ruby_name:-""}" && -d "${rvm_src_path:-"$rvm_path/src"}/$(echo $rvm_ruby_string | sed -e 's/-n.*//')" ]] ; then mv "${rvm_src_path:-"$rvm_path/src"}/$(echo "$rvm_ruby_string" | sed -e 's/-n.*//')" "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" fi "$rvm_path/scripts/log" "info" \ "$rvm_ruby_string - #extracted to ${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" else "$rvm_path/scripts/log" "info" \ "$rvm_ruby_string - #extracted to ${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string (already extracted)" fi return 0 else mkdir -p "${rvm_repo_path:-"$rvm_path/repos"}" if [[ -n "$(echo "$rvm_ruby_url" | awk '/git/')" ]] ; then if [[ -d "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string/.git" ]] ; then builtin cd "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" if [[ -z "$rvm_ruby_revision" ]] ; then "$rvm_path/scripts/log" "info" \ "Pulling from $rvm_ruby_repo_url, this may take a while depending on your connection..." git pull origin master --force result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to update the source from the remote repository. \ \nHalting the installation." return $result fi else if [[ -z "${rvm_ruby_sha:-""}" ]] ; then git checkout HEAD else git checkout $(echo "$rvm_ruby_sha" | sed 's#^s##') fi result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to checkout the source branch. \ \nHalting the installation." return $result fi fi else rm -rf "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" rvm_ruby_repo_http_url="${rvm_ruby_repo_url//git:/http:/}" "$rvm_path/scripts/log" "info" \ "Cloning from $rvm_ruby_repo_url, this may take a while depending on your connection..." git clone --depth 1 "$rvm_ruby_repo_url" \ "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "info" \ "cloning from $rvm_ruby_repo_url failed, now attempting to clone from $rvm_ruby_repo_http_url, this may take a while depending on your connection..." git clone "$rvm_ruby_repo_http_url" \ "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the repository. \ \nHalting the installation." return $result fi fi fi if [[ -z "$rvm_ruby_repo_branch" ]]; then rvm_ruby_repo_branch="master" fi ( remote="origin" cd "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" if [[ -z "$(git branch | awk "/$rvm_ruby_repo_branch$/")" ]] ; then git checkout -b "$rvm_ruby_repo_branch" --track "$remote/$rvm_ruby_repo_branch" 2>/dev/null elif [[ -z "$(git branch | awk "/\* $rvm_ruby_repo_branch$/")" ]] ; then if ! git checkout $rvm_ruby_repo_branch 2>/dev/null ; then "$rvm_path/scripts/log" "error" \ "Branch $remote/$rvm_ruby_repo_branch not found." fi fi ) else if [[ -n "${rvm_ruby_tag:-""}" ]] ; then # TODO: Check if tag v is valid rvm_ruby_url="${rvm_ruby_url:-"$rvm_ruby_repo_url/tags/$(echo "$rvm_ruby_tag" | sed 's/^t//')"}" elif [[ -z "${rvm_ruby_version:-""}" && ${rvm_head_flag:-0} -eq 1 ]] ; then rvm_ruby_url="${rvm_ruby_url:-"$rvm_ruby_repo_url/trunk"}" elif [[ "${rvm_ruby_major_version:-""}" = "9" ]] ; then if [[ -z "${rvm_ruby_minor_version:-""}" || "${rvm_ruby_minor_version:-""}" = 3 ]] ; then rvm_ruby_url="${rvm_ruby_url:-"$rvm_ruby_repo_url/trunk"}" else rvm_ruby_url="${rvm_ruby_url:-"$rvm_ruby_repo_url/branches/ruby_${rvm_ruby_release_version}_${rvm_ruby_major_version}_${rvm_ruby_minor_version}"}" fi elif [[ -z "${rvm_ruby_minor_version:-""}" || "${rvm_ruby_major_version:-""}.${rvm_ruby_minor_version:-""}" = "8.8" ]] ; then rvm_ruby_url="${rvm_ruby_url:-"$rvm_ruby_repo_url/branches/ruby_${rvm_ruby_release_version}_${rvm_ruby_major_version}"}" else rvm_ruby_url="${rvm_ruby_url:-"$rvm_ruby_repo_url/branches/ruby_${rvm_ruby_release_version}_${rvm_ruby_major_version}_${rvm_ruby_minor_version}"}" fi rvm_rev="" if [[ -n "${rvm_ruby_revision:-""}" ]] ; then rvm_rev="-$rvm_ruby_revision" fi if [[ -d "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string/.svn" ]] ; then builtin cd "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" "$rvm_path/scripts/log" "info" "Updating ruby from $rvm_ruby_url" __rvm_run "svn.switch" "svn switch $rvm_ruby_url" __rvm_run "svn.update" "svn update" if [[ -n "${rvm_rev:-""}" ]] ; then "$rvm_path/scripts/log" "info" "Checking out revision ${rvm_rev/-r/-r } from $rvm_ruby_url" __rvm_run "svn.checkout" "svn update -q ${rvm_rev/-r/-r }" fi else rm -rf "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" __rvm_run "svn.checkout" \ "svn checkout -q ${rvm_rev/-r/-r } $rvm_ruby_url ${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" \ "Downloading source from ${rvm_ruby_url}." fi result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch / update the source. \ \nHalting the installation." return $result fi fi "$rvm_path/scripts/log" "info" "Copying from repo to src path..." rm -rf "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" cp -R "${rvm_repos_path:-"$rvm_path/repos"}/$rvm_ruby_string" \ "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" fi return ${result:-0} } __rvm_check_default() { local default_ruby_interpreter current_ruby_interpreter default_ruby_interpreter="$(rvm alias show default 2>/dev/null \ | awk -F"${rvm_gemset_separator:-"@"}" '{print $1}')" current_ruby_interpreter="$(echo "$rvm_ruby_string" \ | awk -F"${rvm_gemset_separator:-"@"}" '{print $1}')" if [[ -n "$current_ruby_interpreter" \ && "$current_ruby_interpreter" = "$default_ruby_interpreter" ]]; then __rvm_run_with_env 'default.restore' 'system' \ 'rvm use system --default' 'Removing default ruby interpreter' fi return $? } __rvm_uninstall_ruby() { local dir if [[ ${rvm_ruby_selected_flag} -eq 0 ]] ; then __rvm_select ; fi if [[ -n "${rvm_ruby_string:-""}" ]] ; then for dir in "$rvm_path/rubies" ; do if [[ -d "$dir/$rvm_ruby_string" ]] ; then "$rvm_path/scripts/log" "info" "Removing $dir/$rvm_ruby_string..." rm -rf $dir/$rvm_ruby_string else "$rvm_path/scripts/log" "info" \ "$dir/$rvm_ruby_string has already been removed." fi if [[ -e "${rvm_bin_path:-"$rvm_path/bin"}/$rvm_ruby_string" ]] ; then rm -f "${rvm_bin_path:-"$rvm_path/bin"}/$rvm_ruby_string" fi done __rvm_remove_install_record "$rvm_ruby_string" __rvm_remove_gemsets __rvm_check_default else "$rvm_path/scripts/log" "fail" \ "Cannot uninstall unknown package '$rvm_ruby_string'" fi unset rvm_uninstall_flag return 0 } __rvm_remove_ruby() { local dir if [[ ${rvm_ruby_selected_flag:-0} -eq 0 ]] ; then __rvm_select ; fi if [[ -n "${rvm_ruby_string:-""}" ]] ; then for dir in ${rvm_src_path:-"$rvm_path/src"} $rvm_path/rubies ; do if [[ -d $dir/$rvm_ruby_string ]] ; then "$rvm_path/scripts/log" "info" "Removing $dir/$rvm_ruby_string..." rm -rf "$dir/$rvm_ruby_string" else "$rvm_path/scripts/log" "info" \ "it seems that $dir/$rvm_ruby_string is already non existent." fi if [[ -e "${rvm_bin_path:-"$rvm_path/bin"}/$rvm_ruby_string" ]] ; then rm -f "${rvm_bin_path:-"$rvm_path/bin"}/$rvm_ruby_string" fi __rvm_check_default done __rvm_remove_install_record "$rvm_ruby_string" __rvm_remove_gemsets __rvm_remove_archives __rvm_remove_aliases __rvm_remove_wrappers __rvm_remove_environments __rvm_remove_binaries else "$rvm_path/scripts/log" "fail" \ "Cannot remove unknown package '$rvm_ruby_string'" return 1 fi unset rvm_remove_flag return 0 } __rvm_remove_gemsets() { local gemset gemsets if [[ ${rvm_gems_flag:-0} -eq 1 ]] ; then "$rvm_path/scripts/log" "info" "Removing $rvm_ruby_string gemsets..." gemsets=($(builtin cd "${rvm_gems_path:-"$rvm_path/gems"}"/ ; \ find . -maxdepth 1 -mindepth 1 -type d)) for gemset in "${gemsets[@]//.\/}" ; do if [[ -d "$gemset" ]] ; then rm -rf "$gemset" fi done fi } __rvm_remove_wrappers() { "$rvm_path/scripts/log" "info" "Removing $rvm_ruby_string wrappers..." local wrapper wrappers wrappers=($(find "$rvm_path/wrappers" -maxdepth 1 -mindepth 1 -type d -iname "*$rvm_ruby_string*" 2>/dev/null)) for wrapper in "${wrappers[@]}" ; do rm -rf "$wrapper" done return 0 } __rvm_remove_environments() { "$rvm_path/scripts/log" "info" "Removing $rvm_ruby_string environments..." local environments environment environments=($(find "$rvm_path/environments" -maxdepth 1 -mindepth 1 -type f -iname "*$rvm_ruby_string*" )) for environment in "${environments[@]}" ; do if [[ -d "$environment" ]] ; then rm -rf "$environment" fi done return 0 } __rvm_remove_aliases() { "$rvm_path/scripts/log" "info" "Removing $rvm_ruby_string aliases..." local alias_name aliases aliases=($(awk '/'$rvm_ruby_string'/' "$rvm_path/config/alias" | sed 's/=.*//')) for alias_name in "${aliases[@]}" ; do # Remove from alias key-value store "$rvm_path/scripts/alias" delete "$alias_name" >/dev/null 2>&1 done } __rvm_remove_archives() { if [[ ${rvm_archive_flag:-0} -eq 1 ]] ; then "$rvm_path/scripts/log" "info" "Removing $rvm_ruby_string archives..." rm -f "${rvm_archives_path:-"$rvm_path/archives"}/${rvm_ruby_package_file}.${rvm_archive_extension}" fi } __rvm_remove_binaries() { "$rvm_path/scripts/log" "info" "Removing $rvm_ruby_string binaries..." # Iterate over all binaries and check for symlinked wrappers etc. local binary_name binaries full_patch_path binaries=($(find "${rvm_bin_path:-"$rvm_path/bin"}" -maxdepth 1 -mindepth 1 -type f -iname "*$rvm_ruby_string*" )) for binary_name in "${binaries[@]}" ; do full_binary_path="${rvm_bin_path:-"$rvm_path/bin"}/$binary_name" if [[ -L "$full_binary_path" ]] \ && "$rvm_path/scripts/match" "$(readlink "$full_binary_path")" "$rvm_ruby_string"; then rm -f "$full_binary_path" fi done ; unset binaries return 0 } __rvm_post_install() { local rvm_ruby_aliases ruby_alias binary if [[ "$rvm_ruby_interpreter" != "jruby" ]] ; then if [[ ${#binaries[@]} -lt 1 ]] ; then binaries=(gem irb erb ri rdoc testrb rake) fi "$rvm_path/scripts/log" "info" \ "$rvm_ruby_string - adjusting #shebangs for ($binaries)." for binary in "${binaries[@]}" ; do if [[ -e "$rvm_ruby_home/bin/$binary" \ || -e "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/bin/$binary" ]] ; then if [[ "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string" != "$rvm_ruby_home" \ && -f "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/bin/$binary" ]] ; then cp -f "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/bin/$binary" "$rvm_ruby_home/bin/$binary" elif [[ -f "$rvm_ruby_gem_home/bin/$binary" ]] ; then cp -f "$rvm_ruby_gem_home/bin/$binary" "$rvm_ruby_home/bin/$binary" fi __rvm_inject_gem_env "$rvm_ruby_home/bin/$binary" __rvm_inject_ruby_shebang "$rvm_ruby_home/bin/$binary" chmod +x "$rvm_ruby_home/bin/$binary" fi done binaries=(gem irb erb ri rdoc testrb rake) fi # Import the initial gemsets. __rvm_run_with_env "gemsets.initial" "$rvm_ruby_string" \ "'$rvm_path/scripts/gemsets' initial" \ "$rvm_ruby_string - #importing default gemsets ($rvm_path/gemsets/)" __rvm_irbrc __rvm_generate_default_docs if [[ -n "$rvm_ruby_aliases" ]]; then "$rvm_path/scripts/log" "info" "Setting up aliases for $rvm_ruby_string" while read -r ruby_alias; do "$rvm_path/scripts/log" info "Aliasing $rvm_ruby_string to $ruby_alias" "$rvm_path/scripts/alias" delete "$ruby_alias" > /dev/null 2>&1 "$rvm_path/scripts/alias" create "$ruby_alias" "$rvm_ruby_string" > /dev/null 2>&1 done < <(echo "$rvm_ruby_string" | \tr ' ' '\n' | sort -u) fi } __rvm_generate_default_docs() { if [[ "$rvm_docs_flag" = "1" && "$rvm_ruby_interpreter" != "macruby" ]]; then __rvm_run_with_env "docs.generate" "$rvm_ruby_string" \ "rvm docs generate-ri" "Attempting to generate ri documentation..." fi } __rvm_rubygems_setup() { local home path dir directory_name version_number ruby_lib_gem_path if [[ -n "$(echo "$rvm_ruby_version" | awk '/^1\.9/')" \ || -n "$(echo "$rvm_ruby_interpreter" | awk '/^mput/')" ]] ; then install=0 elif [[ "$rvm_ruby_string" = "ruby-head" ]] ; then install=0 else install=1 fi __rvm_use if [[ "$install" -eq 0 ]] ; then # 1.9.X has it's own built-in gem command __rvm_inject_ruby_shebang "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/bin/gem" __rvm_inject_gem_env "$rvm_ruby_home/bin/gem" cp "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/bin/gem" "$rvm_ruby_home/bin/gem" home="$GEM_HOME" ; path="$GEM_PATH" # Save for dir in $rvm_ruby_global_gems_path $rvm_ruby_gem_home ; do export GEM_HOME="$dir" ; export GEM_PATH="$dir" ; export BUNDLE_PATH="$dir" __rvm_run "rubygems.update" \ "$rvm_ruby_home/bin/gem update --system" "$rvm_ruby_string - updating #rubygems for $dir" done GEM_HOME="$home" ; GEM_PATH="$path" ; BUNDLE_PATH="$home" export GEM_HOME GEM_PATH BUNDLE_PATH __rvm_inject_ruby_shebang "$rvm_ruby_home/bin/gem" __rvm_inject_gem_env "$rvm_ruby_home/bin/gem" directory_name="$rvm_ruby_home/lib/ruby/gems" version_number="${rvm_ruby_release_version}.${rvm_ruby_major_version}" if [[ "$version_number" == "." ]]; then # TODO: Investigate this if statement, something feels not quite right. version_number="$(builtin cd "$directory_name" ; \ find . -maxdepth 1 -mindepth 1 -type f \ | \grep '^[[:digit:]].[[:digit:]]\(.[[:digit:]]\)\?' | head -n1)" version_number="${version_number//.\/}" if [[ -n "$version_number" ]]; then ruby_lib_gem_path="${directory_name}/${version_number}" else ruby_lib_gem_path="" fi else ruby_lib_gem_path="${directory_name}/${version_number}" fi elif [[ -n "$(echo "$rvm_ruby_interpreter" | awk '/^rbx|jruby/')" ]] ; then # Hands off rubygems for rbx & jruby if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then "$rvm_path/scripts/log" "debug" \ "Skipping rubygems update for $rvm_ruby_version" fi ruby_lib_gem_path="$rvm_ruby_home/lib/ruby/gems/jruby" else "$rvm_path/scripts/log" "info" \ "$rvm_ruby_string - #rubygems installing to $rvm_ruby_string" rvm_rubygems_version="$(__rvm_db "${rvm_ruby_interpreter}_rubygems_version")" rvm_rubygems_version="${rvm_rubygems_version:-"$(__rvm_db "rubygems_version")"}" rvm_rubygems_url=$(__rvm_db "rubygems_${rvm_rubygems_version}_url") rvm_gem_package_name="rubygems-$rvm_rubygems_version" rvm_gem_url="$rvm_rubygems_url/$rvm_gem_package_name.tgz" # Sanity check... If setup.rb is missing from the rubygems source path, # something went wrong. Cleanup, aisle 3! if [[ ! -f "${rvm_src_path:-"$rvm_path/src"}/$rvm_gem_package_name/setup.rb" ]]; then rm -rf "${rvm_src_path:-"$rvm_path/src"}/$rvm_gem_package_name" fi if [[ ! -d "${rvm_src_path:-"$rvm_path/src"}/$rvm_gem_package_name" ]] ; then "$rvm_path/scripts/log" "info" "Retrieving $rvm_gem_package_name" "$rvm_path/scripts/fetch" "$rvm_gem_url" result=$? if [[ "$result" -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There has been an error while trying to fetch the source. Halting the installation." ; return $result fi if [[ ! -d "${rvm_src_path:-"$rvm_path/src"}/$rvm_gem_package_name" ]] ; then mkdir -p "${rvm_src_path:-"$rvm_path/src"}/$rvm_gem_package_name" fi __rvm_run "rubygems.extract" \ "gunzip < \"${rvm_archives_path:-"$rvm_path/archives"}/$rvm_gem_package_name.tgz\" | tar xf - -C ${rvm_src_path:-"$rvm_path/src"}" \ "Extracting $rvm_gem_package_name ..." fi builtin cd "${rvm_src_path:-"$rvm_path/src"}/$rvm_gem_package_name" __rvm_run "rubygems.install" \ "GEM_PATH='$rvm_ruby_gem_path:$rvm_ruby_global_gems_path' GEM_HOME='$rvm_ruby_gem_home' BUNDLE_PATH='$rvm_ruby_gem_home' $rvm_ruby_home/bin/ruby ${rvm_src_path:-"$rvm_path/src"}/$rvm_gem_package_name/setup.rb" result=$? if [[ $result -gt 0 ]] ; then "$rvm_path/scripts/log" "warning" \ "$rvm_ruby_string - #warning Installation of rubygems $rvm_ruby_package_name did not complete successfully." fi __rvm_inject_ruby_shebang "$rvm_ruby_home/bin/gem" if [[ -n "$rvm_ruby_major_version" ]] ; then ruby_lib_gem_path="$rvm_ruby_home/lib/ruby/gems/${rvm_ruby_release_version}.$rvm_ruby_major_version" else ruby_lib_gem_path="$rvm_ruby_home/lib/ruby/gems/$interpreter" fi fi if [[ -n "$ruby_lib_gem_path" ]]; then # Add ruby's gem path to ruby's lib direcotry. if [[ -d "$ruby_lib_gem_path" ]] ; then rm -rf "$ruby_lib_gem_path" fi mkdir -p ${ruby_lib_gem_path%\/*} ln -nfs "$rvm_ruby_gem_home" "$ruby_lib_gem_path" fi if [[ -s "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/bin/rdoc" ]] ; then __rvm_inject_ruby_shebang "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/bin/rdoc" fi if [[ -s "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/bin/rake" ]] ; then __rvm_inject_ruby_shebang "${rvm_src_path:-"$rvm_path/src"}/$rvm_ruby_string/bin/rake" fi return ${result:-0} } __rvm_inject_ruby_shebang() { local actual_file __rvm_actual_file $1 if [[ -f "$actual_file" ]] ; then sed -e '1,1s=.*=#!'"/usr/bin/env ruby=" ${actual_file} > "${actual_file}.new" mv "${actual_file}.new" "${actual_file}" ; chmod +x "$actual_file" fi } __rvm_inject_gem_env() { local actual_file string __rvm_actual_file $1 if [[ -s "$actual_file" ]] ; then if [[ -n "$(head -n 1 "$actual_file" | awk '/[j]*ruby/')" ]] ; then string="ENV['GEM_HOME']=ENV['GEM_HOME'] || '$rvm_ruby_gem_home'\nENV['GEM_PATH']=ENV['GEM_PATH'] || '$rvm_ruby_gem_path'\nENV['PATH']='$rvm_ruby_gem_home/bin:$rvm_ruby_global_gems_path/bin:$rvm_ruby_home/bin:' + ENV['PATH']\nENV['BUNDLE_PATH']=ENV['BUNDLE_PATH'] || '$rvm_ruby_gem_home'\n" elif [[ -n "$(head -n 1 "$actual_file" | awk '/bash/')" ]] ; then string="GEM_HOME=\${GEM_HOME:-'$rvm_ruby_gem_home'}\nGEM_PATH=\${GEM_PATH:-'$rvm_ruby_gem_home:$rvm_ruby_global_gems_path'}\nPATH=$rvm_ruby_gem_home/bin:$rvm_ruby_global_gems_path/bin:$rvm_ruby_home/bin:\$PATH\nBUNDLE_PATH=\${BUNDLE_PATH:-'$rvm_ruby_gem_home'}\n" fi if [[ -n "$string" ]] ; then awk "NR==2 {print \"$string\"} {print}" "$actual_file" \ > "$actual_file.new" mv $actual_file.new $actual_file ; chmod +x "$actual_file" fi fi return 0 } __rvm_actual_file() { if [[ -L "$1" ]] ; then # If the file is a symlink, actual_file="$(readlink $1)" # read the link target so we can preserve it. else actual_file="$1" fi return 0 } __rvm_manage_rubies() { local manage_result bin_line manage_result=0 rvm_gemset_name="" rvm_ruby_selected_flag=0 rvm_ruby_gem_home="${rvm_ruby_gem_home:-""//${rvm_gemset_separator:-"@"}*}" rvm_ruby_string="${rvm_ruby_string:-""//${rvm_gemset_separator:-"@"}*}" # Given list of ruby strings. if [[ -n "${rubies_string:-""}" ]] ;then for rvm_ruby_string in "${rubies_string//,/ }" ; do current_manage_ruby_string="$rvm_ruby_string" eval "__rvm_${action}_ruby" result="$?" if [[ "$result" -gt 0 && "$manage_result" = 0 ]]; then manage_result="$result" fi if [[ "$result" = 0 && "$action" = "install" ]] ; then __rvm_record_install "$current_manage_ruby_string" fi unset current_manage_ruby_string __rvm_unset_ruby_variables done else # all if [[ "$action" != "install" && "$action" != "remove" \ && "$action" != "uninstall" ]] ; then local ruby_string while read -r ruby_string do # Keep this on second line damnit! if [[ -x "$ruby_string" ]] ; then rvm_ruby_string="$ruby_string" eval "__rvm_${action}_ruby" result="$?" if [[ "$result" -gt 0 && "$manage_result" = 0 ]]; then manage_result="$result" fi # record as current_manage_string to prevent it being overridden. if [[ "$result" = 0 && "$action" = "install" ]] ; then __rvm_record_install "$ruby_string" fi __rvm_unset_ruby_variables fi done < <(builtin cd "$rvm_path/rubies" ; \ find . -maxdepth 1 -mindepth 1 -type d 2> /dev/null | sed -e 's#./##g') else "$rvm_path/scripts/log" "warn" \ 'Really? '"$action"' all? See "rvm list known" and limit the selection to something more sane please :)' fi fi # TODO: This should return the exit status of the command that got called. return $manage_result } args=($*) action="${args[0]:-""}" rubies_string="${args[1]:-""}" args="$(echo ${args[@]:2}) " # Strip trailing / leading / extra spacing. binaries=() __rvm_manage_rubies exit $?