From a15334af176a4452ef6eef8d42a4de3648ed8b54 Mon Sep 17 00:00:00 2001 From: Ken Brown Date: Fri, 20 Oct 2017 06:59:54 -0400 Subject: [PATCH] Don't override a Skip selection Introduce SolverTasks::taskSkip, and generate it when the user chooses to Skip a package that the solver wants to install. Implement it by sending a SOLVER_LOCK command on the package name. --- choose.cc | 2 +- libsolv.cc | 20 +++++++++++++++----- libsolv.h | 2 ++ 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/choose.cc b/choose.cc index ad37639..2a7774d 100644 --- a/choose.cc +++ b/choose.cc @@ -420,7 +420,7 @@ ChooserPage::changeTrust(int button, bool test, bool initial) { // but initially we want a task list with any package changes caused by // command line options - // and we don't want to generate spurious Keep tasks + // and we don't want to generate spurious taskKeep or taskSkip tasks for (packagedb::packagecollection::iterator p = db.packages.begin (); p != db.packages.end (); ++p) { diff --git a/libsolv.cc b/libsolv.cc index e623555..2a37a92 100644 --- a/libsolv.cc +++ b/libsolv.cc @@ -72,13 +72,19 @@ RelId2Operator(Id id) // a wrapper around a libsolv Solvable // --------------------------------------------------------------------------- +Id +SolvableVersion::name_id () const +{ + Solvable *solvable = pool_id2solvable(pool, id); + return solvable->name; +} + const std::string SolvableVersion::Name () const { if (!id) return ""; - Solvable *solvable = pool_id2solvable(pool, id); - return std::string(pool_id2str(pool, solvable->name)); + return pool_id2str(pool, name_id()); } const std::string @@ -525,9 +531,8 @@ SolverTasks::setTasks() packagemeta *pkg = p->second; // decode UI state to action - // skip and keep don't change dependency solution - // except when we want to keep a version different from the one - // chosen by the solver + // keep and skip need attention only when they differ from the + // solver's solution if (pkg->installed != pkg->desired) { if (pkg->desired) @@ -542,6 +547,9 @@ SolverTasks::setTasks() else if (pkg->installed != pkg->default_version) add(pkg->installed, taskKeep); // keep } + else if (pkg->default_version) + add(pkg->default_version, taskSkip); // skip + // only install action makes sense for source packages if (pkg->srcpicked()) { @@ -714,6 +722,8 @@ SolverSolution::update(SolverTasks &tasks, updateMode update, bool use_test_pack case SolverTasks::taskKeep: queue_push2(&job, SOLVER_LOCK | SOLVER_SOLVABLE, sv.id); break; + case SolverTasks::taskSkip: + queue_push2(&job, SOLVER_LOCK | SOLVER_SOLVABLE_NAME, sv.name_id()); default: Log (LOG_PLAIN) << "unknown task " << (*i).second << endLog; } diff --git a/libsolv.h b/libsolv.h index e448841..65e1610 100644 --- a/libsolv.h +++ b/libsolv.h @@ -97,6 +97,7 @@ class SolvableVersion friend SolverSolution; const PackageDepends deplist(Id keyname) const; + Id name_id () const; }; // --------------------------------------------------------------------------- @@ -183,6 +184,7 @@ class SolverTasks taskUninstall, taskReinstall, taskKeep, + taskSkip, }; void add(const SolvableVersion &v, task t) { -- 2.14.2