one pacakges with the same name but different versions.
Often needed by kernels.
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 ); }
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
*
*/
_extra_conflicts.erase (capability);
}
-
void Resolver::removeQueueItem (const SolverQueueItem_Ptr item)
{
bool found = false;
// 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();
Resolver::resolvePool()
{
solverInit();
- return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak);
+ return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak,
+ _noObsoletesCapability, _noObsoletesItem, _noObsoletesString
+ );
}
bool
_removed_queue_items.clear();
_added_queue_items.clear();
- return _satResolver->resolveQueue(queue, _addWeak);
+ return _satResolver->resolveQueue(queue, _addWeak,
+ _noObsoletesCapability, _noObsoletesItem, _noObsoletesString);
}
//
// CLASS NAME : Resolver
+typedef std::set<std::string> ObsoleteStrings;
+
class Resolver : public base::ReferenceCounted, private base::NonCopyable {
private:
// 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);
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);
void
-SATResolver::solverInit(const PoolItemList & weakItems)
+SATResolver::solverInit(const PoolItemList & weakItems,
+ const CapabilitySet & noObsoletesCapability,
+ const PoolItemSet & noObsoletesItem,
+ const ObsoleteStrings & noObsoletesString)
{
SATCollectTransact info (*this);
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
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++) {
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++) {
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() );
MIL << "SATResolver::doUpdate()" << endl;
// initialize
- solverInit(PoolItemList());
+ solverInit(PoolItemList(),
+ CapabilitySet(),
+ PoolItemSet(),
+ ObsoleteStrings());
_solv = solver_create( _SATPool, sat::Pool::instance().systemRepo().get() );
_solv->vendorCheckCb = &vendorCheck;
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
// 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();