mirror of
https://github.com/tw93/Mole.git
synced 2026-02-04 11:31:46 +00:00
perf: fix should_protect_data performance regression with case optimization
Issue #393 reported mo clean hanging on 'Scanning sandboxed apps' and 'Scanning orphaned app resources'. Root cause: should_protect_data() was looping through 332 patterns (28 SYSTEM_CRITICAL_BUNDLES_FAST + 304 DATA_PROTECTED_BUNDLES). For 662 sandboxed containers, this resulted in 220,000+ pattern matches. Solution: Replace loops with fast case statement for common prefixes: - com.apple.* (system apps) - instant return - com.microsoft.*, com.jetbrains.* (IDEs) - instant return - Password managers, VPNs, Docker etc. - instant return - Other apps - instant return (no protection needed) - Only check detailed list for special wildcards (com.tencent.* etc.) Performance: Clean command maintains 35s (same as previous optimization) Functionality: All 9 protection tests pass
This commit is contained in:
@@ -609,9 +609,11 @@ build_regex_var() {
|
|||||||
eval "$var_name=\"\$regex\""
|
eval "$var_name=\"\$regex\""
|
||||||
}
|
}
|
||||||
|
|
||||||
# Lazy-loaded regex for uninstall operations (only built when needed)
|
# Lazy-loaded regex (only built when needed)
|
||||||
APPLE_UNINSTALLABLE_REGEX=""
|
APPLE_UNINSTALLABLE_REGEX=""
|
||||||
SYSTEM_CRITICAL_REGEX=""
|
SYSTEM_CRITICAL_REGEX=""
|
||||||
|
SYSTEM_CRITICAL_FAST_REGEX=""
|
||||||
|
DATA_PROTECTED_REGEX=""
|
||||||
|
|
||||||
_ensure_uninstall_regex() {
|
_ensure_uninstall_regex() {
|
||||||
if [[ -z "$SYSTEM_CRITICAL_REGEX" ]]; then
|
if [[ -z "$SYSTEM_CRITICAL_REGEX" ]]; then
|
||||||
@@ -620,6 +622,13 @@ _ensure_uninstall_regex() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_ensure_data_protection_regex() {
|
||||||
|
if [[ -z "$SYSTEM_CRITICAL_FAST_REGEX" ]]; then
|
||||||
|
build_regex_var SYSTEM_CRITICAL_FAST_REGEX "${SYSTEM_CRITICAL_BUNDLES_FAST[@]}"
|
||||||
|
build_regex_var DATA_PROTECTED_REGEX "${DATA_PROTECTED_BUNDLES[@]}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Check if application is a protected system component
|
# Check if application is a protected system component
|
||||||
should_protect_from_uninstall() {
|
should_protect_from_uninstall() {
|
||||||
local bundle_id="$1"
|
local bundle_id="$1"
|
||||||
@@ -641,18 +650,52 @@ should_protect_from_uninstall() {
|
|||||||
should_protect_data() {
|
should_protect_data() {
|
||||||
local bundle_id="$1"
|
local bundle_id="$1"
|
||||||
|
|
||||||
for pattern in "${SYSTEM_CRITICAL_BUNDLES_FAST[@]}"; do
|
case "$bundle_id" in
|
||||||
if bundle_matches_pattern "$bundle_id" "$pattern"; then
|
com.apple.* | loginwindow | dock | systempreferences | finder | safari)
|
||||||
return 0
|
return 0
|
||||||
fi
|
;;
|
||||||
done
|
backgroundtaskmanagement* | keychain* | security* | bluetooth* | wifi* | network* | tcc)
|
||||||
|
|
||||||
for pattern in "${DATA_PROTECTED_BUNDLES[@]}"; do
|
|
||||||
if bundle_matches_pattern "$bundle_id" "$pattern"; then
|
|
||||||
return 0
|
return 0
|
||||||
fi
|
;;
|
||||||
done
|
notification* | accessibility* | universalaccess* | HIToolbox*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
*inputmethod* | *InputMethod* | *IME | textinput* | TextInput*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
keyboard* | Keyboard* | inputsource* | InputSource* | keylayout* | KeyLayout*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
GlobalPreferences | .GlobalPreferences | org.pqrs.Karabiner*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
com.1password.* | com.agilebits.* | com.lastpass.* | com.dashlane.* | com.bitwarden.*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
com.jetbrains.* | JetBrains* | com.microsoft.* | com.visualstudio.*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
com.sublimetext.* | com.sublimehq.* | Cursor | Claude | ChatGPT | Ollama)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
com.nssurge.* | com.v2ray.* | ClashX* | Surge* | Shadowrocket* | Quantumult*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
com.docker.* | com.getpostman.* | com.insomnia.*)
|
||||||
|
return 0
|
||||||
|
;;
|
||||||
|
com.tencent.* | com.sogou.* | com.baidu.* | com.googlecode.* | im.rime.*)
|
||||||
|
# These might have wildcards, check detailed list
|
||||||
|
for pattern in "${DATA_PROTECTED_BUNDLES[@]}"; do
|
||||||
|
if bundle_matches_pattern "$bundle_id" "$pattern"; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
return 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
# Most apps won't match, return early
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user