From e53dc4173b6923e7ebb6b1b1812ae88a94f99fd1 Mon Sep 17 00:00:00 2001 From: Jaroslav Mracek Date: Wed, 23 Jun 2021 11:26:22 +0200 Subject: [PATCH] Add support of exclude_from_weak into Goal Exclude_from_weak only prevents packages to be used to satisfy recommend and supplement dependencies. = changelog = msg: Add support for excluding packages to be installed as weak dependencies type: enhancement related: https://bugzilla.redhat.com/show_bug.cgi?id=1699672 --- libdnf.spec | 2 +- libdnf/goal/Goal-private.hpp | 2 ++ libdnf/goal/Goal.cpp | 22 ++++++++++++++++++++-- libdnf/goal/Goal.hpp | 2 ++ python/hawkey/goal-py.cpp | 21 +++++++++++++++++++++ 5 files changed, 46 insertions(+), 3 deletions(-) diff --git a/libdnf.spec b/libdnf.spec index 2b0f52f375..4fe3b58412 100644 --- a/libdnf.spec +++ b/libdnf.spec @@ -1,4 +1,4 @@ -%global libsolv_version 0.7.17 +%global libsolv_version 0.7.20 %global libmodulemd_version 2.13.0 %global librepo_version 1.13.1 %global dnf_conflict 4.3.0 diff --git a/libdnf/goal/Goal-private.hpp b/libdnf/goal/Goal-private.hpp index c559c9793a..ff8a6e1bb1 100644 --- a/libdnf/goal/Goal-private.hpp +++ b/libdnf/goal/Goal-private.hpp @@ -23,6 +23,7 @@ #include "Goal.hpp" #include "IdQueue.hpp" +#include "../sack/packageset.hpp" namespace libdnf { @@ -37,6 +38,7 @@ class Goal::Impl { DnfSack *sack; Queue staging; + PackageSet exclude_from_weak; Solver *solv{nullptr}; ::Transaction *trans{nullptr}; DnfGoalActions actions{DNF_NONE}; diff --git a/libdnf/goal/Goal.cpp b/libdnf/goal/Goal.cpp index a6f11a4ffb..1140955082 100644 --- a/libdnf/goal/Goal.cpp +++ b/libdnf/goal/Goal.cpp @@ -635,7 +635,7 @@ erase_flags2libsolv(int flags) Goal::Goal(const Goal & goal_src) : pImpl(new Impl(*goal_src.pImpl)) {} Goal::Impl::Impl(const Goal::Impl & goal_src) -: sack(goal_src.sack) +: sack(goal_src.sack), exclude_from_weak(goal_src.exclude_from_weak) { queue_init_clone(&staging, const_cast(&goal_src.staging)); @@ -649,7 +649,7 @@ Goal::Impl::Impl(const Goal::Impl & goal_src) } Goal::Impl::Impl(DnfSack *sack) -: sack(sack) +: sack(sack), exclude_from_weak(sack) { queue_init(&staging); } @@ -793,6 +793,18 @@ Goal::favor(DnfPackage *pkg) queue_push2(&pImpl->staging, SOLVER_SOLVABLE|SOLVER_FAVOR, dnf_package_get_id(pkg)); } +void +Goal::add_exclude_from_weak(const DnfPackageSet & pset) +{ + pImpl->exclude_from_weak += pset; +} + +void +Goal::reset_exclude_from_weak() +{ + pImpl->exclude_from_weak.clear(); +} + void Goal::disfavor(DnfPackage *pkg) { @@ -1261,6 +1273,12 @@ Goal::Impl::constructJob(DnfGoalActions flags) elements[i] |= SOLVER_FORCEBEST; } + // Add weak excludes to the job + Id id = -1; + while ((id = exclude_from_weak.next(id)) != -1) { + job->pushBack(SOLVER_SOLVABLE|SOLVER_EXCLUDEFROMWEAK, id); + } + /* turn off implicit obsoletes for installonly packages */ for (int i = 0; i < (int) dnf_sack_get_installonly(sack)->count; i++) job->pushBack(SOLVER_MULTIVERSION|SOLVER_SOLVABLE_PROVIDES, diff --git a/libdnf/goal/Goal.hpp b/libdnf/goal/Goal.hpp index ef5872bf60..07e75febea 100644 --- a/libdnf/goal/Goal.hpp +++ b/libdnf/goal/Goal.hpp @@ -76,6 +76,8 @@ struct Goal { void install(DnfPackage *new_pkg, bool optional); void lock(DnfPackage *new_pkg); void favor(DnfPackage *new_pkg); + void add_exclude_from_weak(const DnfPackageSet & pset); + void reset_exclude_from_weak(); void disfavor(DnfPackage *new_pkg); /** diff --git a/python/hawkey/goal-py.cpp b/python/hawkey/goal-py.cpp index 2641a1d741..0945031c79 100644 --- a/python/hawkey/goal-py.cpp +++ b/python/hawkey/goal-py.cpp @@ -375,6 +375,25 @@ add_protected(_GoalObject *self, PyObject *seq) try Py_RETURN_NONE; } CATCH_TO_PYTHON +static PyObject * +add_exclude_from_weak(_GoalObject *self, PyObject *seq) try +{ + HyGoal goal = self->goal; + auto pset = pyseq_to_packageset(seq, hy_goal_get_sack(goal)); + if (!pset) + return NULL; + goal->add_exclude_from_weak(*(pset.get())); + Py_RETURN_NONE; +} CATCH_TO_PYTHON + +static PyObject * +reset_exclude_from_weak(_GoalObject *self, PyObject *unused) try +{ + HyGoal goal = self->goal; + goal->reset_exclude_from_weak(); + Py_RETURN_NONE; +} CATCH_TO_PYTHON + static PyObject * run(_GoalObject *self, PyObject *args, PyObject *kwds) try { @@ -597,6 +616,8 @@ static struct PyMethodDef goal_methods[] = { NULL}, {"add_protected", (PyCFunction)add_protected, METH_O, NULL}, + {"add_exclude_from_weak", (PyCFunction)add_exclude_from_weak, METH_O, NULL}, + {"reset_exclude_from_weak", (PyCFunction)reset_exclude_from_weak, METH_NOARGS, NULL}, {"distupgrade_all", (PyCFunction)distupgrade_all, METH_NOARGS, NULL}, {"distupgrade", (PyCFunction)distupgrade, METH_VARARGS | METH_KEYWORDS, NULL},