Browse Source

Add 'binscripts/rvm-installer'

天问 1 year ago
parent
commit
3b5bff4add
1 changed files with 939 additions and 0 deletions
  1. 939 0
      binscripts/rvm-installer

+ 939 - 0
binscripts/rvm-installer

@@ -0,0 +1,939 @@
+#!/usr/bin/env bash
+
+shopt -s extglob
+set -o errtrace
+set -o errexit
+set -o pipefail
+
+rvm_install_initialize()
+{
+  DEFAULT_SOURCES=(github.com/rvm/rvm bitbucket.org/mpapis/rvm)
+
+  BASH_MIN_VERSION="3.2.25"
+  if
+    [[ -n "${BASH_VERSION:-}" &&
+      "$(\printf "%b" "${BASH_VERSION:-}\n${BASH_MIN_VERSION}\n" | LC_ALL=C \sort -t"." -k1,1n -k2,2n -k3,3n | \head -n1)" != "${BASH_MIN_VERSION}"
+    ]]
+  then
+    echo "BASH ${BASH_MIN_VERSION} required (you have $BASH_VERSION)"
+    exit 1
+  fi
+
+  export HOME PS4
+  export rvm_trace_flag rvm_debug_flag rvm_user_install_flag rvm_ignore_rvmrc rvm_prefix rvm_path
+
+  PS4="+ \${BASH_SOURCE##\${rvm_path:-}} : \${FUNCNAME[0]:+\${FUNCNAME[0]}()}  \${LINENO} > "
+}
+
+log()  { printf "%b\n" "$*"; }
+debug(){ [[ ${rvm_debug_flag:-0} -eq 0 ]] || printf "%b\n" "$*" >&2; }
+warn() { log "WARN: $*" >&2 ; }
+fail() { fail_with_code 1 "$*" ; }
+fail_with_code() { code="$1" ; shift ; log "\nERROR: $*\n" >&2 ; exit "$code" ; }
+
+rvm_install_commands_setup()
+{
+  \which which >/dev/null 2>&1 || fail "Could not find 'which' command, make sure it's available first before continuing installation."
+  \which grep >/dev/null 2>&1 || fail "Could not find 'grep' command, make sure it's available first before continuing installation."
+  if
+    [[ -z "${rvm_tar_command:-}" ]] && builtin command -v gtar >/dev/null
+  then
+    rvm_tar_command=gtar
+  elif
+    ${rvm_tar_command:-tar} --help 2>&1 | GREP_OPTIONS="" \grep -- --strip-components >/dev/null
+  then
+    rvm_tar_command="${rvm_tar_command:-tar}"
+  else
+    case "$(uname)" in
+      (OpenBSD)
+        log "Trying to install GNU version of tar, might require sudo password"
+        if (( UID ))
+        then sudo pkg_add -z gtar-1
+        else pkg_add -z gtar-1
+        fi
+        rvm_tar_command=gtar
+        ;;
+      (Darwin|FreeBSD|DragonFly) # it's not possible to autodetect on OSX, the help/man does not mention all flags
+        rvm_tar_command=tar
+        ;;
+      (SunOS)
+        case "$(uname -r)" in
+          (5.10)
+            log "Trying to install GNU version of tar, might require sudo password"
+            if (( UID ))
+            then
+              if \which sudo >/dev/null 2>&1
+              then sudo_10=sudo
+              elif \which /opt/csw/bin/sudo >/dev/null 2>&1
+              then sudo_10=/opt/csw/bin/sudo
+              else fail "sudo is required but not found. You may install sudo from OpenCSW repository (https://www.opencsw.org/about)"
+              fi
+              pkginfo -q CSWpkgutil || $sudo_10 pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil
+              sudo /opt/csw/bin/pkgutil -iy CSWgtar -t https://mirror.opencsw.org/opencsw/unstable
+            else
+              pkginfo -q CSWpkgutil || pkgadd -a $rvm_path/config/solaris/noask -d https://get.opencsw.org/now CSWpkgutil
+              /opt/csw/bin/pkgutil -iy CSWgtar -t https://mirror.opencsw.org/opencsw/unstable
+            fi
+            rvm_tar_command=/opt/csw/bin/gtar
+            ;;
+          (*)
+            rvm_tar_command=tar
+            ;;
+        esac
+    esac
+    builtin command -v ${rvm_tar_command:-gtar} >/dev/null ||
+    fail "Could not find GNU compatible version of 'tar' command, make sure it's available first before continuing installation."
+  fi
+  if
+    [[ " ${rvm_tar_options:-} " != *" --no-same-owner "*  ]] &&
+    $rvm_tar_command --help 2>&1 | GREP_OPTIONS="" \grep -- --no-same-owner >/dev/null
+  then
+    rvm_tar_options="${rvm_tar_options:-}${rvm_tar_options:+ }--no-same-owner"
+  fi
+}
+
+usage()
+{
+  printf "%b" "
+
+Usage
+
+  rvm-installer [options] [action]
+
+Options
+
+  [[--]version] <version>
+
+    The version or tag to install. Valid values are:
+
+      latest         - The latest tagged version.
+      latest-minor   - The latest minor version of the current major version.
+      latest-<x>     - The latest minor version of version x.
+      latest-<x>.<y> - The latest patch version of version x.y.
+      <x>.<y>.<z>    - Major version x, minor version y and patch z.
+
+  [--]branch <branch>
+
+    The name of the branch from which RVM is installed. This option can be used
+    with the following formats for <branch>:
+
+      <account>/
+
+        If account is rvm or mpapis, installs from one of the following:
+
+          https://github.com/rvm/rvm/archive/master.tar.gz
+          https://bitbucket.org/mpapis/rvm/get/master.tar.gz
+
+       Otherwise, installs from:
+
+         https://github.com/<account>/rvm/archive/master.tar.gz
+
+      <account>/<branch>
+
+        If account is rvm or mpapis, installs from one of the following:
+
+          https://github.com/rvm/rvm/archive/<branch>.tar.gz
+          https://bitbucket.org/mpapis/rvm/get/<branch>.tar.gz
+
+        Otherwise, installs from:
+
+          https://github.com/<account>/rvm/archive/<branch>.tar.gz
+
+      [/]<branch>
+
+        Installs the branch from one of the following:
+
+          https://github.com/rvm/rvm/archive/<branch>.tar.gz
+          https://bitbucket.org/mpapis/rvm/get/<branch>.tar.gz
+
+      [--]source <source>
+
+        Defines the repository from which RVM is retrieved and installed in the format:
+
+          <domain>/<account>/<repo>
+
+        Where:
+
+          <domain>  - Is bitbucket.org, github.com or a github enterprise site serving
+                      an RVM repository.
+          <account> - Is the user account in which the RVM repository resides.
+          <repo>    - Is the name of the RVM repository.
+
+        Note that when using the [--]source option, one should only use the [/]branch format
+        with the [--]branch option. Failure to do so will result in undefined behavior.
+
+      --trace
+
+        Provides debug logging for the installation script.
+Actions
+
+  master - Installs RVM from the master branch at rvm/rvm on github or mpapis/rvm
+           on bitbucket.org.
+  stable - Installs RVM from the stable branch a rvm/rvm on github or mpapis/rvm
+           on bitbucket.org.
+  help   - Displays this output.
+
+"
+}
+
+## 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()
+(
+  __rvm_which curl >/dev/null ||
+  {
+    rvm_error "RVM requires 'curl'. Install 'curl' first and try again."
+    return 200
+  }
+
+  typeset -a __flags
+  __flags=( --fail --location --max-redirs 10 )
+
+  [[ "$*" == *"--max-time"* ]] ||
+  [[ "$*" == *"--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 "${__flags[@]}" "$@" || return $?
+)
+
+rvm_error()  { printf "ERROR: %b\n" "$*"; }
+__rvm_which(){   which "$@" || return $?; true; }
+__rvm_debug_command()
+{
+  debug "Running($#): $*"
+  "$@" || return $?
+  true
+}
+rvm_is_a_shell_function()
+{
+  [[ -t 0 && -t 1 ]] || return $?
+  return ${rvm_is_not_a_shell_function:-0}
+}
+
+# Searches the tags for the highest available version matching a given pattern.
+# fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) 1.10. -> 1.10.3
+# fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) 1.10. -> 1.10.3
+# fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) 1.    -> 1.11.0
+# fetch_version (github.com/rvm/rvm bitbucket.org/mpapis/rvm) ""    -> 2.0.1
+fetch_version()
+{
+  typeset _account _domain _pattern _repo _sources _values _version
+  _sources=(${!1})
+  _pattern=$2
+  for _source in "${_sources[@]}"
+  do
+    IFS='/' read -r _domain _account _repo <<< "${_source}"
+    _version="$(
+      fetch_versions ${_domain} ${_account} ${_repo} |
+      GREP_OPTIONS="" \grep "^${_pattern:-}" | tail -n 1
+    )"
+    if
+      [[ -n ${_version} ]]
+    then
+      echo "${_version}"
+      return 0
+    fi
+  done
+  fail_with_code 4 "Exhausted all sources trying to fetch version '$version' of RVM!"
+}
+
+# Returns a sorted list of most recent tags from a repository
+fetch_versions()
+{
+  typeset _account _domain _repo _url
+  _domain=$1
+  _account=$2
+  _repo=$3
+  case ${_domain} in
+    (bitbucket.org)
+      _url="https://api.${_domain}/2.0/repositories/${_account}/${_repo}/refs/tags?sort=-name&pagelen=20"
+      ;;
+    (github.com)
+      _url=https://api.${_domain}/repos/${_account}/${_repo}/tags
+      ;;
+
+    (*)
+      _url=https://${_domain}/api/v3/repos/${_account}/${_repo}/tags
+      ;;
+  esac
+
+  { __rvm_curl -sS "${_url}" || warn "...the preceeding error with code $? occurred while fetching $_url" ; } |
+    \awk -v RS=',|values":' -v FS='"' '$2=="name"&&$4!="rvm"{print $4}' |
+    sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n
+}
+
+install_release()
+{
+  typeset _source _sources _url _version _verify_pgp
+  _sources=(${!1})
+  _version=$2
+  debug "Downloading RVM version ${_version}"
+  for _source in "${_sources[@]}"
+  do
+    case ${_source} in
+      (bitbucket.org*)
+        _url="https://${_source}/get/${_version}.tar.gz"
+        _verify_pgp="https://${_source}/downloads/${_version}.tar.gz.asc"
+        ;;
+      (*)
+        _url="https://${_source}/archive/${_version}.tar.gz"
+        _verify_pgp="https://${_source}/releases/download/${_version}/${_version}.tar.gz.asc"
+        ;;
+    esac
+    get_and_unpack "${_url}" "rvm-${_version}.tgz" "$_verify_pgp" && return
+  done
+  return $?
+}
+
+install_head()
+{
+  typeset _branch _source _sources _url
+  _sources=(${!1})
+  _branch=$2
+  debug "Selected RVM branch ${_branch}"
+  for _source in "${_sources[@]}"
+  do
+    case ${_source} in
+      (bitbucket.org*)
+        _url=https://${_source}/get/${_branch}.tar.gz
+        ;;
+      (*)
+        _url=https://${_source}/archive/${_branch}.tar.gz
+        ;;
+    esac
+    get_and_unpack "${_url}" "rvm-${_branch//\//_}.tgz" && return
+  done
+  return $?
+}
+
+# duplication marker dfkjdjngdfjngjcszncv
+# Drop in cd which _doesn'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
+}
+
+get_package()
+{
+  typeset _url _file
+  _url="$1"
+  _file="$2"
+  log "Downloading ${_url}"
+  __rvm_curl -sS ${_url} > ${rvm_archives_path}/${_file} ||
+  {
+    _return=$?
+    case $_return in
+      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
+      (60)
+        log "
+Could not download '${_url}', you can read more about it here:
+https://rvm.io/support/fixing-broken-ssl-certificates/
+To continue in insecure mode run 'echo insecure >> ~/.curlrc'.
+"
+        ;;
+      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
+      (77)
+        log "
+It looks like you have old certificates, you can read more about it here:
+https://rvm.io/support/fixing-broken-ssl-certificates/
+"
+        ;;
+      # duplication marker lfdgzkngdkjvnfjknkjvcnbjkncvjxbn
+      (141)
+        log "
+Curl returned 141 - it is result of a segfault which means it's Curls fault.
+Try again and if it crashes more than a couple of times you either need to
+reinstall Curl or consult with your distribution manual and contact support.
+"
+        ;;
+      (*)
+        log "
+Could not download '${_url}'.
+  curl returned status '$_return'.
+"
+        ;;
+    esac
+    return $_return
+  }
+}
+
+# duplication marker flnglfdjkngjndkfjhsbdjgfghdsgfklgg
+rvm_install_gpg_setup()
+{
+  export rvm_gpg_command
+  {
+    rvm_gpg_command="$( \which gpg2 2>/dev/null )" &&
+    [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
+  } || {
+    rvm_gpg_command="$( \which gpg 2>/dev/null )" &&
+    [[ ${rvm_gpg_command} != "/cygdrive/"* ]]
+  } || rvm_gpg_command=""
+
+  debug "Detected GPG program: '$rvm_gpg_command'"
+
+  [[ -n "$rvm_gpg_command" ]] || return $?
+}
+
+# duplication marker rdjgndfnghdfnhgfdhbghdbfhgbfdhbn
+verify_package_pgp()
+{
+  if
+    "${rvm_gpg_command}" --verify "$2" "$1"
+  then
+    log "GPG verified '$1'"
+  else
+    typeset _return=$?
+
+    log "\
+GPG signature verification failed for '$1' - '$3'! Try to install GPG v2 and then fetch the public key:
+
+    ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --keyserver hkp://pool.sks-keyservers.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB
+
+or if it fails:
+
+    command curl -sSL https://rvm.io/mpapis.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -
+    command curl -sSL https://rvm.io/pkuczynski.asc | ${SUDO_USER:+sudo }${rvm_gpg_command##*/} --import -
+
+In case of further problems with validation please refer to https://rvm.io/rvm/security
+"
+
+    exit ${_return}
+  fi
+}
+
+verify_pgp()
+{
+  [[ -n "${1:-}" ]] ||
+  {
+    debug "No PGP url given, skipping."
+    return 0
+  }
+
+  get_package "$1" "$2.asc" ||
+  {
+    debug "PGP url given but does not exist: '$1'"
+    return 0
+  }
+
+  rvm_install_gpg_setup ||
+  {
+    log "Found PGP signature at: '$1',
+but no GPG software exists to validate it, skipping."
+    return 0
+  }
+
+  verify_package_pgp "${rvm_archives_path}/$2" "${rvm_archives_path}/$2.asc" "$1"
+}
+
+get_and_unpack()
+{
+  typeset _url _file _patern _return _verify_pgp
+  _url="$1"
+  _file="$2"
+  _verify_pgp="$3"
+
+  get_package "$_url" "$_file" || return $?
+  verify_pgp "$_verify_pgp" "$_file" || return $?
+
+  [[ -d "${rvm_src_path}/rvm" ]] || \mkdir -p "${rvm_src_path}/rvm"
+  __rvm_cd "${rvm_src_path}/rvm" ||
+  {
+    _return=$?
+    log "Could not change directory '${rvm_src_path}/rvm'."
+    return $_return
+  }
+
+  # Remove existing installation
+  typeset _cleanup_cmd
+  _cleanup_cmd="rm -rf ${rvm_src_path}/rvm/{,.[!.],..?}*"
+
+  $_cleanup_cmd || {
+    _return=$?
+      log "Could not remove old RVM sources. Try:\n\n\tsudo $_cleanup_cmd\n\nThen retry your task again."
+      return $_return
+  }
+
+  # Unpack sources
+  __rvm_debug_command $rvm_tar_command xzf ${rvm_archives_path}/${_file} ${rvm_tar_options:-} --strip-components 1 ||
+  {
+    _return=$?
+    log "Could not extract RVM sources."
+    return $_return
+  }
+}
+
+rvm_install_default_settings()
+{
+  # Tracing, if asked for.
+  if
+    [[ "$*" == *--trace* ]] || (( ${rvm_trace_flag:-0} > 0 ))
+  then
+    set -o xtrace
+    rvm_trace_flag=1
+  fi
+
+  # Variable initialization, remove trailing slashes if they exist on HOME
+  true \
+    ${rvm_trace_flag:=0} ${rvm_debug_flag:=0}\
+    ${rvm_ignore_rvmrc:=0} HOME="${HOME%%+(\/)}"
+
+  if
+    (( rvm_ignore_rvmrc == 0 ))
+  then
+    for rvmrc in /etc/rvmrc "$HOME/.rvmrc"
+    do
+      if
+        [[ -s "$rvmrc" ]]
+      then
+        if
+          GREP_OPTIONS="" \grep '^\s*rvm .*$' "$rvmrc" >/dev/null 2>&1
+        then
+          printf "%b" "
+  Error: $rvmrc is for rvm settings only.
+  rvm CLI may NOT be called from within $rvmrc.
+  Skipping the loading of $rvmrc
+  "
+          exit 1
+        else
+          source "$rvmrc"
+        fi
+      fi
+    done
+  fi
+
+  if
+    [[ -z "${rvm_path:-}" ]]
+  then
+    if
+      (( UID == 0 ))
+    then
+      rvm_user_install_flag=0
+      rvm_prefix="/usr/local"
+      rvm_path="${rvm_prefix}/rvm"
+    else
+      rvm_user_install_flag=1
+      rvm_prefix="$HOME"
+      rvm_path="${rvm_prefix}/.rvm"
+    fi
+  fi
+  if [[ -z "${rvm_prefix}" ]]
+  then rvm_prefix=$( dirname $rvm_path )
+  fi
+
+  # duplication marker kkdfkgnjfndgjkndfjkgnkfjdgn
+  [[ -n "${rvm_user_install_flag:-}" ]] ||
+  case "$rvm_path" in
+    (/usr/local/rvm)         rvm_user_install_flag=0 ;;
+    ($HOME/*|/${USER// /_}*) rvm_user_install_flag=1 ;;
+    (*)                      rvm_user_install_flag=0 ;;
+  esac
+}
+
+rvm_install_parse_params()
+{
+  install_rubies=()
+  install_gems=()
+  flags=( ./scripts/install )
+  forwarded_flags=()
+  while
+    (( $# > 0 ))
+  do
+    token="$1"
+    shift
+    case "$token" in
+
+      (--trace)
+        set -o xtrace
+        rvm_trace_flag=1
+        flags=( -x "${flags[@]}" "$token" )
+        forwarded_flags+=( "$token" )
+        ;;
+
+      (--debug|--quiet-curl)
+        flags+=( "$token" )
+        forwarded_flags+=( "$token" )
+        token=${token#--}
+        token=${token//-/_}
+        export "rvm_${token}_flag"=1
+        printf "%b" "Turning on ${token/_/ } mode.\n"
+        ;;
+
+      (--path)
+        if [[ -n "${1:-}" ]]
+        then
+          rvm_path="$1"
+          shift
+        else
+          fail "--path must be followed by a path."
+        fi
+        ;;
+
+      (--branch|branch) # Install RVM from a given branch
+        if [[ -n "${1:-}" ]]
+        then
+          case "$1" in
+            (/*)
+              branch=${1#/}
+              ;;
+            (*/)
+              branch=master
+              if [[ "${1%/}" -ne rvm ]] && [[ "${1%/}" -ne mpapis ]]
+              then sources=(github.com/${1%/}/rvm)
+              fi
+              ;;
+            (*/*)
+              branch=${1#*/}
+              if [[ "${1%%/*}" -ne rvm ]] && [[ "${1%%/*}" -ne mpapis ]]
+              then sources=(github.com/${1%%/*}/rvm)
+              fi
+              ;;
+            (*)
+              branch="$1"
+              ;;
+          esac
+          shift
+        else
+          fail "--branch must be followed by a branchname."
+        fi
+        ;;
+
+      (--source|source)
+        if [[ -n "${1:-}" ]]
+        then
+          if [[ "$1" = */*/* ]]
+          then
+            sources=($1)
+            shift
+          else
+            fail "--source must be in the format <domain>/<account>/<repo>."
+          fi
+        else
+          fail "--source must be followed by a source."
+        fi
+        ;;
+
+      (--user-install|--ignore-dotfiles)
+        token=${token#--}
+        token=${token//-/_}
+        export "rvm_${token}_flag"=1
+        printf "%b" "Turning on ${token/_/ } mode.\n"
+        ;;
+
+      (--auto-dotfiles)
+        flags+=( "$token" )
+        export "rvm_auto_dotfiles_flag"=1
+        printf "%b" "Turning on auto dotfiles mode.\n"
+        ;;
+
+      (--auto)
+        export "rvm_auto_dotfiles_flag"=1
+        printf "%b" "Warning, --auto is deprecated in favor of --auto-dotfiles.\n"
+        ;;
+
+      (--verify-downloads)
+        if [[ -n "${1:-}" ]]
+        then
+          export rvm_verify_downloads_flag="$1"
+          forwarded_flags+=( "$token" "$1" )
+          shift
+        else
+          fail "--verify-downloads must be followed by level(0|1|2)."
+        fi
+        ;;
+
+      (--autolibs=*)
+        flags+=( "$token" )
+        export rvm_autolibs_flag="${token#--autolibs=}"
+        forwarded_flags+=( "$token" )
+        ;;
+
+      (--without-gems=*|--with-gems=*|--with-default-gems=*)
+        flags+=( "$token" )
+        value="${token#*=}"
+        token="${token%%=*}"
+        token="${token#--}"
+        token="${token//-/_}"
+        export "rvm_${token}"="${value}"
+        printf "%b" "Installing RVM ${token/_/ }: ${value}.\n"
+        ;;
+
+      (--version|version)
+        version="$1"
+        shift
+        ;;
+
+      (head|master)
+        version="head"
+        branch="master"
+        ;;
+
+      (stable)
+        version="latest"
+        ;;
+
+      (latest|latest-*|+([[:digit:]]).+([[:digit:]]).+([[:digit:]]))
+        version="$token"
+        ;;
+
+      (--ruby)
+        install_rubies+=( ruby )
+        ;;
+
+      (--ruby=*)
+        token=${token#--ruby=}
+        install_rubies+=( ${token//,/ } )
+        ;;
+
+      (--rails)
+        install_gems+=( rails )
+        ;;
+
+      (--gems=*)
+        token=${token#--gems=}
+        install_gems+=( ${token//,/ } )
+        ;;
+
+      (--add-to-rvm-group)
+        export rvm_add_users_to_rvm_group="$1"
+        shift
+        ;;
+
+      (help)
+        usage
+        exit 0
+        ;;
+
+      (*)
+        usage
+        exit 1
+        ;;
+
+    esac
+  done
+
+  if (( ${#install_gems[@]} > 0 && ${#install_rubies[@]} == 0 ))
+  then install_rubies=( ruby )
+  fi
+
+  true "${version:=head}"
+  true "${branch:=master}"
+
+  if [[ -z "${sources[@]}" ]]
+  then sources=("${DEFAULT_SOURCES[@]}")
+  fi
+
+  rvm_src_path="$rvm_path/src"
+  rvm_archives_path="$rvm_path/archives"
+  rvm_releases_url="https://rvm.io/releases"
+}
+
+rvm_install_validate_rvm_path()
+{
+  case "$rvm_path" in
+    (*[[:space:]]*)
+      printf "%b" "
+It looks you are one of the happy *space* users (in home dir name),
+RVM is not yet fully ready for it, use this trick to fix it:
+
+    sudo mkdir -p /${USER// /_}.rvm
+    sudo chown -R \"$USER:\" /${USER// /_}.rvm
+    echo \"export rvm_path=/${USER// /_}.rvm\" >> \"$HOME/.rvmrc\"
+
+and start installing again.
+
+"
+      exit 2
+    ;;
+    (/usr/share/ruby-rvm)
+      printf "%b" "
+It looks you are one of the happy Ubuntu users,
+RVM packaged by Ubuntu is old and broken,
+follow this link for details how to fix:
+
+  https://stackoverflow.com/a/9056395/497756
+
+"
+      [[ "${rvm_uses_broken_ubuntu_path:-no}" == "yes" ]] || exit 3
+    ;;
+  esac
+
+  if [[ "$rvm_path" != "/"* ]]
+  then fail "The rvm install path must be fully qualified. Tried $rvm_path"
+  fi
+}
+
+rvm_install_validate_volume_mount_mode()
+{
+  \typeset path partition test_exec
+
+  path=$rvm_path
+
+  # Directory $rvm_path might not exists at this point so we need to traverse the tree upwards
+  while [[ -n "$path" ]]
+  do
+      if [[ -d $path ]]
+      then
+        partition=`df -P $path | awk 'END{print $1}'`
+
+        test_exec=$(mktemp $path/rvm-exec-test.XXXXXX)
+        echo '#!/bin/sh' > "$test_exec"
+        chmod +x "$test_exec"
+
+        if ! "$test_exec"
+        then
+          rm -f "$test_exec"
+          printf "%b" "
+It looks that scripts located in ${path}, which would be RVM destination ${rvm_path},
+are not executable. One of the reasons might be that partition ${partition} holding this location
+is mounted in *noexec* mode, which prevents RVM from working correctly. Please verify your setup
+and re-mount partition ${partition} without the noexec option."
+          exit 2
+        fi
+
+        rm -f "$test_exec"
+        break
+      fi
+
+      path=${path%/*}
+  done
+}
+
+rvm_install_select_and_get_version()
+{
+  typeset dir _version_release _version
+
+  for dir in "$rvm_src_path" "$rvm_archives_path"
+  do
+    [[ -d "$dir" ]] || mkdir -p "$dir"
+  done
+
+  _version_release="${version}"
+  case "${version}" in
+    (head)
+      _version_release="${branch}"
+      install_head sources[@] ${branch:-master}
+      ;;
+
+    (latest)
+      _version=$(fetch_version sources[@])
+      install_release sources[@] "$_version"
+      ;;
+
+    (latest-minor)
+      version="$(<"$rvm_path/VERSION")"
+      _version=$(fetch_version sources[@] ${version%.*})
+      install_release sources[@] "$_version"
+      ;;
+
+    (latest-*)
+      _version=$(fetch_version sources[@] ${version#latest-})
+      install_release sources[@] "$_version"
+      ;;
+
+    (+([[:digit:]]).+([[:digit:]]).+([[:digit:]])) # x.y.z
+      install_release sources[@] ${version}
+      ;;
+
+    (*)
+      fail "Something went wrong, unrecognized version '$version'"
+      ;;
+  esac
+  echo "${_version_release}" > "$rvm_path/RELEASE"
+}
+
+rvm_install_main()
+{
+  [[ -f ./scripts/install ]] ||
+  {
+    log "'./scripts/install' can not be found for installation, something went wrong, it usually means your 'tar' is broken, please report it here: https://github.com/rvm/rvm/issues"
+    return 127
+  }
+
+  # required flag - path to install
+  flags+=( --path "$rvm_path" )
+  \command bash "${flags[@]}"
+}
+
+rvm_install_ruby_and_gems()
+(
+  if
+    (( ${#install_rubies[@]} > 0 ))
+  then
+    source ${rvm_scripts_path:-${rvm_path}/scripts}/rvm
+    source ${rvm_scripts_path:-${rvm_path}/scripts}/functions/version
+    __rvm_print_headline
+
+    for _ruby in ${install_rubies[@]}
+    do command rvm "${forwarded_flags[@]}" install ${_ruby}
+    done
+    # set the first one as default, skip rest
+    for _ruby in ${install_rubies[@]}
+    do
+      rvm "${forwarded_flags[@]}" alias create default ${_ruby}
+      break
+    done
+
+    for _gem in ${install_gems[@]}
+    do rvm "${forwarded_flags[@]}" all do gem install ${_gem}
+    done
+
+    printf "%b" "
+  * To start using RVM you need to run \`source $rvm_path/scripts/rvm\`
+    in all your open shell windows, in rare cases you need to reopen all shell windows.
+"
+
+    if
+      [[ "${install_gems[*]}" == *"rails"* ]]
+    then
+      printf "%b" "
+  * To start using rails you need to run \`rails new <project_dir>\`.
+"
+    fi
+  fi
+)
+
+rvm_install()
+{
+  rvm_install_initialize
+  rvm_install_commands_setup
+  rvm_install_default_settings
+  rvm_install_parse_params "$@"
+  rvm_install_validate_rvm_path
+  rvm_install_validate_volume_mount_mode
+  rvm_install_select_and_get_version
+  rvm_install_main
+  rvm_install_ruby_and_gems
+}
+
+rvm_install "$@"