#!/usr/bin/env bash
#
# Summary: Download ruby binaries directly from RVM repository or Rubinus
# repository.
#
# Usage: rbenv download --list
#        rbenv download <ruby-version>
#        rbenv download rbx-<rubinus-version>
#
#  --list    List all available versions available on your system.
#            For Rubinus check here: http://rubini.us/downloads/.

set -e
[ -n "$RBENV_DEBUG" ] && set -x

# Optional: Abort with usage line when called with invalid arguments
# (replace COMMAND with the name of this command)
if [ -z "$1" ]; then
  rbenv-help --usage download >&2
  exit 1
fi

RVM_BINARIES_BASE=${RVM_BINARIES_BASE:-"https://rvm.io/binaries"}
RVM_BINARIES_PACKAGE_PREFIX=${RVM_BINARIES_PACKAGE_PREFIX:-"ruby"}
RUBIES_ROOT="${RBENV_ROOT}/versions"

source "$(dirname $BASH_SOURCE)/../lib/rvm_import.sh"
source "$(dirname $BASH_SOURCE)/../lib/functions.sh"
source "$(dirname $BASH_SOURCE)/../lib/rbx-functions.sh"
source "$(dirname $BASH_SOURCE)/../lib/rvm.sh"

detect_system

ruby_version=$1
ruby_version_full=$ruby_version
case $ruby_version in
  rbx-* ) # Rubinius
    RVM_BINARIES_BASE="http://binaries.rubini.us"
    RVM_BINARIES_PACKAGE_PREFIX="rubinius"
    ruby_version=`echo $ruby_version | sed -e 's/^rbx-//'`
    ;;
  --list)
    index_url="${RVM_BINARIES_BASE}/${SYSTEM_NAME}/${SYSTEM_VERSION}/${SYSTEM_ARCH}/"
    index_url=`echo $index_url | awk '{print tolower($0)}'`
    curl -sL "$index_url" | perl -nle'print $1 if m{([A-Za-z0-9-_\.]+).tar.[bg]z2?}'
    exit 0
    ;;
esac
package_url="${RVM_BINARIES_BASE}/${SYSTEM_NAME}/${SYSTEM_VERSION}/${SYSTEM_ARCH}/${RVM_BINARIES_PACKAGE_PREFIX}-${ruby_version}.tar.bz2"
package_url=`echo $package_url | awk '{print tolower($0)}'`

echo "Download and extract ${RVM_BINARIES_PACKAGE_PREFIX} ${ruby_version} from the RVM repository"

if ! check_url $package_url; then
  echo "${url} cannot be reached" >&2
  echo "Cannot find a built version of ${RUBY_BINARIES_PACKAGE_PREFIX} '${ruby_version}' compiled for your current system: ${SYSTEM_NAME} ${SYSTEM_ARCH} (${SYSTEM_VERSION})" >&2
  exit 1
fi

ensure_folder_exists "$RUBIES_ROOT"

erase_folder_if_exist "${RUBIES_ROOT}/${ruby_version_full}"
download_and_extract_package $package_url $RUBIES_ROOT
case $RVM_BINARIES_PACKAGE_PREFIX in
  "ruby" )
    rename_folder_if_exist "${RUBIES_ROOT}/ruby-${ruby_version}" "${RUBIES_ROOT}/${ruby_version_full}"
    ;;
  "rubinius" )
    rename_folder_if_exist "${RUBIES_ROOT}/rubinius/${ruby_version}" "${RUBIES_ROOT}/${ruby_version_full}"
    erase_folder_if_exist "${RUBIES_ROOT}/rubinius"
    fix_rbx_gem_binstubs "${RUBIES_ROOT}/${ruby_version_full}"
    fix_rbx_irb "${RUBIES_ROOT}/${ruby_version_full}"
    ;;
esac
remove_rvm_dependencies "${RUBIES_ROOT}/${ruby_version_full}"

case $RVM_BINARIES_PACKAGE_PREFIX in
  "rubinius" )
    echo "Rubinius ${ruby_version} has been installed"
    ;;
  * )
    echo "Ruby ${ruby_version} has been installed"
    ;;
esac
