1
0
mirror of https://github.com/tw93/Mole.git synced 2026-02-11 00:09:15 +00:00

Code support format detection

This commit is contained in:
Tw93
2025-10-12 20:49:10 +08:00
parent d111f18cea
commit cf821cdc4b
25 changed files with 1482 additions and 1152 deletions

View File

@@ -33,17 +33,17 @@ batch_uninstall_applications() {
IFS='|' read -r epoch app_path app_name bundle_id size last_used <<< "$selected_app"
# Check if app is running (use app path for precise matching)
if pgrep -f "$app_path" >/dev/null 2>&1; then
if pgrep -f "$app_path" > /dev/null 2>&1; then
running_apps+=("$app_name")
fi
# Check if app requires sudo to delete
if [[ ! -w "$(dirname "$app_path")" ]] || [[ "$(stat -f%Su "$app_path" 2>/dev/null)" == "root" ]]; then
if [[ ! -w "$(dirname "$app_path")" ]] || [[ "$(stat -f%Su "$app_path" 2> /dev/null)" == "root" ]]; then
sudo_apps+=("$app_name")
fi
# Calculate size for summary
local app_size_kb=$(du -sk "$app_path" 2>/dev/null | awk '{print $1}' || echo "0")
local app_size_kb=$(du -sk "$app_path" 2> /dev/null | awk '{print $1}' || echo "0")
local related_files=$(find_app_files "$bundle_id" "$app_name")
local related_size_kb=$(calculate_total_size "$related_files")
local total_kb=$((app_size_kb + related_size_kb))
@@ -104,13 +104,13 @@ batch_uninstall_applications() {
IFS= read -r -s -n1 key || key=""
case "$key" in
$'\e'|q|Q)
$'\e' | q | Q)
echo ""
echo ""
return 0
;;
""|$'\n'|$'\r'|y|Y)
printf "\r\033[K" # Clear the prompt line
"" | $'\n' | $'\r' | y | Y)
printf "\r\033[K" # Clear the prompt line
;;
*)
echo ""
@@ -122,14 +122,18 @@ batch_uninstall_applications() {
# User confirmed, now request sudo access if needed
if [[ ${#sudo_apps[@]} -gt 0 ]]; then
# Check if sudo is already cached
if ! sudo -n true 2>/dev/null; then
if ! sudo -n true 2> /dev/null; then
if ! request_sudo_access "Admin required for system apps: ${sudo_apps[*]}"; then
echo ""
log_error "Admin access denied"
return 1
fi
fi
(while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null) &
(while true; do
sudo -n true
sleep 60
kill -0 "$$" || exit
done 2> /dev/null) &
sudo_keepalive_pid=$!
fi
@@ -148,22 +152,22 @@ batch_uninstall_applications() {
local related_files=$(printf '%s' "$encoded_files" | base64 -d)
local reason=""
local needs_sudo=false
[[ ! -w "$(dirname "$app_path")" || "$(stat -f%Su "$app_path" 2>/dev/null)" == "root" ]] && needs_sudo=true
[[ ! -w "$(dirname "$app_path")" || "$(stat -f%Su "$app_path" 2> /dev/null)" == "root" ]] && needs_sudo=true
if ! force_kill_app "$app_name" "$app_path"; then
reason="still running"
fi
if [[ -z "$reason" ]]; then
if [[ "$needs_sudo" == true ]]; then
sudo rm -rf "$app_path" 2>/dev/null || reason="remove failed"
sudo rm -rf "$app_path" 2> /dev/null || reason="remove failed"
else
rm -rf "$app_path" 2>/dev/null || reason="remove failed"
rm -rf "$app_path" 2> /dev/null || reason="remove failed"
fi
fi
if [[ -z "$reason" ]]; then
local files_removed=0
while IFS= read -r file; do
[[ -n "$file" && -e "$file" ]] || continue
rm -rf "$file" 2>/dev/null && ((files_removed++)) || true
rm -rf "$file" 2> /dev/null && ((files_removed++)) || true
done <<< "$related_files"
((total_size_freed += total_kb))
((success_count++))
@@ -202,7 +206,7 @@ batch_uninstall_applications() {
for app_name in "${success_items[@]}"; do
local display_item="${GREEN}${app_name}${NC}"
if (( idx % 3 == 0 )); then
if ((idx % 3 == 0)); then
# Start new line
if [[ -n "$current_line" ]]; then
summary_details+=("$current_line")
@@ -267,8 +271,8 @@ batch_uninstall_applications() {
# Clean up sudo keepalive if it was started
if [[ -n "${sudo_keepalive_pid:-}" ]]; then
kill "$sudo_keepalive_pid" 2>/dev/null || true
wait "$sudo_keepalive_pid" 2>/dev/null || true
kill "$sudo_keepalive_pid" 2> /dev/null || true
wait "$sudo_keepalive_pid" 2> /dev/null || true
sudo_keepalive_pid=""
fi

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,8 @@
set -euo pipefail
# Terminal control functions
enter_alt_screen() { tput smcup 2>/dev/null || true; }
leave_alt_screen() { tput rmcup 2>/dev/null || true; }
enter_alt_screen() { tput smcup 2> /dev/null || true; }
leave_alt_screen() { tput rmcup 2> /dev/null || true; }
# Main paginated multi-select menu function
paginated_multi_select() {
@@ -47,16 +47,16 @@ paginated_multi_select() {
# Preserve original TTY settings so we can restore them reliably
local original_stty=""
if [[ -t 0 ]] && command -v stty >/dev/null 2>&1; then
original_stty=$(stty -g 2>/dev/null || echo "")
if [[ -t 0 ]] && command -v stty > /dev/null 2>&1; then
original_stty=$(stty -g 2> /dev/null || echo "")
fi
restore_terminal() {
show_cursor
if [[ -n "${original_stty-}" ]]; then
stty "${original_stty}" 2>/dev/null || stty sane 2>/dev/null || stty echo icanon 2>/dev/null || true
stty "${original_stty}" 2> /dev/null || stty sane 2> /dev/null || stty echo icanon 2> /dev/null || true
else
stty sane 2>/dev/null || stty echo icanon 2>/dev/null || true
stty sane 2> /dev/null || stty echo icanon 2> /dev/null || true
fi
if [[ "${external_alt_screen:-false}" == false ]]; then
leave_alt_screen
@@ -72,14 +72,14 @@ paginated_multi_select() {
# Interrupt handler
handle_interrupt() {
cleanup
exit 130 # Standard exit code for Ctrl+C
exit 130 # Standard exit code for Ctrl+C
}
trap cleanup EXIT
trap handle_interrupt INT TERM
# Setup terminal - preserve interrupt character
stty -echo -icanon intr ^C 2>/dev/null || true
stty -echo -icanon intr ^C 2> /dev/null || true
if [[ $external_alt_screen == false ]]; then
enter_alt_screen
# Clear screen once on entry to alt screen
@@ -108,7 +108,7 @@ paginated_multi_select() {
draw_menu() {
# Move to home position without clearing (reduces flicker)
printf "\033[H" >&2
# Clear each line as we go instead of clearing entire screen
local clear_line="\r\033[2K"
@@ -169,7 +169,7 @@ paginated_multi_select() {
# Clear any remaining lines at bottom
printf "${clear_line}\n" >&2
printf "${clear_line}${GRAY}${ICON_NAV_UP}/${ICON_NAV_DOWN}${NC} Navigate ${GRAY}|${NC} ${GRAY}Space${NC} Select ${GRAY}|${NC} ${GRAY}Enter${NC} Confirm ${GRAY}|${NC} ${GRAY}Q/ESC${NC} Quit\n" >&2
# Clear one more line to ensure no artifacts
printf "${clear_line}" >&2
}
@@ -177,7 +177,7 @@ paginated_multi_select() {
# Show help screen
show_help() {
printf "\033[H\033[J" >&2
cat >&2 <<EOF
cat >&2 << EOF
Help - Navigation Controls
==========================
@@ -269,7 +269,7 @@ EOF
local IFS=','
final_result="${selected_indices[*]}"
fi
# Remove the trap to avoid cleanup on normal exit
trap - EXIT INT TERM

View File

@@ -114,7 +114,6 @@ patterns_equivalent() {
return 1
}
load_whitelist() {
local -a patterns=()
@@ -163,14 +162,13 @@ is_whitelisted() {
if [[ "$check_pattern" == "$existing_expanded" ]]; then
return 0
fi
if [[ "$check_pattern" == $existing_expanded ]]; then
if [[ "$check_pattern" == "$existing_expanded" ]]; then
return 0
fi
done
return 1
}
manage_whitelist() {
manage_whitelist_categories
}
@@ -286,7 +284,6 @@ manage_whitelist_categories() {
printf '\n'
}
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
manage_whitelist
fi