New option for ignoring Obsoletes. This is used for installing more than
authorStefan Schubert <schubi@suse.de>
Mon, 2 Jun 2008 13:31:09 +0000 (13:31 +0000)
committerStefan Schubert <schubi@suse.de>
Mon, 2 Jun 2008 13:31:09 +0000 (13:31 +0000)
one pacakges with the same name but different versions.
Often needed by kernels.

zypp/Resolver.cc
zypp/Resolver.h
zypp/solver/detail/Resolver.cc
zypp/solver/detail/Resolver.h
zypp/solver/detail/SATResolver.cc
zypp/solver/detail/SATResolver.h

index d9f913c..59b89dc 100644 (file)
@@ -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 ); }
index d189889..598831d 100644 (file)
@@ -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
      *
      */
index 2386f55..dafb683 100644 (file)
@@ -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);
 }
 
 
index a377d3a..2660293 100644 (file)
@@ -88,6 +88,8 @@ namespace zypp
 //
 //     CLASS NAME : Resolver
 
+typedef std::set<std::string> 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);
index 338ce55..4ae6c72 100644 (file)
@@ -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;
index 5ea8962..fcca799 100644 (file)
@@ -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();