1
0
mirror of https://github.com/tw93/Mole.git synced 2026-03-22 20:15:07 +00:00

Merge remote-tracking branch 'origin/main' into dev

This commit is contained in:
tw93
2026-02-26 10:33:24 +08:00
2 changed files with 73 additions and 6 deletions

View File

@@ -137,6 +137,11 @@ note_activity() {
fi fi
} }
# shellcheck disable=SC2329
has_cached_sudo() {
sudo -n true 2> /dev/null
}
CLEANUP_DONE=false CLEANUP_DONE=false
# shellcheck disable=SC2329 # shellcheck disable=SC2329
cleanup() { cleanup() {
@@ -717,7 +722,6 @@ start_cleanup() {
if [[ "$DRY_RUN" == "true" ]]; then if [[ "$DRY_RUN" == "true" ]]; then
echo -e "${YELLOW}Dry Run Mode${NC}, Preview only, no deletions" echo -e "${YELLOW}Dry Run Mode${NC}, Preview only, no deletions"
echo "" echo ""
SYSTEM_CLEAN=false
ensure_user_file "$EXPORT_LIST_FILE" ensure_user_file "$EXPORT_LIST_FILE"
cat > "$EXPORT_LIST_FILE" << EOF cat > "$EXPORT_LIST_FILE" << EOF
@@ -732,11 +736,22 @@ start_cleanup() {
# #
EOF EOF
# Preview system section when sudo is already cached (no password prompt).
if has_cached_sudo; then
SYSTEM_CLEAN=true
echo -e "${GREEN}${ICON_SUCCESS}${NC} Admin access available, system preview included"
echo ""
else
SYSTEM_CLEAN=false
echo -e "${GRAY}${ICON_WARNING} System caches need sudo, run ${NC}sudo -v && mo clean --dry-run${GRAY} for full preview${NC}"
echo ""
fi
return return
fi fi
if [[ -t 0 ]]; then if [[ -t 0 ]]; then
if sudo -n true 2> /dev/null; then if has_cached_sudo; then
SYSTEM_CLEAN=true SYSTEM_CLEAN=true
echo -e "${GREEN}${ICON_SUCCESS}${NC} Admin access already available" echo -e "${GREEN}${ICON_SUCCESS}${NC} Admin access already available"
echo "" echo ""
@@ -776,7 +791,7 @@ EOF
else else
echo "" echo ""
echo "Running in non-interactive mode" echo "Running in non-interactive mode"
if sudo -n true 2> /dev/null; then if has_cached_sudo; then
SYSTEM_CLEAN=true SYSTEM_CLEAN=true
echo " ${ICON_LIST} System-level cleanup enabled, sudo session active" echo " ${ICON_LIST} System-level cleanup enabled, sudo session active"
else else

View File

@@ -25,13 +25,66 @@ setup() {
rm -rf "${HOME:?}"/* rm -rf "${HOME:?}"/*
rm -rf "$HOME/Library" "$HOME/.config" rm -rf "$HOME/Library" "$HOME/.config"
mkdir -p "$HOME/Library/Caches" "$HOME/.config/mole" mkdir -p "$HOME/Library/Caches" "$HOME/.config/mole"
unset TEST_MOCK_BIN
}
set_mock_sudo_cached() {
TEST_MOCK_BIN="$HOME/bin"
mkdir -p "$TEST_MOCK_BIN"
cat > "$TEST_MOCK_BIN/sudo" << 'MOCK'
#!/bin/bash
# Shim: sudo -n true succeeds, all other sudo calls are no-ops.
if [[ "$1" == "-n" && "$2" == "true" ]]; then exit 0; fi
if [[ "$1" == "test" ]]; then exit 1; fi
if [[ "$1" == "find" ]]; then exit 0; fi
exit 0
MOCK
chmod +x "$TEST_MOCK_BIN/sudo"
}
set_mock_sudo_uncached() {
TEST_MOCK_BIN="$HOME/bin"
mkdir -p "$TEST_MOCK_BIN"
cat > "$TEST_MOCK_BIN/sudo" << 'MOCK'
#!/bin/bash
# Shim: sudo -n always fails (no cached credentials).
exit 1
MOCK
chmod +x "$TEST_MOCK_BIN/sudo"
}
run_clean_dry_run() {
local test_path="$PATH"
if [[ -n "${TEST_MOCK_BIN:-}" ]]; then
test_path="$TEST_MOCK_BIN:$PATH"
fi
run env HOME="$HOME" MOLE_TEST_MODE=1 PATH="$test_path" \
"$PROJECT_ROOT/mole" clean --dry-run
} }
@test "mo clean --dry-run skips system cleanup in non-interactive mode" { @test "mo clean --dry-run skips system cleanup in non-interactive mode" {
run env HOME="$HOME" MOLE_TEST_MODE=1 "$PROJECT_ROOT/mole" clean --dry-run set_mock_sudo_uncached
run_clean_dry_run
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
[[ "$output" == *"Dry Run Mode"* ]] [[ "$output" == *"Dry Run Mode"* ]]
[[ "$output" != *"Deep system-level cleanup"* ]] [[ "$output" == *"sudo -v && mo clean --dry-run"* ]]
[[ "$output" != *"system preview included"* ]]
}
@test "mo clean --dry-run includes system preview when sudo is cached" {
set_mock_sudo_cached
run_clean_dry_run
[ "$status" -eq 0 ]
[[ "$output" == *"system preview included"* ]]
}
@test "mo clean --dry-run shows hint when sudo is not cached" {
set_mock_sudo_uncached
run_clean_dry_run
[ "$status" -eq 0 ]
[[ "$output" == *"sudo -v"* ]]
[[ "$output" == *"full preview"* ]]
} }
@test "mo clean --dry-run reports user cache without deleting it" { @test "mo clean --dry-run reports user cache without deleting it" {
@@ -264,4 +317,3 @@ EOF
[[ "$output" == *"Time Machine backup in progress, skipping cleanup"* ]] [[ "$output" == *"Time Machine backup in progress, skipping cleanup"* ]]
} }