diff --git a/bin/omarchy-pkg-drop b/bin/omarchy-pkg-drop index bfb70598..7b173c8d 100755 --- a/bin/omarchy-pkg-drop +++ b/bin/omarchy-pkg-drop @@ -8,9 +8,16 @@ installed=() declare -A installed_exact=() declare -A selected=() +if ! installed_packages=$(pacman -Qq); then + echo "Unable to query installed packages; no packages were removed." >&2 + exit 1 +fi + while IFS= read -r package_name; do - installed_exact[$package_name]=1 -done < <(pacman -Qq) + if [[ -n $package_name ]]; then + installed_exact[$package_name]=1 + fi +done <<< "$installed_packages" for pkg in "$@"; do if [[ -n ${installed_exact[$pkg]} && -z ${selected[$pkg]} ]]; then diff --git a/test/shell.d/pkg-drop-test.sh b/test/shell.d/pkg-drop-test.sh index e15fd5c7..379c60b5 100755 --- a/test/shell.d/pkg-drop-test.sh +++ b/test/shell.d/pkg-drop-test.sh @@ -13,13 +13,17 @@ mkdir -p "$mock_path" cat >"$mock_path/pacman" <<'EOF' #!/bin/bash if [[ $1 == "-Qq" ]]; then - printf '%s\n' exact-package provider-package + if [[ ${TEST_PACKAGES_EMPTY:-0} == "0" ]]; then + printf '%s\n' exact-package provider-package + fi + exit "${TEST_QUERY_STATUS:-0}" fi EOF cat >"$mock_path/sudo" <<'EOF' #!/bin/bash printf '%s\n' "$*" >"$TEST_TMP/pkg-drop-command" +exit "${TEST_REMOVE_STATUS:-0}" EOF chmod +x "$mock_path/pacman" "$mock_path/sudo" @@ -30,3 +34,22 @@ PATH="$mock_path:$PATH" TEST_TMP="$test_tmp" \ [[ $(<"$test_tmp/pkg-drop-command") == "pacman -Rns --noconfirm exact-package provider-package" ]] || fail "package removal targets exact installed names only" pass "package removal ignores providers and duplicate arguments" + +rm "$test_tmp/pkg-drop-command" +if PATH="$mock_path:$PATH" TEST_TMP="$test_tmp" TEST_QUERY_STATUS=1 \ + "$ROOT/bin/omarchy-pkg-drop" exact-package >"$test_tmp/output" 2>&1; then + fail "failed package discovery must fail removal even with partial output" +fi +[[ ! -e $test_tmp/pkg-drop-command ]] || fail "failed discovery must not request privileges" +pass "package removal propagates discovery errors before requesting privileges" + +PATH="$mock_path:$PATH" TEST_TMP="$test_tmp" TEST_PACKAGES_EMPTY=1 \ + "$ROOT/bin/omarchy-pkg-drop" exact-package +[[ ! -e $test_tmp/pkg-drop-command ]] || fail "empty package database must not request privileges" +pass "an empty package database is a successful no-op" + +if PATH="$mock_path:$PATH" TEST_TMP="$test_tmp" TEST_REMOVE_STATUS=1 \ + "$ROOT/bin/omarchy-pkg-drop" exact-package; then + fail "failed package transaction must fail removal" +fi +pass "package removal propagates transaction failures"