#!/usr/bin/env bash is_a_function() { \typeset -f $1 >/dev/null 2>&1 || return $? } # Functions RVM is built on # __rvm_string_match if [[ -n "${ZSH_VERSION:-}" ]] then __rvm_string_match() { \typeset _string _search _string="$1" shift while (( $# )) do _search="$1" _search="${_search// /[[:space:]]}" _search="${_search//\#/\#}" eval "\ case \"\${_string}\" in\ ($_search) return 0 ;;\ esac\ " shift done return 1 } else __rvm_string_match() { \typeset _string _string="$1" shift while (( $# )) do case "${_string}" in (${1// /[[:space:]]}) return 0 ;; esac shift done return 1 } fi __rvm_array_contains() { \typeset _search _iterator _search="$1" shift for _iterator do case "${_iterator}" in (${_search}) return 0 ;; esac done return 1 } __rvm_array_add_or_update() { \typeset _array_name _variable _separator _value _local_value \typeset -a _array_value_old _array_value_new _array_name="$1" _variable="$2" _separator="$3" _value="${4##${_separator}}" _array_value_new=() eval "_array_value_old=( \"\${${_array_name}[@]}\" )" case " ${_array_value_old[*]} " in (*[[:space:]]${_variable}*) for _local_value in "${_array_value_old[@]}" do case "${_local_value}" in (${_variable}*) _array_value_new+=( "${_local_value}${_separator}${_value}" ) ;; (*) _array_value_new+=( "${_local_value}" ) ;; esac done ;; (*) _array_value_new=( "${_array_value_old[@]}" "${_variable}${_value}" ) ;; esac eval "${_array_name}=( \"\${_array_value_new[@]}\" )" } __rvm_array_prepend_or_ignore() { \typeset _array_name _variable _separator _value _prefix _local_value \typeset -a _array_value_old _array_value_new _array_name="$1" _variable="$2" _separator="$3" _value="$4" _prefix="$5" _array_value_new=() eval "_array_value_old=( \"\${${_array_name}[@]}\" )" case " ${_array_value_old[*]} " in (*[[:space:]]${_variable}*) for _local_value in "${_array_value_old[@]}" do case "${_local_value}" in (${_variable}*${_prefix}*) rvm_debug "__rvm_array_prepend_or_ignore ${_array_name} ${_local_value}" _array_value_new+=( "${_local_value}" ) ;; (${_variable}*) rvm_debug "__rvm_array_prepend_or_ignore ${_array_name} ${_variable}\"${_value}${_separator}${_local_value#${_variable}}\"" _array_value_new+=( "${_variable}${_value}${_separator}${_local_value#${_variable}}" ) ;; (*) _array_value_new+=( "${_local_value}" ) ;; esac done eval "${_array_name}=( \"\${_array_value_new[@]}\" )" ;; esac } # Drop in replacement for sed -i compatible with OpenBSD # Assumes that filename is the first argument, all others are passed onto sed __rvm_sed_i() { \typeset _filename _executable _user [[ -n "${1:-}" ]] || { rvm_debug "no file given for __rvm_sed_i" return 0 } _filename="$1" shift if [[ -x "${_filename}" ]] then _executable=true fi _user="$( __rvm_statf "%u:%g" "%u:%g" "${_filename}" )" { __rvm_sed "$@" < "${_filename}" > "${_filename}.new" && \command \mv -f "${_filename}.new" "${_filename}" } 2>&1 | rvm_debug_stream if [[ -n "${_executable:-}" && ! -x "${_filename}" ]] then chmod +x "${_filename}" fi if [[ "$_user" != "$( __rvm_statf "%u:%g" "%u:%g" "${_filename}" )" ]] then chown "$_user" "${_filename}" fi } # Drop in cd which _doesnt't_ respect cdpath __rvm_cd() { \typeset old_cdpath ret ret=0 old_cdpath="${CDPATH}" CDPATH="." chpwd_functions="" builtin cd "$@" || ret=$? CDPATH="${old_cdpath}" return $ret } __rvm_setup_utils_functions() { \typeset gnu_tools_path gnu_prefix gnu_util \typeset -a gnu_utils gnu_missing gnu_utils=( awk cp date find sed tail tar xargs ) gnu_missing=() if is_a_function __rvm_setup_utils_functions_${_system_name} then __rvm_setup_utils_functions_${_system_name} "$@" || return $? else __rvm_setup_utils_functions_Other "$@" || return $? fi } __rvm_setup_utils_functions_Solaris() { case "${_system_version}" in (10) gnu_tools_path=/opt/csw/bin gnu_prefix="g" ;; (11) gnu_tools_path=/usr/gnu/bin gnu_prefix="" ;; esac if [[ -x $gnu_tools_path/${gnu_prefix}grep ]] then eval "__rvm_grep() { GREP_OPTIONS=\"\" $gnu_tools_path/${gnu_prefix}grep \"\$@\" || return \$?; }" else gnu_missing+=( ${gnu_prefix}grep ) fi if [[ "${_system_name}" == "OpenIndiana" || "${_system_version}" == "11" ]] then __rvm_stat() { \command \stat "$@" || return $?; } elif [[ -x $gnu_tools_path/${gnu_prefix}stat ]] then eval "__rvm_stat() { $gnu_tools_path/${gnu_prefix}stat \"\$@\" || return \$?; }" else gnu_missing+=( ${gnu_prefix}stat ) fi if [[ "${_system_name}" == "SmartOS" ]] then __rvm_which() { \command \which "$@" || return $?; } elif [[ -x $gnu_tools_path/${gnu_prefix}which ]] then eval "__rvm_which() { $gnu_tools_path/${gnu_prefix}which \"\$@\" || return \$?; }" else gnu_missing+=( ${gnu_prefix}which ) fi for gnu_util in "${gnu_utils[@]}" do if [[ -x $gnu_tools_path/$gnu_prefix$gnu_util ]] then eval "__rvm_$gnu_util() { $gnu_tools_path/$gnu_prefix$gnu_util \"\$@\" || return \$?; }" else gnu_missing+=( $gnu_prefix$gnu_util ) fi done if (( ${#gnu_missing[@]} )) then rvm_error "ERROR: Missing GNU tools: ${gnu_missing[@]}. Make sure they are installed in '$gnu_tools_path/' before using RVM!" if [[ "${_system_name} ${_system_version}" == "Solaris 10" ]] then rvm_error "You might want to look at OpenCSW project to install the above mentioned tools (https://www.opencsw.org/about)" fi exit 200 fi } __rvm_setup_utils_functions_OSX() { if [[ -x /usr/bin/stat ]] then __rvm_stat() { /usr/bin/stat "$@" || return $?; } else rvm_error "ERROR: Missing (executable) /usr/bin/stat. Falling back to '\\\\command \\\\stat' which might be something else." __rvm_stat() { \command \stat "$@" || return $?; } fi __rvm_setup_utils_functions_common } __rvm_setup_utils_functions_Other() { __rvm_stat() { \command \stat "$@" || return $?; } __rvm_setup_utils_functions_common } __rvm_setup_utils_functions_common() { __rvm_grep() { GREP_OPTIONS="" \command \grep "$@" || return $?; } if \command \which --skip-alias --skip-functions which >/dev/null 2>&1 then __rvm_which() { \command \which --skip-alias --skip-functions "$@" || return $?; } elif \command \which whence >/dev/null 2>&1 && \command \whence whence >/dev/null 2>&1 then __rvm_which() { \command \whence -p "$@" || return $?; } elif \command \which which >/dev/null 2>&1 then __rvm_which() { \command \which "$@" || return $?; } elif \which which >/dev/null 2>&1 then __rvm_which() { \which "$@" || return $?; } else \typeset __result=$? rvm_error "ERROR: Missing proper 'which' command. Make sure it is installed before using RVM!" return ${__result} fi for gnu_util in "${gnu_utils[@]}" do eval "__rvm_$gnu_util() { \\$gnu_util \"\$@\" || return \$?; }" done } __rvm_setup_utils_functions || return $? # detect system after setting up __rvm_sed and before setting up __rvm_statf source "${rvm_scripts_path}/functions/db" source "${rvm_scripts_path}/functions/detect/system" __rvm_setup_statf_function() { if [[ "${_system_type}" == Darwin || "${_system_type}" == BSD ]] then __rvm_statf() { __rvm_stat -f "$2" "$3" } else __rvm_statf() { __rvm_stat -c "$1" "$3" } fi } __rvm_setup_statf_function || return $? __rvm_setup_sudo_function() { if is_a_function __rvm_setup_sudo_function_${_system_name} then __rvm_setup_sudo_function_${_system_name} "$@" || return $? else __rvm_setup_sudo_function_Other "$@" || return $? fi } __rvm_setup_sudo_function_PCLinuxOS() { __rvm_sudo() { if [[ "$1" == "-p" ]] then rvm_printf_to_stderr "${2//%p/[root]/}" shift 2 fi su -c "$*" } } __rvm_setup_sudo_function_Solaris() { if [[ -x /opt/csw/bin/sudo ]] then __rvm_sudo() { /opt/csw/bin/sudo "$@" } elif [[ -x /usr/bin/sudo ]] then __rvm_sudo() { /usr/bin/sudo "$@" } else rvm_debug "Warning: No '/opt/csw/bin/sudo' found." fi } __rvm_setup_sudo_function_Other() { if __rvm_which sudo >/dev/null 2>&1 then __rvm_sudo() { \command \sudo "$@" } else rvm_debug "Warning: No 'sudo' found." fi } __rvm_setup_sudo_function || return $? # Utils that are not needed for RVM installation # but have non-standard paths in Solaris 10 other_utils=( ant automake autoreconf libtoolize make mount patch readlink ) if [[ "${_system_name} ${_system_version}" == "Solaris 10" ]] then __rvm_ant() { /usr/sfw/bin/ant "$@" || return $?; } __rvm_automake() { /opt/csw/bin/automake "$@" || return $?; } __rvm_autoreconf() { /opt/csw/bin/autoreconf "$@" || return $?; } __rvm_libtoolize() { /opt/csw/bin/libtoolize "$@" || return $?; } __rvm_make() { /opt/csw/bin/gmake "$@" || return $?; } __rvm_mount() { /sbin/mount "$@" || return $?; } __rvm_patch() { /opt/csw/bin/gpatch "$@" || return $?; } __rvm_readlink() { /opt/csw/bin/greadlink "$@" || return $?; } else for other_util in "${other_utils[@]}" do eval "__rvm_$other_util() { \\$other_util \"\$@\" || return \$?; }" done fi unset other_util other_utils __rvm_readlink_deep() { eval " while [[ -n \"\${$1}\" && -L \"\${$1}\" ]] do $1=\"\$(__rvm_readlink \"\${$1}\")\" done " } ## duplication marker 32fosjfjsznkjneuera48jae __rvm_curl_output_control() { if (( ${rvm_quiet_curl_flag:-0} == 1 )) then __flags+=( "--silent" "--show-error" ) elif [[ " $*" == *" -s"* || " $*" == *" --silent"* ]] then # make sure --show-error is used with --silent [[ " $*" == *" -S"* || " $*" == *" -sS"* || " $*" == *" --show-error"* ]] || { __flags+=( "--show-error" ) } fi } ## duplication marker 32fosjfjsznkjneuera48jae # -S is automatically added to -s __rvm_curl() ( \typeset curl_path if [[ "${_system_name} ${_system_version}" == "Solaris 10" ]] && ! __rvm_which curl >/dev/null 2>&1 then curl_path=/opt/csw/bin/ else curl_path="" fi __rvm_which ${curl_path}curl >/dev/null 2>&1 || { rvm_error "RVM requires 'curl'. Install 'curl' first and try again." return 200 } \typeset -a __flags __flags=( --fail --location ) # allow overriding default 30 minutes for download, but should be plenty of time if [[ -n "${rvm_curl_flags[*]}" ]] then __flags+=( "${rvm_curl_flags[@]}" ) else __flags+=( --max-redirs 10 --max-time 1800 ) fi [[ "$*" == *"--max-time"* ]] || [[ "$*" == *"--connect-timeout"* ]] || [[ "${__flags[*]}" == *"--connect-timeout"* ]] || __flags+=( --connect-timeout 30 --retry-delay 2 --retry 3 ) if [[ -n "${rvm_proxy:-}" ]] then __flags+=( --proxy "${rvm_proxy:-}" ) fi __rvm_curl_output_control unset curl __rvm_debug_command ${curl_path}curl "${__flags[@]}" "$@" || return $? ) is_parent_of() { \typeset name pid ppid pname name=$1 pid=$2 while [[ -n "$pid" && "$pid" != "0" ]] do case "`uname`" in (SunOS) read ppid pname <<<"$(\command \ps -p $pid -o ppid= -o comm=)" ;; (*) read ppid pname <<<"$(\command \ps -p $pid -o ppid= -o ucomm=)" ;; esac if [[ -n "$ppid" && -n "$pname" ]] then if [[ "$pname" == "$name" ]] then echo $pid return 0 else pid=$ppid fi else break fi done return 1 } __rvm_string_includes() { \typeset __search __text="$1" shift for __search in "$@" do if [[ " ${__text} " == *" ${__search} "* ]] then return 0 fi done return 1 } __function_on_stack() { __rvm_string_includes "${FUNCNAME[*]}" "$@" || return $? } # read lines from file / stdin(-) __rvm_read_lines() { \typeset IFS # NEW LINE, BE CAREFUL IFS=" " if [[ "${2:--}" == "-" ]] then eval "$1=( \$( \command \cat - ) )" else eval "$1=( \$( \command \cat \"\${2:--}\" ) )" fi } __setup_lang_fallback() { if [[ -z "${LANG:-}" ]] then LANG="$( { locale -a | __rvm_grep "^en_US.utf8" || locale -a | __rvm_grep "^en_US" || locale -a | __rvm_grep "^en" || locale -a } 2>/dev/null | \command \head -n 1 )" : LANG=${LANG:=en_US.utf-8} export LANG rvm_warn "\$LANG was empty, setting up LANG=$LANG, if it fails again try setting LANG to something sane and try again." fi } __rvm_ruby_config_save() { \typeset ruby_path ruby_path="${1:-$rvm_ruby_home/bin/ruby}" case "$ruby_path" in (*/mruby*) __rvm_ruby_config_save_mruby "${2:-${ruby_path%%/bin/ruby}/config}" ;; (*) __rvm_ruby_config_save_generic "$2" ;; esac } __rvm_ruby_config_save_mruby() { echo "target_cpu=\"$_system_arch\"" > "$1" } __rvm_ruby_config_save_generic() { \typeset config_path default_config_path default_config_path="#{RbConfig::CONFIG[\"prefix\"]}/config" config_path="${1:-$default_config_path}" "$ruby_path" -rrbconfig -e '\ File.open("'"$config_path"'","w") { |file| RbConfig::CONFIG.sort.each{|key,value| file.write("#{key.gsub(/\.|-/,"_")}=\"#{value.to_s.gsub("$","\\$")}\"\n") } } ' >/dev/null 2>&1 } __rvm_record_ruby_configs() { \typeset __dir for __dir in "$rvm_path/rubies/"* do if [[ ! -L "${__dir}" && ! -s "${__dir}/config" && -x "${__dir}/bin/ruby" ]] then __rvm_ruby_config_save "${__dir}/bin/ruby" "${__dir}/config" || { \typeset string="${__dir##*/}" rvm_error " Can not save config data for ruby: '${string}', most likely it is broken installation and you can: - try fix it: 'rvm reinstall ${string}', OR: - remove it: 'rvm uninstall ${string} --gems'" } fi done } __rvm_ls() { \command \ls "$@" || return $?; }