feat: purge selected packages in one transaction

This commit is contained in:
bryanpedini committed 2026-11-02 20:26:37 +01:00
1 parent 2aa0a21056
commit 57a3dc97d6
5 files changed
+222 -67

No files matched your search

+10
View File
@@ -785,3 +785,13 @@ zypp_conf() { # a "real" zypp.conf + locks file with one user lock, in the test
refute_output --partial 'skeptical-updater.'
[[ ! -e $STATE/zypper-private ]]
}
@test "pacman: dependent and dependency are simulated and purged together" {
use_fakes pacman
run skup --no-refresh <<<$'2x 1x\ny\nq'
assert_success
assert_line 'Purge su-dummy-a su-dummy-b now? [y/N] y'
assert_line 'purged: su-dummy-a su-dummy-b'
log_has 'pacman -Rs --print --print-format %n -- su-dummy-a su-dummy-b'
log_has 'pacman -Rns --noconfirm -- su-dummy-a su-dummy-b'
}
+9 -10
View File
@@ -137,21 +137,20 @@ case $op in
-Rs)
((print)) || exit 98
tg=${targets[0]}
if [[ -n ${FAKE_PACMAN_RS_REFUSE:-} || $tg == su-dummy-b ]]; then
if [[ -n ${FAKE_PACMAN_RS_REFUSE:-} || " ${targets[*]} " == *' su-dummy-b '* && " ${targets[*]} " != *' su-dummy-a '* ]]; then
echo "checking dependencies..."
echo ":: removing $tg breaks dependency '$tg' required by su-dummy-a"
echo "error: failed to prepare transaction (could not satisfy dependencies)" >&2
exit 1
fi
case $tg in
su-dummy-a) printf '%s\n' su-dummy-a su-dummy-b ;; # b was installed as a dependency of a
su-dummy-c | glib2 | expat | ca-certificates-mozilla | pfetch | su-dummy-aur) echo "$tg" ;; # (the last two: foreign, AUR)
*)
echo "error: target not found: $tg" >&2
exit 1
;;
esac
for r in ${FAKE_PACMAN_RS_EXTRA:-}; do [[ ${r%%:*} == "$tg" ]] && echo "${r#*:}"; done
for tg in "${targets[@]}"; do
case $tg in
su-dummy-a) printf '%s\n' su-dummy-a su-dummy-b ;;
su-dummy-b | su-dummy-c | glib2 | expat | ca-certificates-mozilla | pfetch | su-dummy-aur) echo "$tg" ;;
*) echo "error: target not found: $tg" >&2; exit 1 ;;
esac
for r in ${FAKE_PACMAN_RS_EXTRA:-}; do [[ ${r%%:*} == "$tg" ]] && echo "${r#*:}"; done
done
;;
-Rns)
rc=$(fake_rc FAKE_PACMAN_RNS_RC 0)
+79
View File
@@ -457,3 +457,82 @@ UPGRADE='apt-get -y -o Dpkg::Options::=--force-confdef -o Dpkg::Options::=--forc
assert_line ' [3] su-dummy-c 1.0 -> 2.0 file:/srv/su-repo ./ [held]'
assert_line 'su-dummy-c: dummy package su-dummy-c for skeptical-updater tests'
}
@test "Nx: consecutive purges use one transaction including orphans" {
FAKE_APT_AUTO_ORPHANS=su-dummy-a:su-dummy-b run skup --no-refresh <<<$'1x 3x\ny\nq'
assert_success
assert_line 'Purge su-dummy-a su-dummy-c now? This also removes: su-dummy-b [y/N] y'
assert_line 'purged: su-dummy-a su-dummy-b su-dummy-c'
assert_line 'Nothing left to upgrade.'
log_has 'apt-get -y purge su-dummy-a su-dummy-b su-dummy-c'
}
@test "Nx: other commands flush the batch before resolving removed rows" {
FAKE_APT_AUTO_ORPHANS=su-dummy-a:su-dummy-b run skup --no-refresh <<<$'1x 2? 3x\ny\ny\nq'
assert_success
assert_line 'purged: su-dummy-a su-dummy-b'
assert_output --partial 'no package [2] in the list'
assert_line 'Purge su-dummy-c now? [y/N] y'
assert_line 'purged: su-dummy-c'
}
@test "Nx: a trust command cannot act on a removed row" {
FAKE_APT_AUTO_ORPHANS=su-dummy-a:su-dummy-b run skup --no-refresh <<<$'1x 2+\ny\nq'
assert_success
assert_output --partial 'no package [2] in the list'
assert_line 'purged: su-dummy-a su-dummy-b'
}
@test "Nx: duplicate targets are purged once" {
run skup --no-refresh <<<$'3x 3x\ny\nq'
assert_success
assert_line 'Purge su-dummy-c now? [y/N] y'
assert_line 'purged: su-dummy-c'
log_has 'apt-get -y purge su-dummy-c'
}
@test "Nx: a refused target does not prevent other purges" {
run skup --no-refresh <<<$'2x 3x\ny\nl\nq'
assert_success
assert_line 'not purged: su-dummy-b is required by: su-dummy-a - purge the dependents first'
assert_line 'purged: su-dummy-c'
log_has 'apt-get -y purge su-dummy-c'
}
@test "Nx: invalid numbers do not interrupt a batch" {
FAKE_APT_AUTO_ORPHANS=su-dummy-a:su-dummy-b run skup --no-refresh <<<$'1x 9x 3x\ny\nq'
assert_success
assert_output --partial 'no package [9] in the list'
assert_line 'purged: su-dummy-a su-dummy-b su-dummy-c'
log_has 'apt-get -y purge su-dummy-a su-dummy-b su-dummy-c'
}
@test "Nx: rejecting the prompt purges nothing" {
run skup --no-refresh <<<$'1x 3x\nn\nl\nq'
assert_success
assert_line 'not purged: su-dummy-a su-dummy-c'
assert_line '3 upgradable, 0 trusted (hidden, use --all to show), 3 to review:'
log_lacks '^apt-get -y purge'
}
@test "Nx: failed transaction keeps all rows" {
FAKE_APT_PURGE_RC=100 run skup --no-refresh <<<$'1x 3x\nyes\nl\nq'
assert_success
assert_output --partial 'purge of su-dummy-a su-dummy-c failed (apt exited 100); the rows stay in the list'
assert_line '3 upgradable, 0 trusted (hidden, use --all to show), 3 to review:'
}
@test "Nx: a dependent and dependency are planned together" {
FAKE_APT_AUTO_ORPHANS=su-dummy-a:su-dummy-b run skup --no-refresh <<<$'2x 1x\ny\nq'
assert_success
assert_line 'Purge su-dummy-a su-dummy-b now? [y/N] y'
assert_line 'purged: su-dummy-a su-dummy-b'
log_has 'apt-get -y purge su-dummy-a su-dummy-b'
}
@test "Nx: unexpected removals never leak into another target's purge" {
FAKE_APT_SIM_EXTRA=su-dummy-a:su-dummy-c run skup --no-refresh <<<$'1x 2x\ny\nq'
assert_success
assert_output --partial 'would also remove su-dummy-c'
log_lacks '^apt-get -y purge'
}