123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336 |
- #!/usr/bin/env bash
- unset GREP_OPTIONS
- source "$rvm_scripts_path/base"
- usage()
- {
- printf "%b" "
- Usage:
- rvm migrate {source-ruby} {destination-ruby} [--force]
- Description:
- Moves all gemsets from {source-ruby} ruby to {destination-ruby}.
- " >&2
- }
- confirm()
- {
- if (( ${rvm_force_flag:-0} > 0 ))
- then return 0
- fi
- \typeset confirmation_response
- printf "%b" "$1 (Y/n): "
- read -r confirmation_response
- [[ -z "$confirmation_response" ]] ||
- echo "$confirmation_response" | __rvm_grep -i '^y' >/dev/null 2>&1
- }
- die_with_error()
- {
- rvm_error "$1"
- exit "${2:-1}"
- }
- expand_ruby_name()
- {
- "$rvm_scripts_path/tools" strings "$1" | __rvm_awk -F"${rvm_gemset_separator:-"@"}" '{print $1}'
- }
- migrate_rubies()
- {
- \typeset -a origin_gemsets alias_pairs
- \typeset origin_gemset destination_gemset gemset_name migrate_ruby_name \
- migrate_alias_name migrate_new_alias_name binaries origin_wrappers_path \
- full_bin_path expanded_symlink linked_binary_name new_wrapper_destination
- expanded_source="$(expand_ruby_name "$source_ruby")"
- expanded_destination="$(expand_ruby_name "$destination_ruby")"
- migrate_rubies_checks &&
- migrate_rubies_gemsets &&
- migrate_rubies_aliases &&
- migrate_rubies_summary ||
- return $?
- }
- migrate_rubies_checks()
- {
- if
- [[ -z "$expanded_source" ]]
- then
- die_with_error "Could not expand source ruby '$source_ruby'"
- elif
- [[ -z "$expanded_destination" ]]
- then
- die_with_error "Could not expand destination ruby '$destination_ruby'"
- elif
- [[ "$expanded_destination" == "$expanded_source" ]]
- then
- die_with_error "Source and Destination Ruby are the same ($expanded_destination)"
- elif
- [[ ! -d "$rvm_rubies_path/$expanded_source" ]]
- then
- die_with_error "Ruby '$expanded_source' is not installed - please install it first."
- elif
- [[ ! -d "$rvm_rubies_path/$expanded_destination" ]]
- then
- die_with_error "Ruby '$expanded_destination' is not installed - please install it first."
- fi
- migrate_rubies_checks_required_space
- }
- migrate_rubies_checks_required_space()
- {
- \typeset __used_space __free_space
- __rvm_calculate_space_free "${rvm_gems_path}"
- __rvm_calculate_space_used "$rvm_gems_path/$expanded_source"{,@*}
- if
- (( __used_space > __free_space ))
- then
- die_with_error "Not enough space (${__free_space}MB) to copy gemsets (${__used_space}MB)."
- elif
- (( __used_space*12 > __free_space*10 )) # 20% check
- then
- rvm_warn "You are running low on disk space ${__free_space}MB, required ${__used_space}MB."
- else
- rvm_log "Free disk space ${__free_space}MB, required ${__used_space}MB."
- fi
- }
- migrate_rubies_gemset_calculate_destination()
- {
- destination_gemset="$expanded_destination"
- case "$origin_gemset" in
- (*${rvm_gemset_separator:-@}*)
- gemset_name="${origin_gemset/*${rvm_gemset_separator:-"@"}/}"
- destination_gemset="${destination_gemset}${rvm_gemset_separator:-"@"}${gemset_name}"
- ;;
- (*)
- gemset_name="default"
- ;;
- esac
- }
- migrate_rubies_gemsets_run_each_ask()
- {
- case "$__action" in
- (copy)
- echo "Moving gems from $* to $expanded_destination?"
- ;;
- (merge)
- confirm "Are you sure you wish to Merge gems from $* to $expanded_destination" || return 1
- ;;
- (overwrite)
- echo "Are you sure you wish to MOVE gems from $* to $expanded_destination?"
- confirm "This will overwrite existing gems in $expanded_destination and remove them from $expanded_source" || return 1
- ;;
- (*)
- rvm_error "Unknown action($__action) for migrate_rubies_gemsets_run_each"
- return 204
- esac
- }
- migrate_rubies_gemset_clean_destination()
- {
- case "$__action" in
- (overwrite)
- __rvm_log_command "remove.gemset.$gemset_name" "Removing $destination_gemset" \
- \command \rm -rfv "${rvm_gems_path:-"$rvm_path/gems"}/$destination_gemset"/* ||
- return $?
- ;;
- esac
- }
- __migrate_gemset()
- {
- \command \mkdir -p "${rvm_gems_path:-"$rvm_path/gems"}/$destination_gemset"/ &&
- \command \mv -v "${rvm_gems_path:-"$rvm_path/gems"}/$1"/* "${rvm_gems_path:-"$rvm_path/gems"}/$2"/ &&
- gemset_reset_env "$2"
- }
- __merge_gemset()
- (
- \typeset __file
- \typeset -a __files
- __files=()
- cd "${rvm_gems_path:-"$rvm_path/gems"}/$1"/
- __rvm_read_lines __files <(
- __rvm_find . -type d
- )
- for __file in "${__files[@]}"
- do
- mkdir -p "${rvm_gems_path:-"$rvm_path/gems"}/$2/${__file#./}"
- done
- __files=()
- __rvm_read_lines __files <(
- __rvm_find . -type f
- )
- for __file in "${__files[@]}"
- do
- \command \mv -v "${__file}" "${rvm_gems_path:-"$rvm_path/gems"}/$2/${__file#./}"
- done
- rm -rf "${rvm_gems_path:-"$rvm_path/gems"}/$1"/
- cd ..
- gemset_reset_env "$2"
- )
- migrate_rubies_gemsets_run_migration()
- {
- case "$__action" in
- (copy|overwrite)
- __rvm_log_command "migrate.gemset.$gemset_name" "Moving $origin_gemset to $destination_gemset" \
- __migrate_gemset "$origin_gemset" "$destination_gemset" ||
- return $?
- ;;
- (merge)
- __rvm_log_command "merge.gemset.$gemset_name" "Merging $origin_gemset to $destination_gemset" \
- __merge_gemset "$origin_gemset" "$destination_gemset" ||
- return $?
- ;;
- esac
- }
- migrate_rubies_gemsets_run_each()
- {
- \typeset __action=$1
- shift
- migrate_rubies_gemsets_run_each_ask "$@" || return $?
- for origin_gemset in "$@"
- do
- migrate_rubies_gemset_calculate_destination
- migrate_rubies_gemset_clean_destination
- migrate_rubies_gemsets_run_migration
- __rvm_gemset_pristine "$destination_gemset"
- done
- }
- migrate_rubies_gemset_partition()
- {
- if
- [[ ! -d "${rvm_gems_path:-"$rvm_path/gems"}/$destination_gemset" ]]
- then
- __list_new+=( "$origin_gemset" )
- elif
- [[ "$gemset_name" == "global" ]]
- then
- __list_global+=( "$origin_gemset" )
- elif
- [[ "$gemset_name" == "default" ]]
- then
- __list_default+=( "$origin_gemset" )
- else
- __list_existing+=( "$origin_gemset" )
- fi
- }
- migrate_rubies_gemsets_run()
- {
- if [[ -n "${__list_global[*]}" ]]
- then migrate_rubies_gemsets_run_each overwrite "${__list_global[@]}"
- fi
- if [[ -n "${__list_default[*]}" ]]
- then migrate_rubies_gemsets_run_each merge "${__list_default[@]}"
- fi
- if [[ -n "${__list_existing[*]}" ]]
- then migrate_rubies_gemsets_run_each overwrite "${__list_existing[@]}"
- fi
- if [[ -n "${__list_new[*]}" ]]
- then migrate_rubies_gemsets_run_each copy "${__list_new[@]}"
- fi
- }
- migrate_rubies_gemsets()
- {
- \typeset origin_gemsets __list_global __list_default __list_existing __list_new
- __list_global=()
- __list_default=()
- __list_existing=()
- __list_new=()
- __rvm_read_lines origin_gemsets <(
- __rvm_list_gemset_strings | __rvm_grep -E "^$expanded_source(@.*)?$"
- )
- for origin_gemset in "${origin_gemsets[@]}"
- do
- migrate_rubies_gemset_calculate_destination
- migrate_rubies_gemset_partition
- done
- rvm_debug "__list_global= ${__list_global[*]};"
- rvm_debug "__list_default= ${__list_default[*]};"
- rvm_debug "__list_existing=${__list_existing[*]};"
- rvm_debug "__list_new= ${__list_new[*]};"
- migrate_rubies_gemsets_run
- }
- migrate_rubies_alias()
- {
- "$rvm_scripts_path/alias" delete "$migrate_alias_name"
- "$rvm_scripts_path/alias" create "$migrate_alias_name" "$migrate_new_alias_name"
- }
- migrate_rubies_aliases()
- {
- __rvm_read_lines alias_pairs < "$rvm_path/config/alias"
- aliases=()
- for alias_pair in "${alias_pairs[@]}"
- do
- migrate_alias_name="${alias_pair/=*/}"
- migrate_ruby_name="${alias_pair/*=/}"
- if
- [[ "$migrate_ruby_name" == "$expanded_source" ||
- "$migrate_ruby_name" == "${expanded_source}${rvm_gemset_separator:-"@"}"*
- ]]
- then
- migrate_new_alias_name="${migrate_ruby_name/$expanded_source/$expanded_destination}"
- aliases+=( "$migrate_alias_name=$migrate_new_alias_name" )
- fi
- done
- if
- (( ${#aliases[@]} )) &&
- confirm 'Do you wish to move over aliases?'
- then
- for alias_pair in "${aliases[@]}"
- do
- migrate_alias_name="${alias_pair%%=*}"
- migrate_new_alias_name="${alias_pair#*=}"
- __rvm_log_command "migrate.alias.$migrate_alias_name" \
- "Updating alias $migrate_alias_name to point to $migrate_new_alias_name" \
- migrate_rubies_alias
- done
- fi
- true
- }
- migrate_rubies_summary()
- {
- if confirm "Do you also wish to completely remove $expanded_source (inc. archive)?"
- then __rvm_log_command "rvm.remove" "Removing $expanded_source" __rvm_run_wrapper manage remove "$expanded_source" --archive --gems
- fi
- echo "Successfully migrated $expanded_source to $expanded_destination"
- }
- source_ruby="$1"
- destination_ruby="$2"
- if
- [[ -z "$source_ruby" || -z "$destination_ruby" ]]
- then
- usage
- exit 1
- fi
- migrate_rubies
|