#!/usr/bin/env bash # params: [printf_if=-] [suffix] __rvm_system_path() { rvm_remote_server_path="$(__rvm_db "rvm_remote_server_path${2:-}")" [[ -n "${rvm_remote_server_path}" ]] || rvm_remote_server_path="${_system_name_lowercase}/${_system_version}/${_system_arch}" if [[ "${1:-}" == "-" ]] then printf "%b" "${rvm_remote_server_path}\n" fi } __rvm_remote_extension() { case "$1" in *.tar.*) rvm_remote_extension="tar${1##*tar}" ;; jruby-*) rvm_remote_extension="tar.gz" ;; *) rvm_remote_extension="tar.bz2" ;; esac [[ "$2" != "-" ]] || printf "%b" "${rvm_remote_extension}" } # params: ruby-string-to-transform __rvm_ruby_package_file() { case "$1" in *.tar.*) rvm_ruby_package_file="/$1" ;; rbx*|rubinius*) rvm_ruby_package_file="/${1//rbx/rubinius}.$(__rvm_remote_extension "$1" -)" ;; jruby-head) rvm_ruby_package_file="/jruby-head.$(__rvm_remote_extension "$1" -)" ;; jruby*) \typeset __version __version="$( rvm_ruby_string="$1" rvm_remote_flag=0 __rvm_ruby_string echo "$rvm_ruby_version" )" rvm_ruby_package_file="/${__version}/jruby-dist-${__version}-bin.$(__rvm_remote_extension "$1" -)" ;; "") rvm_ruby_package_file="" ;; ruby*|mruby*) rvm_ruby_package_file="/$1.$(__rvm_remote_extension "$1" -)" ;; *) rvm_ruby_package_file="/ruby-$1.$(__rvm_remote_extension "$1" -)" ;; esac } __rvm_include_travis_binaries() { if [[ $rvm_remote_server_url == *"travis"* && $TRAVIS != true && $_system_name_lowercase == "osx" ]] then rvm_debug "Travis binaries for OSX are not movable and can't be used outside of Travis environment. \ Skip that source." return 1 fi return 0 } __rvm_calculate_remote_file() { rvm_remote_server_url="$( __rvm_db "rvm_remote_server_url${3:-}" )" [[ -n "$rvm_remote_server_url" ]] || { rvm_debug "rvm_remote_server_url${3:-} not found" return $1 } __rvm_include_travis_binaries || return $1 __rvm_system_path "" "${3:-}" __rvm_ruby_package_file "${4:-}" __remote_file="${rvm_remote_server_url}/${rvm_remote_server_path}${rvm_ruby_package_file}" } # params: return_on_end return_on_failed_link [suffix] [file] __rvm_remote_server_path_single() { \typeset __remote_file __rvm_calculate_remote_file "$@" || return $? if [[ -z "${__remote_file:-}" ]] then rvm_debug "No remote file name found" return $1 elif file_exists_at_url "${__remote_file}" then rvm_debug "Remote file exists ${__remote_file}" printf "%b" "$( __rvm_db "rvm_remote_server_verify_downloads${3:-}" ):${__remote_file}" elif [[ -f "${rvm_archives_path}/${rvm_ruby_package_file##*/}" && "${rvm_ruby_package_file##*/}" == *bin-* ]] then rvm_debug "Cached file exists ${__remote_file}" printf "%b" "$( __rvm_db "rvm_remote_server_verify_downloads${3:-}" ):${rvm_archives_path}/${rvm_ruby_package_file##*/}" else rvm_debug "Remote file does not exist ${__remote_file}" return $2 fi } # params: [file_name] __rvm_remote_server_path() { \typeset _iterator _iterator="" while ! __rvm_remote_server_path_single 0 1 "${_iterator}" "${1:-}" do : $(( _iterator+=1 )) done } __list_remote_all() { \typeset _iterator rvm_remote_server_url rvm_remote_server_path _iterator="" while __rvm_db "rvm_remote_server_url${_iterator:-}" rvm_remote_server_url do if __rvm_include_travis_binaries then __rvm_system_path "" "${_iterator}" rvm_debug "__list_remote_all${_iterator:-} $rvm_remote_server_url $rvm_remote_server_path" __list_remote_for "${rvm_remote_server_url}" "$rvm_remote_server_path" fi : $(( _iterator+=1 )) done | \command \sort -u | __rvm_version_sort } __list_remote_for() { __list_remote_for_local "$@" || __list_remote_for_index "$@" || __list_remote_for_s3 "$@" || return $? } __list_remote_for_local() { \typeset __status1 __status2 __status1=0 __status2=0 if [[ -f $rvm_user_path/remote ]] then __rvm_grep "${1}/${2}" < $rvm_user_path/remote || __status1=$? fi __rvm_grep "${1}/${2}" < $rvm_path/config/remote || __status2=$? if (( __status1 || __status2 )) then return 1 else rvm_debug "__list_remote_for_local found" fi true # for OSX } __list_remote_for_index() { if file_exists_at_url "${1}/index.txt" then rvm_debug "__list_remote_for_index ${1}/index.txt" __rvm_curl -s "${1}/index.txt" | GREP_OPTIONS="" \command \grep -E "${1}/${2}/.*\.tar\.(gz|bz2)$" elif file_exists_at_url "${1}/${2}/index.txt" then rvm_debug "__list_remote_for_index ${1}/${2}/index.txt" __rvm_curl -s "${1}/${2}/index.txt" | GREP_OPTIONS="" \command \grep -E "${1}/${2}/.*\.tar\.(gz|bz2)$" else return 1 fi true # for OSX } __list_remote_for_s3() { curl -ILfs "${1}" | __rvm_grep "Server: AmazonS3" >/dev/null || return $? \typeset __tmp_name __iterator __next __local_url __iterator=0 __next="" __tmp_name="$( : ${TMPDIR:=${rvm_tmp_path:-/tmp}} mktemp "${TMPDIR}/tmp.XXXXXXXXXXXXXXXXXX" )" while [[ __iterator -eq 0 || -n "${__next}" ]] do __local_url="${1}?prefix=${2}/${__next:+&marker=${__next}}" rvm_debug "__list_remote_for_s3-${__iterator} ${__local_url}" __rvm_curl -s "${__local_url}" > "${__tmp_name}${__iterator}" GREP_OPTIONS="" \command \grep -oE "[^<]*" < "${__tmp_name}${__iterator}" | __rvm_awk -F"[<>]" '{print $3}' > "${__tmp_name}" if __rvm_grep "true" < "${__tmp_name}${__iterator}" then __next="$(__rvm_tail -n 1 "${__tmp_name}")" else __next="" fi rm "${__tmp_name}${__iterator}" : $(( __iterator+=1 )) done GREP_OPTIONS="" \command \grep -E "${2}/.*\.tar\.(gz|bz2)$" < "${__tmp_name}" | GREP_OPTIONS="" \command \grep -v -- "-src-" | __rvm_awk "{ print "'"'$1/'"'"\$1 }" rm "${__tmp_name}"* } __rvm_get_user_shell() { case "${_system_type}:${_system_name}" in (Linux:*|SunOS:*|BSD:*|Windows:Cygwin) __shell="$( getent passwd $USER )" || { rvm_error "Error checking user shell via getent ... something went wrong, report a bug." return 2 } echo "${__shell##*:}" ;; (Windows:Mingw) __shell="$( echo $SHELL )" || { rvm_error "Error checking user shell from echo $SHELL ... something went wrong, report a bug." return 2 } echo "${__shell##*:}" ;; (Darwin:*) \typeset __version __version="$(dscl localhost -read "/Search/Users/$USER" UserShell)" || { rvm_error "Error checking user shell via dscl ... something went wrong, report a bug." return 3 } echo ${__version#*: } ;; (*) rvm_error "Do not know how to check user shell on '$(command uname)'." return 1 ;; esac }