1
0
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:
Tw93
2026-01-17 10:12:23 +08:00
parent b9072c2389
commit e6fc0613d5
4 changed files with 216 additions and 228 deletions

View File

@@ -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"

View File

@@ -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() {

View File

@@ -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"

View File

@@ -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