#!/usr/bin/env bash rvm_base_except="selector" source "$rvm_path/scripts/base" result=0 # Set it to cleanup the download on interruption. trap 'cleanup_download' 1 2 3 15 cleanup_download() { [[ -f "$archive" ]] && rm -f "$archive" } record_md5() { if [[ "Darwin" = "$(uname)" ]] || [[ "FreeBSD" = "$(uname)" ]]; then archive_md5="$(/sbin/md5 -q "${archive}")" else archive_md5="$(md5sum "${archive}" | awk '{print $1}')" fi "$rvm_path/scripts/db" "$rvm_path/config/md5" "$archive" "$archive_md5" } builtin cd "${rvm_archives_path:-"$rvm_path/archives"}" # args=($*) # Reserved for future use if [[ -z "$1" ]] ; then "$rvm_path/scripts/log" "fail" \ "BUG: $0 called without an argument :/" exit 1 fi url="$1"; download=1 ; package_name="$2" if ! command -v curl > /dev/null ; then "$rvm_path/scripts/log" "fail" \ "rvm requires curl. curl was not found in your active path." exit 1 elif [[ ! -z ${rvm_proxy} ]] ; then fetch_command="curl -x${rvm_proxy} -L --create-dirs -C - " # -s for silent else fetch_command="curl -L --create-dirs -C - " # -s for silent fi if [[ ! -z "$package_name" ]] ; then fetch_command="${fetch_command} -o ${package_name} " archive="$package_name" else fetch_command="${fetch_command} -O " archive=$(basename "$url") fi if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then "$rvm_path/scripts/log" "debug" \ "Fetching $archive" fi # Check first if we have the correct archive archive_md5="$("$rvm_path/scripts/db" "$rvm_path/config/md5" "$archive" | head -n1)" if [[ -e "$archive" && ! -z "$archive_md5" ]] ; then if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then "$rvm_path/scripts/log" "debug" \ "Found archive and its md5, testing correctness" fi if ! "$rvm_path/scripts"/md5 "${rvm_archives_path:-"$rvm_path/archives"}/${archive}" "$archive_md5" ; then if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then "$rvm_path/scripts/log" "debug" \ "Archive md5 did not match, downloading" fi download=1 else if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then "$rvm_path/scripts/log" "debug" \ "Archive md5 matched, not downloading" fi download=0 result=0 fi else if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then "$rvm_path/scripts/log" "debug" \ "No archive or no MD5, downloading" fi download=1 fi # try to convert the ftp url to a http url http_url="$(echo "$url" | sed -e 's/ftp:/http:/' -e 's/git:/http:/')" if [[ $download -gt 0 ]] ; then rm -f $archive eval $fetch_command "$url" ; result=$? if [[ $result -gt 0 ]] ; then retry=0 try_http=0 if [[ $result -eq 78 ]] ; then "$rvm_path/scripts/log" "error" \ "The requested url does not exist: '$url'" try_http=1 elif [[ $result -eq 18 ]] ; then "$rvm_path/scripts/log" "error" \ "Partial file. Only a part of the file was transferred. Removing partial and re-trying." rm -f "$archive" retry=1 elif [[ $result -eq 33 ]] ; then if [[ ${rvm_debug_flag:-0} -gt 0 ]] ; then "$rvm_path/scripts/log" "debug" \ "Server does not support 'range' command, removing '$archive'" fi rm -f "$archive" retry=1 else "$rvm_path/scripts/log" "error" \ "There was an error, please check ${rvm_log_path:-"$rvm_path/log"}/$rvm_ruby_string/*.log. Next we'll try to fetch via http." try_http=1 fi if [[ $retry -eq 1 ]] ; then eval $fetch_command "$url" ; result=$? if [[ $result -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There was an error, please check ${rvm_log_path:-"$rvm_path/log"}/$rvm_ruby_string/*.log" else record_md5 fi fi if [[ $try_http -eq 1 ]] ; then eval $fetch_command "$http_url" ; result=$? if [[ $result -gt 0 ]] ; then "$rvm_path/scripts/log" "error" \ "There was an error, please check ${rvm_log_path:-"$rvm_path/log"}/$rvm_ruby_string/*.log" else record_md5 fi fi else record_md5 fi fi exit $result