#!/usr/bin/env bash
source "${rvm_scripts_path}/functions/utility_logging"
source "${rvm_scripts_path}/functions/utility_package"
source "${rvm_scripts_path}/functions/utility_rubygems"
source "${rvm_scripts_path}/functions/utility_system"
__rvm_strings()
{
\typeset strings ruby_strings
ruby_strings=($(echo ${rvm_ruby_args:-$rvm_ruby_string}))
for rvm_ruby_string in "${ruby_strings[@]}" ; do
strings="$strings $(__rvm_select ; echo $rvm_ruby_string)"
done
echo $strings
return 0
}
# Return a list of directories under a given base path.
# Derived from rvm_ruby_string.
__rvm_ruby_string_paths_under()
{
\typeset __search_path part parts IFS
IFS=" "
__search_path="${1%/}" # Strip off any trailing slash
if [[ -n "${ZSH_VERSION:-}" ]]
then parts=(${=rvm_ruby_string//-/ })
else parts=(${rvm_ruby_string//-/ }) # Strip white space.
fi
echo "$__search_path"
for part in "${parts[@]}"
do
__search_path="$__search_path/$part"
echo "$__search_path"
done
}
# Strip whitespace and normalize it all.
__rvm_strip()
{
__rvm_sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//' -e 's/[[:space:]]\{1,\}/ /g'
return $?
}
# remove all entries from $PATH starting with $1
__rvm_remove_from_path()
{
export PATH
\typeset _value
_value="${1//+(\/)//}"
# Guard to prevent removal of the entire path
# https://github.com/rvm/rvm/issues/4759
if
[[ $_value == "/*" ]]
then
return
fi
# remove multiple slashes https://github.com/rvm/rvm/issues/1364
while [[ "$PATH" == *"//"* ]] ; do PATH="${PATH/\/\///}" ; done
while [[ "$PATH" == *"/:"* ]] ; do PATH="${PATH/\/:/:}" ; done
if
__rvm_string_match ":$PATH:" "*:${_value}:*"
then
\typeset -a _path
_path=()
__rvm_custom_separated_array _path : "${PATH}"
__rvm_remove_from_array _path "${_value}" "${_path[@]}"
__rvm_join_array PATH : _path
fi
}
__rvm_add_to_path()
{
export PATH
if (( $# != 2 )) || [[ -z "$2" ]]
then
rvm_error "__rvm_add_to_path requires two parameters"
return 1
fi
__rvm_remove_from_path "$2"
case "$1" in
prepend) PATH="$2:$PATH" ;;
append) PATH="$PATH:$2" ;;
#*) anything else will just remove it from PATH - not adding back
esac
if
[[ -n "${rvm_user_path_prefix:-}" ]]
then
__rvm_remove_from_path "${rvm_user_path_prefix}"
PATH="${rvm_user_path_prefix}:$PATH"
fi
builtin hash -r
}
rvm_is_a_shell_function()
{
\typeset _message
if
(( ${rvm_is_not_a_shell_function:-0} )) &&
[[ "${1:-}" != "no_warning" ]]
then
if rvm_pretty_print stderr
then rvm_log "" # newline when error is shown to user
fi
if rvm_pretty_print stderr
then rvm_error "${rvm_notify_clr:-}RVM is not a function, selecting rubies with '${rvm_error_clr:-}rvm use ...${rvm_notify_clr:-}' will not work."
else rvm_error "RVM is not a function, selecting rubies with 'rvm use ...' will not work."
fi
if
[[ -n "${SUDO_USER:-}" ]]
then
rvm_warn '
Please avoid using "sudo" in front of "rvm".
RVM knows when to use "sudo" and will use it only when it is necessary.
'
else
rvm_warn '
You need to change your terminal emulator preferences to allow login shell.
Sometimes it is required to use `/bin/bash --login` as the command.
Please visit https://rvm.io/integration/gnome-terminal/ for an example.
'
fi
fi
return ${rvm_is_not_a_shell_function:-0}
}
__rvm_version_sort()
{
\command \awk -F'[.-]' -v OFS=. '{ # split on "." and "-", merge back with "."
original=$0 # save original to preserve it before the line is changed
for (n=1; n<10; n++) { # iterate through max 9 components of version
$n=tolower($n) # ignore case for sorting
if ($n == "") $n="0" # treat non existing parts as 0
if ($n ~ /^p[0-9]/) $n=substr($n, 2) # old ruby -p notation
if ($n ~ /^[0-9](rc|b)/) $n=substr($n, 1, 1)". "substr($n, 2) # old jruby 0RC1 notation
if (n == 1 && $n ~ /^[0-9]/) $n="zzz."$n # first group must be a string
if (n > 1 && $n ~ /^[a-z]/) $n=" "$n # names go before numbers thanks to space
}
print $0"\t"original # print the transformed version and original separated by \t
# so we can extract original after sorting
}' \
| LC_ALL=C \sort -t. -k 1,1d -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n \
| \awk -F'\t' '{print $2}'
}
__rvm_version_compare()
{
\typeset first
# first is the lower version number
first="$( \command \printf "%b" "$1\n$3\n" | __rvm_version_sort | \command \head -n1 )"
case "$2" in
(-eq|==|=)
[[ "$1" == "$3" ]] || return $?
;;
(-ne|!=)
[[ "$1" != "$3" ]] || return $?
;;
(-gt|\>)
if [[ "$first" == "head" ]]
then [[ "$first" == "$1" && "$1" != "$3" ]] || return $?
else [[ "$first" == "$3" && "$1" != "$3" ]] || return $?
fi
;;
(-ge|\>=)
if [[ "$first" == "head" ]]
then [[ "$first" == "$1" || "$1" == "$3" ]] || return $?
else [[ "$first" == "$3" || "$1" == "$3" ]] || return $?
fi
;;
(-lt|\<)
if [[ "$first" == "head" ]]
then [[ "$first" == "$3" && "$1" != "$3" ]] || return $?
else [[ "$first" == "$1" && "$1" != "$3" ]] || return $?
fi
;;
(-le|\<=)
if [[ "$first" == "head" ]]
then [[ "$first" == "$3" || "$1" == "$3" ]] || return $?
else [[ "$first" == "$1" || "$1" == "$3" ]] || return $?
fi
;;
(*)
rvm_error "Unsupported operator '$2'."
return 1
;;
esac
return 0
}
# parse comma separated string into an array
# Ex. __rvm_custom_separated_array strings - ruby_string
# adds all elements from `ruby_string` to `strings` array
__rvm_custom_separated_array()
{
\typeset IFS
IFS=$2
if [[ -n "${ZSH_VERSION:-}" ]]
then eval "$1+=( \${=3} )"
else eval "$1+=( \$3 )"
fi
}
__rvm_remove_from_array()
{
\typeset _array_name _iterator _search
\typeset -a _temp_array
_array_name="$1"
_search="$2"
shift 2
_temp_array=()
for _iterator
do
__rvm_string_match "$_iterator" "$_search" || _temp_array+=( "$_iterator" )
done
eval "$_array_name=( \"\${_temp_array[@]}\" )"
}
__rvm_join_array()
{
\typeset IFS
IFS="$2"
eval "$1=\"\${$3[*]}\""
}
# take a variable and cut it only to contain only count fields from separator
# Usage: __rvm_take_n variable count separator
__rvm_take_n()
{
\typeset IFS __temp_counter
\typeset -a __temp_arr1 __temp_arr2
IFS=$3
if [[ -n "${ZSH_VERSION:-}" ]]
then eval "__temp_arr1=( \${=$1} )"
else eval "__temp_arr1=( \$$1 )"
fi
__temp_counter=0
__temp_arr2=()
while (( __temp_counter < $2 ))
do __temp_arr2+=( "${__temp_arr1[__array_start+__temp_counter++]}" )
done
eval "$1=\"\${__temp_arr2[*]}\""
}
__rvm_add_once()
{
\typeset IFS
IFS="|"
eval "[[ \"${IFS}\${${1}[*]}${IFS}\" == \*\"${IFS}\${2}${IFS}\"\* ]] || ${1}+=( \"\${2}\" )"
}
__rvm_find_first_file()
{
\typeset _first_file _variable_first_file __file_enum
_first_file=""
_variable_first_file="$1"
shift
for __file_enum in "$@"
do
if
[[ -f "$__file_enum" ]]
then
eval "$_variable_first_file=\"\$__file_enum\""
return 0
fi
done
eval "$_variable_first_file=\"\""
return 1
}
file_exists_at_url_command()
{
__rvm_curl --silent --insecure --location --list-only \
--max-time ${rvm_max_time_flag:-5} --head "$@" 2>&1 |
__rvm_grep -E 'HTTP/[0-9\.]+ 200' >/dev/null 2>&1 ||
{
\typeset __ret=$?
case ${__ret} in
(28)
rvm_warn "RVM was not able to check existence of remote files with timeout of ${rvm_max_time_flag:-3} seconds
you can increase the timeout by setting it in ~/.rvmrc => rvm_max_time_flag=10"
;;
esac
return ${__ret}
}
}
file_exists_at_url()
(
if
[[ -n "${1:-}" ]]
then
unset curl
file_exists_at_url_command "$1" --insecure ||
{
\typeset __ret=$?
case ${__ret} in
(60)
# detect double --insecure and avoid duplication, see:
# https://github.com/rvm/rvm/issues/2640#issuecomment-35669722
file_exists_at_url_command "$1" || return $?
return 0
;;
(*)
# anything else then 60 just return it
return ${__ret}
;;
esac
}
else
rvm_warn "Warning: URL was not passed to file_exists_at_url"
return 1
fi
)
__rvm_try_sudo()
(
\typeset -a command_to_run
\typeset sudo_path sbin_path missing_paths
command_to_run=( "$@" )
(( UID == 0 )) ||
case "$rvm_autolibs_flag_number" in
(0)
rvm_debug "Running '$*' would require sudo."
return 0
;;
(1)
rvm_warn "Running '$*' would require sudo."
return 0
;;
(2)
rvm_requiremnts_fail error "Running '$*' would require sudo."
return 1
;;
(*)
if
is_a_function __rvm_sudo
then
missing_paths=""
for sbin_path in /sbin /usr/sbin /usr/local/sbin
do
if [[ -d "${sbin_path}" ]] && [[ ":$PATH:" != *":${sbin_path}:"* ]]
then missing_paths+=":${sbin_path}"
fi
done
if [[ -n "${missing_paths}" ]]
then command_to_run=( /usr/bin/env PATH="${PATH}${missing_paths}" "${command_to_run[@]}" )
fi
command_to_run=( __rvm_sudo -p "%p password required for '$*': " "${command_to_run[@]}" )
else
rvm_error "Running '$*' would require sudo, but 'sudo' is not found!"
return 1
fi
;;
esac
"${command_to_run[@]}" || return $?
)
__rvm_run_wrapper()
( # ( = subprocess
file="$1"
action="${2:-}"
shift 2
rubies_string="${1:-}"
args=( $@ )
source "$rvm_scripts_path"/base
source "$rvm_scripts_path"/$file
)
__rvm_calculate_space_free()
{
# OpenBSD does not have 'df -m' param
__free_space="$( \command \df -Pk "$1" | __rvm_awk 'BEGIN{x=4} /Free/{x=3} $3=="Avail"{x=3} END{print $x}' )"
if [[ "${__free_space}" == *M ]]
then __free_space="${__free_space%M}" # some systems ignore -k and print M
else __free_space="$(( __free_space / 1024 ))"
fi
}
__rvm_calculate_space_used()
{
__used_space="$( \command \du -msc "$@" | __rvm_awk 'END {print $1}' )"
__used_space="${__used_space%M}"
}
__rvm_require()
{
[[ -f "$1" ]] && source "$1"
}