From 3f3117fb02d2360c58e9b5fb0eb371bca1d533f9 Mon Sep 17 00:00:00 2001 From: Stefan Schubert Date: Mon, 2 Jun 2008 13:31:09 +0000 Subject: [PATCH] New option for ignoring Obsoletes. This is used for installing more than one pacakges with the same name but different versions. Often needed by kernels. --- zypp/Resolver.cc | 19 +++++++++++ zypp/Resolver.h | 19 +++++++++++ zypp/solver/detail/Resolver.cc | 13 ++++++-- zypp/solver/detail/Resolver.h | 34 ++++++++++++++++++++ zypp/solver/detail/SATResolver.cc | 68 ++++++++++++++++++++++++++++++++------- zypp/solver/detail/SATResolver.h | 17 ++++++++-- 6 files changed, 152 insertions(+), 18 deletions(-) diff --git a/zypp/Resolver.cc b/zypp/Resolver.cc index d9f913c..59b89dc 100644 --- a/zypp/Resolver.cc +++ b/zypp/Resolver.cc @@ -96,6 +96,25 @@ namespace zypp else return _pimpl->onlyRequires(); } + + void Resolver::addNoObsoletesCapability (const Capability & capability) + { _pimpl->addNoObsoletesCapability (capability); } + void Resolver::removeNoObsoletesCapability (const Capability & capability) + { _pimpl->removeNoObsoletesCapability (capability); } + CapabilitySet Resolver::noObsoletesCapability() + { _pimpl->noObsoletesCapability(); } + void Resolver::addNoObsoletesItem (const PoolItem & item) + { _pimpl->addNoObsoletesItem (item); } + void Resolver::removeNoObsoletesItem (const PoolItem & item) + { _pimpl->removeNoObsoletesItem (item); } + solver::detail::PoolItemSet Resolver::noObsoletesItem() + { _pimpl->noObsoletesItem(); } + void Resolver::addNoObsoletesName (const std::string & name) + { _pimpl->addNoObsoletesName (name); } + void Resolver::removeNoObsoletesName (const std::string & name) + { _pimpl->removeNoObsoletesName (name); } + solver::detail::ObsoleteStrings Resolver::noObsoletesString () + { _pimpl->noObsoletesString (); } void Resolver::addRequire (const Capability & capability) { _pimpl->addExtraRequire( capability ); } diff --git a/zypp/Resolver.h b/zypp/Resolver.h index d189889..598831d 100644 --- a/zypp/Resolver.h +++ b/zypp/Resolver.h @@ -180,6 +180,25 @@ namespace zypp bool onlyRequires(); /** + * Ignore Obsoletes. This is used for installing more than + * one pacakges with the same name but different versions. + * Often needed by kernels. + **/ + /* via capability who provides it */ + void addNoObsoletesCapability (const Capability & capability); + void removeNoObsoletesCapability (const Capability & capability); + CapabilitySet noObsoletesCapability(); + /* via poolItem */ + void addNoObsoletesItem (const PoolItem & item); + void removeNoObsoletesItem (const PoolItem & item); + solver::detail::PoolItemSet noObsoletesItem(); + + // via package name + void addNoObsoletesName (const std::string & name); + void removeNoObsoletesName (const std::string & name); + solver::detail::ObsoleteStrings noObsoletesString (); + + /** * Adding additional requirement * */ diff --git a/zypp/solver/detail/Resolver.cc b/zypp/solver/detail/Resolver.cc index 2386f55..dafb683 100644 --- a/zypp/solver/detail/Resolver.cc +++ b/zypp/solver/detail/Resolver.cc @@ -138,7 +138,6 @@ Resolver::removeExtraConflict (const Capability & capability) _extra_conflicts.erase (capability); } - void Resolver::removeQueueItem (const SolverQueueItem_Ptr item) { bool found = false; @@ -241,6 +240,11 @@ Resolver::undo(void) // Regard dependencies of the item weak onl _addWeak.clear(); + // Ignore Obsoletes + _noObsoletesCapability.clear(); + _noObsoletesItem.clear(); + _noObsoletesString.clear(); + // Additional QueueItems which has to be regarded by the solver _removed_queue_items.clear(); _added_queue_items.clear(); @@ -307,7 +311,9 @@ bool Resolver::resolvePool() { solverInit(); - return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak); + return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak, + _noObsoletesCapability, _noObsoletesItem, _noObsoletesString + ); } bool @@ -347,7 +353,8 @@ Resolver::resolveQueue(solver::detail::SolverQueueItemList & queue) _removed_queue_items.clear(); _added_queue_items.clear(); - return _satResolver->resolveQueue(queue, _addWeak); + return _satResolver->resolveQueue(queue, _addWeak, + _noObsoletesCapability, _noObsoletesItem, _noObsoletesString); } diff --git a/zypp/solver/detail/Resolver.h b/zypp/solver/detail/Resolver.h index a377d3a..2660293 100644 --- a/zypp/solver/detail/Resolver.h +++ b/zypp/solver/detail/Resolver.h @@ -88,6 +88,8 @@ namespace zypp // // CLASS NAME : Resolver +typedef std::set ObsoleteStrings; + class Resolver : public base::ReferenceCounted, private base::NonCopyable { private: @@ -127,6 +129,12 @@ class Resolver : public base::ReferenceCounted, private base::NonCopyable { // Additional information about the solverrun ItemCapKindMap _isInstalledBy; ItemCapKindMap _installs; + + + // Ignore Obsoletes + CapabilitySet _noObsoletesCapability; + PoolItemSet _noObsoletesItem; + ObsoleteStrings _noObsoletesString; // helpers bool doesObsoleteCapability (PoolItem candidate, const Capability & cap); @@ -156,6 +164,32 @@ class Resolver : public base::ReferenceCounted, private base::NonCopyable { ResPool pool (void) const; void setPool (const ResPool & pool) { _pool = pool; } + + // Ignore Obsoletes. This is used for installing more than + // one pacakges with the same name but different versions. + // Often needed by kernels. + + // via capability who provides it + void addNoObsoletesCapability (const Capability & capability) + { _noObsoletesCapability.insert (capability); } + void removeNoObsoletesCapability (const Capability & capability) + { _noObsoletesCapability.erase (capability); } + CapabilitySet noObsoletesCapability() { return _noObsoletesCapability;} + + // via poolItem + void addNoObsoletesItem (const PoolItem & item) + { _noObsoletesItem.insert (item); } + void removeNoObsoletesItem (const PoolItem & item) + { _noObsoletesItem.erase (item); } + PoolItemSet noObsoletesItem() { return _noObsoletesItem; } + + // via package name + void addNoObsoletesName (const std::string & name) + { _noObsoletesString.insert (name); } + void removeNoObsoletesName (const std::string & name) + { _noObsoletesString.erase (name); } + ObsoleteStrings noObsoletesString () { return _noObsoletesString; } + void addExtraRequire (const Capability & capability); void removeExtraRequire (const Capability & capability); void addExtraConflict (const Capability & capability); diff --git a/zypp/solver/detail/SATResolver.cc b/zypp/solver/detail/SATResolver.cc index 338ce55..4ae6c72 100644 --- a/zypp/solver/detail/SATResolver.cc +++ b/zypp/solver/detail/SATResolver.cc @@ -574,7 +574,10 @@ SATResolver::solving() void -SATResolver::solverInit(const PoolItemList & weakItems) +SATResolver::solverInit(const PoolItemList & weakItems, + const CapabilitySet & noObsoletesCapability, + const PoolItemSet & noObsoletesItem, + const ObsoleteStrings & noObsoletesString) { SATCollectTransact info (*this); @@ -605,6 +608,30 @@ SATResolver::solverInit(const PoolItemList & weakItems) queue_push( &(_jobQueue), SOLVER_WEAKEN_SOLVABLE_DEPS ); queue_push( &(_jobQueue), id ); } + + for (CapabilitySet::const_iterator iter = noObsoletesCapability.begin(); iter != noObsoletesCapability.end(); iter++) { + queue_push( &(_jobQueue), SOLVER_NOOBSOLETES_SOLVABLE_PROVIDES ); + queue_push( &(_jobQueue), iter->id() ); + MIL << "Ignore Obsoletes of provided capability: " << *iter << endl; + } + + for (PoolItemSet::iterator it = noObsoletesItem.begin(); it != noObsoletesItem.end(); ++it) { + Id id = (*it)->satSolvable().id(); + if (id == ID_NULL) { + ERR << "Item " << *it << " not found" << endl; + } else { + MIL << "Ignore Obsoletes of item: " << *it << endl; + queue_push( &(_jobQueue), SOLVER_NOOBSOLETES_SOLVABLE ); + queue_push( &(_jobQueue), id ); + } + } + + for (ObsoleteStrings::iterator it = noObsoletesString.begin(); it != noObsoletesString.end(); ++it) { + MIL << "Ignore Obsoletes of name: " << *it << endl; + ::Id id = IdString(*it).id(); + queue_push( &(_jobQueue), SOLVER_NOOBSOLETES_SOLVABLE_NAME ); + queue_push( &(_jobQueue), id ); + } } void @@ -620,21 +647,28 @@ SATResolver::solverEnd() bool SATResolver::resolvePool(const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps, - const PoolItemList & weakItems) + const PoolItemList & weakItems, + const CapabilitySet & noObsoletesCapability, + const PoolItemSet & noObsoletesItem, + const ObsoleteStrings & noObsoletesString) { MIL << "SATResolver::resolvePool()" << endl; // initialize - solverInit(weakItems); + solverInit(weakItems, + noObsoletesCapability, + noObsoletesItem, + noObsoletesString); for (PoolItemList::const_iterator iter = _items_to_install.begin(); iter != _items_to_install.end(); iter++) { Id id = (*iter)->satSolvable().id(); if (id == ID_NULL) { ERR << "Install: " << *iter << " not found" << endl; + } else { + MIL << "Install " << *iter << endl; + queue_push( &(_jobQueue), SOLVER_INSTALL_SOLVABLE ); + queue_push( &(_jobQueue), id ); } - MIL << "Install " << *iter << endl; - queue_push( &(_jobQueue), SOLVER_INSTALL_SOLVABLE ); - queue_push( &(_jobQueue), id ); } for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) { @@ -695,12 +729,18 @@ SATResolver::resolvePool(const CapabilitySet & requires_caps, bool SATResolver::resolveQueue(const SolverQueueItemList &requestQueue, - const PoolItemList & weakItems) + const PoolItemList & weakItems, + const CapabilitySet & noObsoletesCapability, + const PoolItemSet & noObsoletesItem, + const ObsoleteStrings & noObsoletesString) { MIL << "SATResolver::resolvQueue()" << endl; // initialize - solverInit(weakItems); + solverInit(weakItems, + noObsoletesCapability, + noObsoletesItem, + noObsoletesString); // generate solver queue for (SolverQueueItemList::const_iterator iter = requestQueue.begin(); iter != requestQueue.end(); iter++) { @@ -712,10 +752,11 @@ SATResolver::resolveQueue(const SolverQueueItemList &requestQueue, Id id = (*iter)->satSolvable().id(); if (id == ID_NULL) { ERR << "Install: " << *iter << " not found" << endl; + } else { + MIL << "Install " << *iter << endl; + queue_push( &(_jobQueue), SOLVER_INSTALL_SOLVABLE ); + queue_push( &(_jobQueue), id ); } - MIL << "Install " << *iter << endl; - queue_push( &(_jobQueue), SOLVER_INSTALL_SOLVABLE ); - queue_push( &(_jobQueue), id ); } for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) { sat::detail::IdType ident( (*iter)->satSolvable().ident().id() ); @@ -766,7 +807,10 @@ void SATResolver::doUpdate() MIL << "SATResolver::doUpdate()" << endl; // initialize - solverInit(PoolItemList()); + solverInit(PoolItemList(), + CapabilitySet(), + PoolItemSet(), + ObsoleteStrings()); _solv = solver_create( _SATPool, sat::Pool::instance().systemRepo().get() ); _solv->vendorCheckCb = &vendorCheck; diff --git a/zypp/solver/detail/SATResolver.h b/zypp/solver/detail/SATResolver.h index 5ea8962..fcca799 100644 --- a/zypp/solver/detail/SATResolver.h +++ b/zypp/solver/detail/SATResolver.h @@ -92,7 +92,10 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable { void resetItemTransaction (PoolItem item); // Create a SAT solver and reset solver selection in the pool (Collecting - void solverInit(const PoolItemList & weakItems); + void solverInit(const PoolItemList & weakItems, + const CapabilitySet & noObsoletesCapability, + const PoolItemSet & noObsoletesItem, + const ObsoleteStrings & noObsoletesString); // common solver run with the _jobQueue; Save results back to pool bool solving(); // cleanup solver @@ -115,10 +118,18 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable { // solver run with pool selected items bool resolvePool(const CapabilitySet & requires_caps, const CapabilitySet & conflict_caps, - const PoolItemList & weakItems); + const PoolItemList & weakItems, + const CapabilitySet & noObsoletesCapability, + const PoolItemSet & noObsoletesItem, + const ObsoleteStrings & noObsoletesString + ); // solver run with the given request queue bool resolveQueue(const SolverQueueItemList &requestQueue, - const PoolItemList & weakItems); + const PoolItemList & weakItems, + const CapabilitySet & noObsoletesCapability, + const PoolItemSet & noObsoletesItem, + const ObsoleteStrings & noObsoletesString + ); // searching for new packages void doUpdate(); -- 2.7.4