#!/usr/bin/env bash rvm_base_except="selector" source "$rvm_scripts_path/base" chmod_unless_link() { if [[ -e "$1" && ! -L "$1" ]] then chmod -R u+w "$1" || return $? fi } remove_or_log() { rvm_verbose_log " - removing - $1" chmod_unless_link "$1" && __rvm_rm_rf "$1" || { : $(( failed_counter+=1 )) rvm_error " - failed removing $1 - please check ownership and permissions" } } empty_or_log() { rvm_verbose_log " - emptying - $1" chmod_unless_link "$1" && echo "" > "$1" || { : $(( failed_counter+=1 )) rvm_error " - failed emptying $1 - please check ownership and permissions" } } cleanup_single() { \typeset current_path entry current_path="${rvm_path}/${1}" if [[ -n "$current_path" && -d "$current_path" && "$current_path" != "/" ]] then for entry in "$current_path"/* do case $entry in (*\*) continue ;; # skip empty dirs esac remove_or_log "$entry" done fi } cleanup_checksums() { empty_or_log "${rvm_user_path:-${rvm_path}/user}/md5" empty_or_log "${rvm_user_path:-${rvm_path}/user}/sha512" } cleanup_gemsets() { \typeset current_path ruby_path for current_path in "${rvm_path}"/gems/* do case "${current_path##*/}" in (\*) continue ;; # skip no gemsets (cache) continue ;; # skip cache dir esac ruby_path="${current_path%@*}" ruby_path="${ruby_path//\/gems\///rubies/}" [[ -d "${ruby_path}" ]] || remove_or_log "$current_path" done \typeset __found __search_path_gems __search_path_rubies gemset_name __need_a_cleanup=0 for __found in "$rvm_path"/environments/* "$rvm_path"/wrappers/* do gemset_name="${__found##*/}" __search_path_gems="$rvm_path/gems/${gemset_name}" __search_path_rubies="$rvm_path/rubies/${gemset_name}" if [[ -e "$__found" && "$gemset_name" != default && ! -e "$__search_path_gems" && ! -e "$__search_path_rubies" ]] then remove_or_log "$__found" fi done (( __need_a_cleanup )) || for __found in "$rvm_path"/gems/* do gemset_name="${__found##*/}" gemset_name="${gemset_name%@*}" __search_path_rubies="$rvm_path/rubies/${gemset_name}" if [[ -e "$__found" && "$gemset_name" != cache && ! -e "$__search_path_rubies" ]] then remove_or_log "$__found" fi done } cleanup_links() { \typeset current_link \typeset -a all_links __rvm_read_lines all_links <( __rvm_find "${rvm_path}"/{environments,wrappers,gems,bin} -type l ) for current_link in "${all_links[@]}" do if [[ -L "${current_link}" && ! -s "${current_link}" ]] then remove_or_log "${current_link}" fi done } cleanup() { while (( $# )) do rvm_log "Cleaning up rvm $1" case "$1" in (archives) cleanup_checksums cleanup_single $1 ;; (checksums|gemsets|links) cleanup_$1 ;; (logs) cleanup_single log ;; (sources) cleanup_single src ;; (*) cleanup_single $1 ;; esac shift done } failed_counter=0 case "$1" in archives|checksums|repos|sources|tmp|gemsets|logs|links) cleanup "$1" ;; all) cleanup archives repos src log tmp gemsets links ;; help) rvm_help cleanup ;; *) rvm_help cleanup exit 1 ;; esac if (( failed_counter )) then rvm_warn "Cleanup failed for $failed_counter" else rvm_log "Cleanup done." fi