feat: purge selected packages in one transaction
This commit is contained in:
1 parent
2aa0a21056
commit
57a3dc97d6
5 files changed
+222
-67
No files matched your search
@@ -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'
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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'
|
||||
}
|
||||
Reference in new issue
Block a user