#!/usr/bin/env bash source "$rvm_scripts_path/base" usage() { printf "%b" " Usage: rvm repair [option] Options: wrappers - Repair wrappers symlinks - Repair symlinks environments - Repair environments archives - Repair archives gemsets - Repair gemsets all - Repair all of the above " } repair_gemsets() { \typeset directory directories rvm_log "Removing gemsets missing names or interpreters." ( __rvm_cd "${rvm_gems_path:-"rvm_path/gems"}" directories=( $( __rvm_find . -mindepth 1 -maxdepth 1 -type d | __rvm_grep '@$' ) $( __rvm_find . -mindepth 1 -maxdepth 1 -type d | __rvm_grep '^./@') ) for directory in "${directories[@]//.\/}" do __rvm_rm_rf "./$directory/" done ) rvm_log "Gemsets repaired." return 0 } repair_wrappers() { rvm_log "Regenerating all wrappers..." __rvm_read_lines ruby_names <(__rvm_list_gemset_strings) for ruby_name in "${ruby_names[@]}" do __rvm_log_command \ "wrappers.regenerate.$ruby_name" \ "Regenerating wrappers for $ruby_name" \ __rvm_with $ruby_name run_gem_wrappers regenerate || failed_wrappers+=( "$wrapper_ruby_name" ) done if (( ${#failed_wrappers[@]} )) then rvm_error "Wrappers regeneration failed for: ${failed_wrappers[*]}" else rvm_log "Wrappers regenerated" fi return ${#failed_wrappers[@]} } # Removes stale symlinks in $rvm_bin_path, likely related to wrappers. repair_symlinks() { rvm_log "Repairing symlinks..." for executable_name in "${rvm_bin_path}"/* do if [[ -L "$executable_name" && ! -e "$executable_name" && "$executable_name" != "${rvm_bin_path}/*" ]] then rvm_log "removing stale symlink from $(basename "$executable_name")" \command \rm -f "$executable_name" fi done rvm_log "Symlinks repaired" } # Regenerates each symlink file. repair_environments() { \typeset environment_name environments rvm_log "Regenerating environments..." environments=($(__rvm_cd "$rvm_environments_path" ; __rvm_find . -maxdepth 1 -mindepth 1 -type f)) for environment_name in "${environments[@]//.\/}" do [[ -L "$rvm_environments_path/$environment_name" ]] && continue rvm_log "Regenerating environment file for '$environment_name'" [[ -f "$rvm_environments_path/$environment_name" ]] && \command \rm -f "$rvm_environments_path/$environment_name" ( source "$rvm_scripts_path/base" __rvm_become "$environment_name" __rvm_ensure_has_environment_files ) done rvm_log "Environments regenerated" } # Removes archives that have incorrect md5 sums. repair_archives() { \typeset archive_file archives stored_md5sum rvm_log "Repairing archives..." __rvm_read_lines archives <( __rvm_cd "${rvm_archives_path}" __rvm_find . -maxdepth 1 -mindepth 1 -type f ) for archive_file in "${archives[@]//.\/}" do if __rvm_checksum_read "$archive_file" && __rvm_checksum_any then __rvm_checksum_validate_file "${rvm_archives_path}/$archive_file" || { rvm_log "Removing archive for '$archive_file' - Incorrect md5 checksum." __rvm_rm_rf "${rvm_archives_path}/$archive_file" } fi done rvm_log "Archives repaired" return 0 } repair_all() { repair_symlinks repair_archives repair_environments repair_wrappers return 0 } args=($*) action="${args[$__array_start]}" args[$__array_start]="" args=(${args[@]}) if [[ -z "$action" ]] then usage exit $? fi case "$action" in all) repair_all ;; symlinks) repair_symlinks ;; gemsets) repair_gemsets ;; environments) repair_environments ;; archives) repair_archives ;; wrappers) repair_wrappers ;; help) usage ;; *) usage >&2 ; exit 1 ;; esac exit $?