123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403 |
- #!/usr/bin/env bash
- rubygems_remove()
- {
- \typeset rubygems_path __ruby entry
- rvm_log "Removing old Rubygems files..."
- case "$rvm_ruby_string" in
- (rbx-*)
- __ruby="['prefix']"
- ;;
- (*)
- __ruby=".values_at('sitelibdir','vendorlibdir').detect{ |path| File.directory?(File.join(path.to_s, 'rubygems')) }.to_s"
- ;;
- esac
- rubygems_path="$(${1:-ruby} -rrbconfig -e "puts ::Kernel.const_get('RbConfig')::CONFIG${ruby__}")"
- # Remove common files installed by ruby gems.
- entries=(
- "${rubygems_path}/ubygems.rb"
- "${rubygems_path}/gauntlet_rubygems.rb"
- "${rubygems_path}/rbconfig/"
- )
- for entry in "${entries[@]}" "${rubygems_path}/rubygems"*
- do
- __rvm_rm_rf "$entry"
- done
- }
- can_switch_rubygems()
- {
- case "$rvm_ruby_string" in
- maglev*)
- return 1
- ;;
- *)
- return 0
- ;;
- esac
- }
- make_sure_jruby_can_work_with_rubygems()
- {
- case "$rvm_ruby_string" in
- jruby-head*)
- true
- ;;
- jruby*)
- __rvm_version_compare "$rvm_ruby_version" -ge 1.7.1 || return 1
- ;;
- *)
- return 0 # do not care about other rubies
- ;;
- esac
- case "${rvm_rubygems_version}" in
- head|master)
- true
- ;;
- *)
- __rvm_version_compare "$rvm_rubygems_version" -ge 2.0.0 || return 1
- ;;
- esac
- }
- rubygems_fatal_error()
- {
- rvm_error "$1"
- exit ${2:-1}
- }
- rubygems_version_list()
- {
- __rvm_curl -sS https://rubygems.org/api/v1/versions/rubygems-update.json |
- __rvm_awk -v RS=',' -v FS='"' '$2=="number"{print $4}' |
- __rvm_version_sort |
- __rvm_grep '^[[:digit:]\.]*$'
- }
- rubygems_current_rubygems_version()
- {
- "${rvm_ruby_binary}" -rrubygems -e 'puts(Gem::VERSION)' 2>/dev/null
- }
- rubygems_master_sha()
- {
- __rvm_curl -s "https://api.github.com/repos/rubygems/rubygems/commits?page=last&per_page=1" |
- __rvm_sed -n '/^ "sha":/ {s/^.*".*": "\(.*\)".*$/\1/;p;}'
- }
- bundler_rubygems_master_sha()
- {
- __rvm_curl -s "https://api.github.com/repos/rubygems/rubygems/contents/bundler" |
- __rvm_sed -n '/^ "sha":/ {s/^.*".*": "\(.*\)".*$/\1/;p;}'
- }
- rubygems_select_current()
- {
- case "$version" in
- latest|current)
- version="$(__rvm_db "${rvm_ruby_string//-/_}_rubygems_version")"
- version="${version:-"$(__rvm_db "${rvm_ruby_interpreter}_${rvm_ruby_version}_rubygems_version")"}"
- if (( ${rvm_head_flag:-0} == 1 )) && [[ -z "${version:-}" ]]
- then version="$(__rvm_db "${rvm_ruby_interpreter}_head_rubygems_version")"
- fi
- version="${version:-"$(__rvm_db "${rvm_ruby_interpreter}_rubygems_version")"}"
- version="${version:-"$(__rvm_db "rubygems_version")"}"
- ;;
- esac
- }
- rubygems_select_latest()
- {
- case "$version" in
- latest-*)
- version="${version#latest-}"
- version="$(rubygems_version_list | __rvm_grep "^${version}\." | __rvm_tail -n 1 )"
- version="${version}"
- ;;
- esac
- }
- rubygems_select_version_url()
- {
- case "${version:-missing}" in
- ignore|none)
- rvm_rubygems_version="$version"
- ;;
- head|master)
- \typeset sha
- sha="$(rubygems_master_sha)"
- rvm_rubygems_version="$version"
- rvm_gem_package_name="rubygems-${sha}"
- rvm_gem_url="https://github.com/rubygems/rubygems/archive/${sha}.tar.gz"
- __bundler_sha="$(bundler_rubygems_master_sha)"
- __bundler_package_name="bundler-${__bundler_sha}"
- __bundler_url="https://github.com/bundler/bundler/archive/${__bundler_sha}.tar.gz"
- export rvm_verify_downloads_flag=1
- ;;
- v*)
- rvm_rubygems_version="$version"
- rvm_gem_package_name="rubygems-${version#v}"
- rvm_gem_url="https://github.com/rubygems/rubygems/archive/$version.tar.gz"
- export rvm_verify_downloads_flag=1
- ;;
- missing)
- rvm_error "There was an error while trying to resolve rubygems version for '$1'. \nHalting the installation."
- return 4
- ;;
- *)
- rvm_rubygems_version="$version"
- rvm_gem_package_name="rubygems-${rvm_rubygems_version}"
- rvm_rubygems_url=$(__rvm_db "rubygems_url")
- rvm_gem_url="${rvm_rubygems_url}/${rvm_gem_package_name}.tgz"
- ;;
- esac
- }
- rubygems_select_version()
- {
- rubygems_select_current "$1" &&
- rubygems_select_latest "$1" &&
- rubygems_select_version_url "$1" ||
- return $?
- }
- __rvm_warn_on_rubyopt()
- {
- if [[ -n "${RUBYOPT:-""}" ]]; then
- rvm_warn \
- "Please note: You have the RUBYOPT environment variable set and this \
- may interfere with normal rvm operations. We sugges unsetting it."
- return 1
- else
- return 0
- fi
- }
- rubygems_setup()
- {
- export version="$1"
- \typeset __bundler_sha __bundler_package_name __bundler_url
- rvm_debug "rubygems_setup version:${version} rvm_ruby_string:${rvm_ruby_string} rvm_ruby_home:${rvm_ruby_home} rvm_ruby_binary:${rvm_ruby_binary}"
- case "${version:-missing}" in
- ignore|none)
- rvm_debug "Skipping installing rubygems."
- return 0
- ;;
- esac
- can_switch_rubygems ||
- rubygems_fatal_error "RVM can not install rubygems for maglev and older jruby, select other ruby and try again." $?
- __rvm_warn_on_rubyopt
- true ${rvm_ruby_selected_flag:=0}
- unset RUBYOPT
- (( rvm_ruby_selected_flag == 0 )) || __rvm_select
- rubygems_select_version "$version" || return $?
- rvm_debug "rubygems_setup_rubygems version:${rvm_rubygems_version} rvm_gem_package_name:${rvm_gem_package_name} rvm_gem_url:${rvm_gem_url}"
- rvm_debug "rubygems_setup_bundler sha:${__bundler_sha} __bundler_package_name:${__bundler_package_name} __bundler_url:${__bundler_url}"
- if
- [[ "${rvm_force_flag:-0}" -eq 1 ]]
- then
- true # just let us continue with installation
- else
- \typeset __current_rubygems_version="$( rubygems_current_rubygems_version )"
- if
- __rvm_version_compare "${__current_rubygems_version}" -eq "$version"
- then
- rvm_log "Rubygems $version already available in installed ruby, skipping installation, use --force to reinstall."
- return 0
- elif
- __rvm_version_compare "${__current_rubygems_version}" -gt "$version"
- then
- rvm_log "Installed rubygems ${__current_rubygems_version} is newer than $version provided with installed ruby, skipping installation, use --force to force installation."
- return 0
- fi
- fi
- make_sure_jruby_can_work_with_rubygems ||
- rubygems_fatal_error "RVM can not install rubygems for older jruby, select other ruby and try again." $?
- # always cleanup!
- [[ -d "${rvm_src_path}/$rvm_gem_package_name" ]] ||
- __rvm_rm_rf "${rvm_src_path}/$rvm_gem_package_name"
- rvm_log "$rvm_ruby_string - #downloading $rvm_gem_package_name"
- "$rvm_scripts_path/fetch" "$rvm_gem_url" "${rvm_gem_package_name}.tgz" ||
- rubygems_fatal_error "There has been an error while trying to fetch rubygems. \nHalting the installation." $?
- if
- [[ -n "${__bundler_sha:-}" ]]
- then
- rvm_log "$rvm_ruby_string - #downloading $__bundler_package_name"
- "$rvm_scripts_path/fetch" "$__bundler_url" "${__bundler_package_name}.tgz" ||
- rubygems_fatal_error "There has been an error while trying to fetch bundler. \nHalting the installation." $?
- fi
- __rvm_log_command "rubygems.extract" "$rvm_ruby_string - #extracting $rvm_gem_package_name" \
- __rvm_package_extract "${rvm_archives_path}/$rvm_gem_package_name.tgz" "${rvm_src_path}" ||
- rubygems_fatal_error "There has been an error while trying to extract rubygems. \nHalting the installation." $?
- if
- [[ -n "${__bundler_sha:-}" ]]
- then
- __rvm_log_command "rubygems.bundler.extract" "$rvm_ruby_string - #extracting $__bundler_package_name" \
- __rvm_package_extract "${rvm_archives_path}/$__bundler_package_name.tgz" "${rvm_src_path}" "*/spec/*" ||
- rubygems_fatal_error "There has been an error while trying to extract bundler. \nHalting the installation." $?
- \rm -rf "${rvm_src_path}/$rvm_gem_package_name/bundler" &&
- ln -nfs "${rvm_src_path}/$__bundler_package_name/" "${rvm_src_path}/$rvm_gem_package_name/bundler" ||
- rubygems_fatal_error "There has been an error while linking bundler. \nHalting the installation." $?
- fi
- __rvm_log_command "rubygems.remove" "$rvm_ruby_string - #removing old rubygems" rubygems_remove "${rvm_ruby_binary}"
- __rvm_cd "${rvm_src_path}/$rvm_gem_package_name"
- \typeset -a __command
- __command=(
- GEM_HOME="$rvm_gems_path/${rvm_ruby_string}@global" GEM_PATH="" "${rvm_ruby_binary}" -d "${rvm_src_path}/$rvm_gem_package_name/setup.rb"
- )
- if [[ ${rvm_debug_flag:-0} == 1 || ${rvm_trace_flag:-0} == 1 ]]
- then __command+=( --verbose )
- fi
- if
- (( ${rvm_docs_flag:-0} == 0 ))
- then
- if __rvm_version_compare "$version" -ge 2.2
- then __command+=( --no-document )
- else __command+=( --no-ri --no-rdoc )
- fi
- fi
- __setup_lang_fallback
- __rvm_log_command "rubygems.install" \
- "$rvm_ruby_string - #installing $rvm_gem_package_name" \
- "${__command[@]}" ||
- return $?
- [[ -e "$rvm_ruby_home/bin/gem" ]] ||
- {
- \typeset program_suffix
- program_suffix="$( __rvm_ruby_config_get configure_args "${rvm_ruby_binary}" )"
- case "${program_suffix:-}" in
- (*--program-suffix=*)
- program_suffix="${program_suffix#*--program-suffix=}"
- program_suffix="${program_suffix%%[\' ]*}"
- __rvm_log_command "link.gem" "$rvm_ruby_string - #linking gem${program_suffix} -> gem" \
- ln -s "$rvm_ruby_home/bin/gem${program_suffix}" "$rvm_ruby_home/bin/gem"
- ;;
- esac
- }
- true # for osx
- }
- rubygems_validate_gemfile_extract()
- (
- \command \mkdir -p "$2/gem" &&
- \command \tar -C "$2" -xf "$1" --touch &&
- \command \cd "$2" &&
- \command \gzip -d "metadata.gz" &&
- \command \tar -C gem -xzf "data.tar.gz" --touch &&
- \command \rm "data.tar.gz" ||
- {
- \typeset ret=$?
- rvm_error "Error extracting '$1' to '$2'."
- \command \rm -rf "${rvm_tmp_path}/rg$$"
- return $ret
- }
- )
- # Adapted from: https://gist.github.com/4678778
- rubygems_validate_gemfile()
- (
- gem_file="$1"
- downloaded_file="${gem_file##*/}"
- gem__url="${2:-https://d2chzxaqi4y7f8.cloudfront.net/gems/$downloaded_file}"
- dir_local_copy="${downloaded_file%.gem}--local"
- dir_remote_copy="${downloaded_file%.gem}-remote"
- mkdir -p "${rvm_tmp_path}/rg$$"
- cd "${rvm_tmp_path}/rg$$"
- __rvm_curl "$gem__url" -o "$downloaded_file" &&
- [[ -f "$downloaded_file" ]] ||
- {
- \typeset ret=$?
- rvm_error "Could not download '$gem__url'."
- \command \rm -rf "${rvm_tmp_path}/rg$$"
- return $ret
- }
- rubygems_validate_gemfile_extract "$gem_file" "$dir_local_copy" || return $?
- rubygems_validate_gemfile_extract "$downloaded_file" "$dir_remote_copy" || return $?
- # compare
- diff -ru "$dir_local_copy" "$dir_remote_copy"
- # cleanup
- \command \rm -rf "${rvm_tmp_path}/rg$$"
- )
- rubygems_validate_list_gemdirs()
- {
- for gemdir in "$@"
- do
- __rvm_readlink_deep gemdir
- echo "${gemdir}"
- done | sort -u
- }
- # Adapted from: https://gist.github.com/4678189
- rubygems_validate()
- {
- __rvm_which openssl > /dev/null ||
- rubygems_fatal_error "'openssl' was not found, please install it."
- \typeset gemdir gemfile url gem loc rem log
- \typeset -a gemdirs
- rvm_log "Validating RubyGems... This will take a while..."
- __rvm_read_lines gemdirs <(
- rubygems_validate_list_gemdirs "$@"
- )
- (( ${#gemdirs[@]} )) ||
- __rvm_read_lines gemdirs <(
- rubygems_validate_list_gemdirs "$rvm_gems_path"/*/cache
- )
- for gemdir in "${gemdirs[@]}"
- do
- for gem in "$gemdir"/*.gem
- do
- gemfile="${gem##*/}"
- url="https://d2chzxaqi4y7f8.cloudfront.net/gems/$gemfile"
- printf "%b" "${rvm_notify_clr}${gem}${rvm_reset_clr}"
- loc=$(openssl md5 $gem |cut -d" " -f2)
- rem=$(__rvm_curl -3 -s -D - -X HEAD -H 'Connection:close' "$url" | __rvm_grep 'ETag' | cut -d'"' -f2)
- [[ $loc == $rem ]] ||
- {
- printf "%b" " "
- log="${rvm_log_path}/$gemfile.diff"
- rubygems_validate_gemfile "$gem" "$url" > "$log"
- printf "%b" "${rvm_error_clr}mismatch, local: $loc, remote: $rem${rvm_reset_clr}, differences recorded in '$log'"
- }
- printf "%b" ", "
- done
- done
- rvm_log "\nDone verifying gems."
- }
|