diff --git a/bin/omarchy-pkg-drop b/bin/omarchy-pkg-drop index 24e9ed54..bfb70598 100755 --- a/bin/omarchy-pkg-drop +++ b/bin/omarchy-pkg-drop @@ -5,14 +5,17 @@ # omarchy:requires-sudo=true installed=() -declare -A seen=() +declare -A installed_exact=() +declare -A selected=() + +while IFS= read -r package_name; do + installed_exact[$package_name]=1 +done < <(pacman -Qq) + for pkg in "$@"; do - if package_info=$(pacman -Q "$pkg" 2>/dev/null); then - package_name=${package_info%% *} - if [[ -z ${seen[$package_name]} ]]; then - installed+=("$package_name") - seen[$package_name]=1 - fi + if [[ -n ${installed_exact[$pkg]} && -z ${selected[$pkg]} ]]; then + installed+=("$pkg") + selected[$pkg]=1 fi done diff --git a/test/shell.d/pkg-drop-test.sh b/test/shell.d/pkg-drop-test.sh new file mode 100755 index 00000000..e15fd5c7 --- /dev/null +++ b/test/shell.d/pkg-drop-test.sh @@ -0,0 +1,32 @@ +#!/bin/bash + +set -euo pipefail + +source "$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)/base-test.sh" + +test_tmp=$(mktemp -d) +trap 'rm -rf "$test_tmp"' EXIT + +mock_path="$test_tmp/pkg-drop-bin" +mkdir -p "$mock_path" + +cat >"$mock_path/pacman" <<'EOF' +#!/bin/bash +if [[ $1 == "-Qq" ]]; then + printf '%s\n' exact-package provider-package +fi +EOF + +cat >"$mock_path/sudo" <<'EOF' +#!/bin/bash +printf '%s\n' "$*" >"$TEST_TMP/pkg-drop-command" +EOF + +chmod +x "$mock_path/pacman" "$mock_path/sudo" + +PATH="$mock_path:$PATH" TEST_TMP="$test_tmp" \ + "$ROOT/bin/omarchy-pkg-drop" exact-package virtual-package provider-package exact-package + +[[ $(<"$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"