From 8c005d2b596ef737db36408f59c95cc0a756a4a5 Mon Sep 17 00:00:00 2001 From: Evan Goode Date: Mon, 17 Jul 2023 15:50:41 -0400 Subject: [PATCH] Allow obsoletion of protected packages As described at the end of this comment: https://github.com/rpm-software-management/dnf/pull/1926#issue-1692834834 There should be some mechanism for replacing even protected packages, e.g. to upgrade DNF to DNF 5. Obsoleting a protected package is less likely to happen accidentally than removing it. But this change does mean that a protected package could be obsoleted, and then the obsoleter could be removed, which is perhaps not ideal. IMO a better, more "declarative" way, might be to disallow any transaction that would result in a protected package no longer being provided. But I'm not sure how to do this without modifying libsolv. --- libdnf/goal/Goal.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/libdnf/goal/Goal.cpp b/libdnf/goal/Goal.cpp index 7def8371c..4daa153c0 100644 --- a/libdnf/goal/Goal.cpp +++ b/libdnf/goal/Goal.cpp @@ -1631,12 +1631,18 @@ Goal::Impl::protectedInRemovals() if ((!protectedPkgs || !protectedPkgs->size()) && !protect_running_kernel) return false; auto pkgRemoveList = listResults(SOLVER_TRANSACTION_ERASE, 0); + Id protected_kernel = protectedRunningKernel(); auto pkgObsoleteList = listResults(SOLVER_TRANSACTION_OBSOLETED, 0); - map_or(pkgRemoveList.getMap(), pkgObsoleteList.getMap()); + // Special case: consider the obsoletion of the running kernel as a + // removal. Obsoletion of other protected packages should be allowed. + for (size_t obsolete_index = 0; obsolete_index < pkgObsoleteList.size(); obsolete_index += 1) { + if (protected_kernel == pkgObsoleteList[obsolete_index]) { + pkgRemoveList.set(protected_kernel); + } + } removalOfProtected.reset(new PackageSet(pkgRemoveList)); Id id = -1; - Id protected_kernel = protectedRunningKernel(); while(true) { id = removalOfProtected->next(id); if (id == -1)