mirror of
https://github.com/tw93/Mole.git
synced 2026-02-11 10:39:21 +00:00
perf: improve cleanup UI responsiveness and reduce visual flicker
- Speed up spinner animation from 100ms to 50ms for smoother visuals - Fix spinner flicker by deferring stop until output is ready - Remove unnecessary 'Preparing...' spinner at section start - Hide whitelist-protected items from output (Trash, Finder metadata) - Add spinner feedback for system diagnostic log cleanup - Remove redundant stop_section_spinner calls in cleanup modules The cleanup process now feels significantly faster and more polished, with continuous visual feedback and no jarring gaps between operations.
This commit is contained in:
11
bin/clean.sh
11
bin/clean.sh
@@ -164,10 +164,6 @@ start_section() {
|
|||||||
echo ""
|
echo ""
|
||||||
echo -e "${PURPLE_BOLD}${ICON_ARROW} $1${NC}"
|
echo -e "${PURPLE_BOLD}${ICON_ARROW} $1${NC}"
|
||||||
|
|
||||||
if [[ -t 1 ]]; then
|
|
||||||
MOLE_SPINNER_PREFIX=" " start_inline_spinner "Preparing..."
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "$DRY_RUN" == "true" ]]; then
|
if [[ "$DRY_RUN" == "true" ]]; then
|
||||||
ensure_user_file "$EXPORT_LIST_FILE"
|
ensure_user_file "$EXPORT_LIST_FILE"
|
||||||
echo "" >>"$EXPORT_LIST_FILE"
|
echo "" >>"$EXPORT_LIST_FILE"
|
||||||
@@ -308,9 +304,6 @@ safe_clean() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Always stop spinner before outputting results
|
|
||||||
stop_section_spinner
|
|
||||||
|
|
||||||
local description
|
local description
|
||||||
local -a targets
|
local -a targets
|
||||||
|
|
||||||
@@ -361,6 +354,7 @@ safe_clean() {
|
|||||||
local show_scan_feedback=false
|
local show_scan_feedback=false
|
||||||
if [[ ${#targets[@]} -gt 20 && -t 1 ]]; then
|
if [[ ${#targets[@]} -gt 20 && -t 1 ]]; then
|
||||||
show_scan_feedback=true
|
show_scan_feedback=true
|
||||||
|
stop_section_spinner
|
||||||
MOLE_SPINNER_PREFIX=" " start_inline_spinner "Scanning ${#targets[@]} items..."
|
MOLE_SPINNER_PREFIX=" " start_inline_spinner "Scanning ${#targets[@]} items..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -614,6 +608,9 @@ safe_clean() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $removed_any -eq 1 ]]; then
|
if [[ $removed_any -eq 1 ]]; then
|
||||||
|
# Stop spinner before output
|
||||||
|
stop_section_spinner
|
||||||
|
|
||||||
local size_human=$(bytes_to_human "$((total_size_kb * 1024))")
|
local size_human=$(bytes_to_human "$((total_size_kb * 1024))")
|
||||||
|
|
||||||
local label="$description"
|
local label="$description"
|
||||||
|
|||||||
@@ -79,20 +79,24 @@ clean_deep_system() {
|
|||||||
done < <(run_with_timeout 5 command find /private/var/folders -type d -name "*.code_sign_clone" -path "*/X/*" -print0 2>/dev/null || true)
|
done < <(run_with_timeout 5 command find /private/var/folders -type d -name "*.code_sign_clone" -path "*/X/*" -print0 2>/dev/null || true)
|
||||||
stop_section_spinner
|
stop_section_spinner
|
||||||
[[ $code_sign_cleaned -gt 0 ]] && log_success "Browser code signature caches ($code_sign_cleaned items)"
|
[[ $code_sign_cleaned -gt 0 ]] && log_success "Browser code signature caches ($code_sign_cleaned items)"
|
||||||
safe_sudo_find_delete "/private/var/db/diagnostics/Special" "*" "$MOLE_LOG_AGE_DAYS" "f" || true
|
|
||||||
safe_sudo_find_delete "/private/var/db/diagnostics/Persist" "*" "$MOLE_LOG_AGE_DAYS" "f" || true
|
start_section_spinner "Cleaning system diagnostic logs..."
|
||||||
safe_sudo_find_delete "/private/var/db/DiagnosticPipeline" "*" "$MOLE_LOG_AGE_DAYS" "f" || true
|
local diag_cleaned=0
|
||||||
log_success "System diagnostic logs"
|
safe_sudo_find_delete "/private/var/db/diagnostics/Special" "*" "$MOLE_LOG_AGE_DAYS" "f" && diag_cleaned=1 || true
|
||||||
safe_sudo_find_delete "/private/var/db/powerlog" "*" "$MOLE_LOG_AGE_DAYS" "f" || true
|
safe_sudo_find_delete "/private/var/db/diagnostics/Persist" "*" "$MOLE_LOG_AGE_DAYS" "f" && diag_cleaned=1 || true
|
||||||
log_success "Power logs"
|
safe_sudo_find_delete "/private/var/db/DiagnosticPipeline" "*" "$MOLE_LOG_AGE_DAYS" "f" && diag_cleaned=1 || true
|
||||||
safe_sudo_find_delete "/private/var/db/reportmemoryexception/MemoryLimitViolations" "*" "30" "f" || true
|
safe_sudo_find_delete "/private/var/db/powerlog" "*" "$MOLE_LOG_AGE_DAYS" "f" && diag_cleaned=1 || true
|
||||||
log_success "Memory exception reports"
|
safe_sudo_find_delete "/private/var/db/reportmemoryexception/MemoryLimitViolations" "*" "30" "f" && diag_cleaned=1 || true
|
||||||
start_section_spinner "Cleaning diagnostic trace logs..."
|
|
||||||
local diag_logs_cleaned=0
|
|
||||||
safe_sudo_find_delete "/private/var/db/diagnostics/Persist" "*.tracev3" "30" "f" && diag_logs_cleaned=1 || true
|
|
||||||
safe_sudo_find_delete "/private/var/db/diagnostics/Special" "*.tracev3" "30" "f" && diag_logs_cleaned=1 || true
|
|
||||||
stop_section_spinner
|
stop_section_spinner
|
||||||
[[ $diag_logs_cleaned -eq 1 ]] && log_success "System diagnostic trace logs"
|
|
||||||
|
[[ $diag_cleaned -eq 1 ]] && log_success "System diagnostic logs"
|
||||||
|
|
||||||
|
start_section_spinner "Cleaning diagnostic trace logs..."
|
||||||
|
local trace_cleaned=0
|
||||||
|
safe_sudo_find_delete "/private/var/db/diagnostics/Persist" "*.tracev3" "30" "f" && trace_cleaned=1 || true
|
||||||
|
safe_sudo_find_delete "/private/var/db/diagnostics/Special" "*.tracev3" "30" "f" && trace_cleaned=1 || true
|
||||||
|
stop_section_spinner
|
||||||
|
[[ $trace_cleaned -eq 1 ]] && log_success "System diagnostic trace logs"
|
||||||
}
|
}
|
||||||
# Incomplete Time Machine backups.
|
# Incomplete Time Machine backups.
|
||||||
clean_time_machine_failed_backups() {
|
clean_time_machine_failed_backups() {
|
||||||
|
|||||||
@@ -7,10 +7,7 @@ clean_user_essentials() {
|
|||||||
stop_section_spinner
|
stop_section_spinner
|
||||||
|
|
||||||
safe_clean ~/Library/Logs/* "User app logs"
|
safe_clean ~/Library/Logs/* "User app logs"
|
||||||
if is_path_whitelisted "$HOME/.Trash"; then
|
if ! is_path_whitelisted "$HOME/.Trash"; then
|
||||||
note_activity
|
|
||||||
echo -e " ${GREEN}${ICON_EMPTY}${NC} Trash · whitelist protected"
|
|
||||||
else
|
|
||||||
safe_clean ~/.Trash/* "Trash"
|
safe_clean ~/.Trash/* "Trash"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -288,17 +285,13 @@ scan_external_volumes() {
|
|||||||
}
|
}
|
||||||
# Finder metadata (.DS_Store).
|
# Finder metadata (.DS_Store).
|
||||||
clean_finder_metadata() {
|
clean_finder_metadata() {
|
||||||
stop_section_spinner
|
|
||||||
if [[ "$PROTECT_FINDER_METADATA" == "true" ]]; then
|
if [[ "$PROTECT_FINDER_METADATA" == "true" ]]; then
|
||||||
note_activity
|
|
||||||
echo -e " ${GREEN}${ICON_EMPTY}${NC} Finder metadata · whitelist protected"
|
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
clean_ds_store_tree "$HOME" "Home directory (.DS_Store)"
|
clean_ds_store_tree "$HOME" "Home directory (.DS_Store)"
|
||||||
}
|
}
|
||||||
# macOS system caches and user-level leftovers.
|
# macOS system caches and user-level leftovers.
|
||||||
clean_macos_system_caches() {
|
clean_macos_system_caches() {
|
||||||
stop_section_spinner
|
|
||||||
# safe_clean already checks protected paths.
|
# safe_clean already checks protected paths.
|
||||||
safe_clean ~/Library/Saved\ Application\ State/* "Saved application states" || true
|
safe_clean ~/Library/Saved\ Application\ State/* "Saved application states" || true
|
||||||
safe_clean ~/Library/Caches/com.apple.photoanalysisd "Photo analysis cache" || true
|
safe_clean ~/Library/Caches/com.apple.photoanalysisd "Photo analysis cache" || true
|
||||||
@@ -318,7 +311,6 @@ clean_macos_system_caches() {
|
|||||||
safe_clean ~/Library/Application\ Support/AddressBook/Sources/*/Photos.cache "Address Book photo cache" || true
|
safe_clean ~/Library/Application\ Support/AddressBook/Sources/*/Photos.cache "Address Book photo cache" || true
|
||||||
}
|
}
|
||||||
clean_recent_items() {
|
clean_recent_items() {
|
||||||
stop_section_spinner
|
|
||||||
local shared_dir="$HOME/Library/Application Support/com.apple.sharedfilelist"
|
local shared_dir="$HOME/Library/Application Support/com.apple.sharedfilelist"
|
||||||
local -a recent_lists=(
|
local -a recent_lists=(
|
||||||
"$shared_dir/com.apple.LSSharedFileList.RecentApplications.sfl2"
|
"$shared_dir/com.apple.LSSharedFileList.RecentApplications.sfl2"
|
||||||
@@ -338,7 +330,6 @@ clean_recent_items() {
|
|||||||
safe_clean ~/Library/Preferences/com.apple.recentitems.plist "Recent items preferences" || true
|
safe_clean ~/Library/Preferences/com.apple.recentitems.plist "Recent items preferences" || true
|
||||||
}
|
}
|
||||||
clean_mail_downloads() {
|
clean_mail_downloads() {
|
||||||
stop_section_spinner
|
|
||||||
local mail_age_days=${MOLE_MAIL_AGE_DAYS:-}
|
local mail_age_days=${MOLE_MAIL_AGE_DAYS:-}
|
||||||
if ! [[ "$mail_age_days" =~ ^[0-9]+$ ]]; then
|
if ! [[ "$mail_age_days" =~ ^[0-9]+$ ]]; then
|
||||||
mail_age_days=30
|
mail_age_days=30
|
||||||
@@ -449,7 +440,6 @@ process_container_cache() {
|
|||||||
}
|
}
|
||||||
# Browser caches (Safari/Chrome/Edge/Firefox).
|
# Browser caches (Safari/Chrome/Edge/Firefox).
|
||||||
clean_browsers() {
|
clean_browsers() {
|
||||||
stop_section_spinner
|
|
||||||
safe_clean ~/Library/Caches/com.apple.Safari/* "Safari cache"
|
safe_clean ~/Library/Caches/com.apple.Safari/* "Safari cache"
|
||||||
# Chrome/Chromium.
|
# Chrome/Chromium.
|
||||||
safe_clean ~/Library/Caches/Google/Chrome/* "Chrome cache"
|
safe_clean ~/Library/Caches/Google/Chrome/* "Chrome cache"
|
||||||
@@ -485,7 +475,6 @@ clean_browsers() {
|
|||||||
}
|
}
|
||||||
# Cloud storage caches.
|
# Cloud storage caches.
|
||||||
clean_cloud_storage() {
|
clean_cloud_storage() {
|
||||||
stop_section_spinner
|
|
||||||
safe_clean ~/Library/Caches/com.dropbox.* "Dropbox cache"
|
safe_clean ~/Library/Caches/com.dropbox.* "Dropbox cache"
|
||||||
safe_clean ~/Library/Caches/com.getdropbox.dropbox "Dropbox cache"
|
safe_clean ~/Library/Caches/com.getdropbox.dropbox "Dropbox cache"
|
||||||
safe_clean ~/Library/Caches/com.google.GoogleDrive "Google Drive cache"
|
safe_clean ~/Library/Caches/com.google.GoogleDrive "Google Drive cache"
|
||||||
@@ -496,7 +485,6 @@ clean_cloud_storage() {
|
|||||||
}
|
}
|
||||||
# Office app caches.
|
# Office app caches.
|
||||||
clean_office_applications() {
|
clean_office_applications() {
|
||||||
stop_section_spinner
|
|
||||||
safe_clean ~/Library/Caches/com.microsoft.Word "Microsoft Word cache"
|
safe_clean ~/Library/Caches/com.microsoft.Word "Microsoft Word cache"
|
||||||
safe_clean ~/Library/Caches/com.microsoft.Excel "Microsoft Excel cache"
|
safe_clean ~/Library/Caches/com.microsoft.Excel "Microsoft Excel cache"
|
||||||
safe_clean ~/Library/Caches/com.microsoft.Powerpoint "Microsoft PowerPoint cache"
|
safe_clean ~/Library/Caches/com.microsoft.Powerpoint "Microsoft PowerPoint cache"
|
||||||
@@ -516,7 +504,6 @@ clean_virtualization_tools() {
|
|||||||
}
|
}
|
||||||
# Application Support logs/caches.
|
# Application Support logs/caches.
|
||||||
clean_application_support_logs() {
|
clean_application_support_logs() {
|
||||||
stop_section_spinner
|
|
||||||
if [[ ! -d "$HOME/Library/Application Support" ]] || ! ls "$HOME/Library/Application Support" >/dev/null 2>&1; then
|
if [[ ! -d "$HOME/Library/Application Support" ]] || ! ls "$HOME/Library/Application Support" >/dev/null 2>&1; then
|
||||||
note_activity
|
note_activity
|
||||||
echo -e " ${YELLOW}${ICON_WARNING}${NC} Skipped: No permission to access Application Support"
|
echo -e " ${YELLOW}${ICON_WARNING}${NC} Skipped: No permission to access Application Support"
|
||||||
|
|||||||
@@ -308,7 +308,7 @@ start_inline_spinner() {
|
|||||||
# Output to stderr to avoid interfering with stdout
|
# Output to stderr to avoid interfering with stdout
|
||||||
printf "\r${MOLE_SPINNER_PREFIX:-}${BLUE}%s${NC} %s" "$c" "$message" >&2 || break
|
printf "\r${MOLE_SPINNER_PREFIX:-}${BLUE}%s${NC} %s" "$c" "$message" >&2 || break
|
||||||
((i++))
|
((i++))
|
||||||
sleep 0.1
|
sleep 0.05
|
||||||
done
|
done
|
||||||
|
|
||||||
# Clean up stop file before exiting
|
# Clean up stop file before exiting
|
||||||
|
|||||||
Reference in New Issue
Block a user