allowing installation of packages with the same name; defined in zypp.conf
authorStefan Schubert <schubi@suse.de>
Wed, 16 Jul 2008 13:46:33 +0000 (13:46 +0000)
committerStefan Schubert <schubi@suse.de>
Wed, 16 Jul 2008 13:46:33 +0000 (13:46 +0000)
zypp.conf
zypp/ResObject.cc
zypp/Resolver.cc
zypp/Resolver.h
zypp/ZConfig.cc
zypp/ZConfig.h
zypp/solver/detail/Resolver.cc
zypp/solver/detail/Resolver.h
zypp/solver/detail/SATResolver.cc
zypp/solver/detail/SATResolver.h

index d0280cf..23b32d3 100644 (file)
--- a/zypp.conf
+++ b/zypp.conf
 # solver.checkSystemFile = /etc/zypp/systemCheck
 
 ##
+## Packages which are parallel installable.
+##
+# parallelInstallable = kernel-default,kernel-smp
+
+##
 ## Path to locks file. If not exist then is create.
 ## In this file is saved also UI locks.
 ##
index 1279132..4803653 100644 (file)
@@ -16,6 +16,8 @@
 #include "zypp/sat/Solvable.h"
 #include "zypp/Repository.h"
 #include "zypp/RepoInfo.h"
+#include "zypp/ZConfig.h"
+#include "zypp/IdString.h"
 
 using namespace zypp;
 using namespace std;
@@ -83,9 +85,13 @@ namespace zypp
   unsigned ResObject::mediaNr() const
   { return lookupNumAttribute( sat::SolvAttr::medianr ); }
 
-#warning DUMMY installOnly
   bool ResObject::installOnly() const
-  { return false; }
+  {
+      std::set<IdString> parallel = ZConfig::instance().parallelInstallable();
+      if (parallel.find(ident()) != parallel.end())
+             return true;
+      return false;
+  }
 
   Date ResObject::buildtime() const
   { return Date( lookupNumAttribute( sat::SolvAttr::buildtime ) ); }
index 5c36785..22df5ad 100644 (file)
@@ -96,26 +96,7 @@ 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()
-  { return _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()
-  { return _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 ()
-  { return _pimpl->noObsoletesString (); }     
-  
+    
   void Resolver::addRequire (const Capability & capability)
   { _pimpl->addExtraRequire( capability ); }
   void Resolver::addConflict (const Capability & capability)
index 4c93287..b8aad5b 100644 (file)
@@ -180,25 +180,6 @@ 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 1d819f4..bc59fe7 100644 (file)
@@ -248,6 +248,15 @@ namespace zypp
                 else if ( entry == "solver.checkSystemFile" )
                 {
                   solver_checkSystemFile = Pathname(value);
+                }
+                else if ( entry == "parallelInstallable" )
+                {
+                 std::list<std::string> parallel;  
+                  str::split( value, back_inserter(parallel), ", \t" );
+                 for ( std::list<string>::const_iterator it = parallel.begin();
+                       it != parallel.end(); it++) {
+                     parallelInstallable.insert (IdString(*it));  
+                 }
                 }              
                 else if ( entry == "locksfile.path" )
                 {
@@ -324,7 +333,9 @@ namespace zypp
     bool download_use_deltarpm;
 
     bool solver_onlyRequires;
-    Pathname solver_checkSystemFile;  
+    Pathname solver_checkSystemFile;
+      
+    std::set<IdString> parallelInstallable;  
 
     bool apply_locks_file;
 
@@ -506,7 +517,16 @@ namespace zypp
 
   Pathname ZConfig::solver_checkSystemFile() const
   { return _pimpl->solver_checkSystemFile; }
+
+
+  std::set<IdString> ZConfig::parallelInstallable() const
+  { return _pimpl->parallelInstallable; }
+
+  void ZConfig::addParallelInstallable(std::string &name)
+  { _pimpl->parallelInstallable.insert(IdString(name)); }
     
+  bool ZConfig::removeParallelInstallable(std::string &name)
+  { return _pimpl->parallelInstallable.erase(IdString(name)); }      
 
   bool ZConfig::apply_locks_file() const
   {
index 5f1d5ac..7ec7727 100644 (file)
@@ -13,6 +13,8 @@
 #define ZYPP_ZCONFIG_H
 
 #include <iosfwd>
+#include <set>
+#include <string>
 
 #include "zypp/base/Deprecated.h"
 
@@ -22,6 +24,7 @@
 #include "zypp/Arch.h"
 #include "zypp/Locale.h"
 #include "zypp/Pathname.h"
+#include "zypp/IdString.h"
 
 ///////////////////////////////////////////////////////////////////
 namespace zypp
@@ -181,6 +184,14 @@ namespace zypp
       Pathname solver_checkSystemFile() const;
 
       /**
+       * Packages which can be installed parallel.
+       * Returning a set of package names (IdString)
+       */      
+      std::set<IdString> parallelInstallable() const;
+      void addParallelInstallable(std::string &name);
+      bool removeParallelInstallable(std::string &name);      
+
+      /**
        * Path where zypp can find or create lock file (configPath()/locks)
        * \ingroup g_ZC_CONFIGFILES
        */
index 1e62d53..88b6266 100644 (file)
@@ -242,11 +242,6 @@ 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();    
@@ -314,9 +309,7 @@ bool
 Resolver::resolvePool()
 {
     solverInit();
-    return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak,
-                                    _noObsoletesCapability, _noObsoletesItem, _noObsoletesString   
-                                    );
+    return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak);
 }
 
 bool
@@ -356,8 +349,7 @@ Resolver::resolveQueue(solver::detail::SolverQueueItemList & queue)
     _removed_queue_items.clear();
     _added_queue_items.clear();
     
-    return _satResolver->resolveQueue(queue, _addWeak,
-                                     _noObsoletesCapability, _noObsoletesItem, _noObsoletesString);
+    return _satResolver->resolveQueue(queue, _addWeak);
 }
 
 
index 607253a..b1a47b4 100644 (file)
@@ -88,8 +88,6 @@ namespace zypp
 //
 //     CLASS NAME : Resolver
 
-typedef std::set<std::string> ObsoleteStrings; 
-
 class Resolver : public base::ReferenceCounted, private base::NonCopyable {
 
   private:
@@ -131,15 +129,8 @@ class Resolver : public base::ReferenceCounted, private base::NonCopyable {
     ItemCapKindMap _installs;
     ItemCapKindMap _satifiedByInstalled;
     ItemCapKindMap _installedSatisfied;
-
-
-    // Ignore Obsoletes
-    CapabilitySet _noObsoletesCapability;
-    PoolItemSet _noObsoletesItem;
-    ObsoleteStrings _noObsoletesString;   
     
     // helpers
-    bool doesObsoleteCapability (PoolItem candidate, const Capability & cap);
     bool doesObsoleteItem (PoolItem candidate, PoolItem installed);
     void collectResolverInfo (void);    
 
@@ -166,32 +157,6 @@ 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 bdbdda0..16c913b 100644 (file)
@@ -251,6 +251,13 @@ SATResolver::addPoolItemToLock (PoolItem item)
 }
 
 void
+SATResolver::addPoolItemParallelInstall(PoolItem item)
+{
+    _items_parallel_install.push_back (item);
+    _items_parallel_install.unique ();
+}
+
+void
 SATResolver::addPoolItemToKeep (PoolItem item)
 {
     resetItemTransaction (item);    
@@ -347,6 +354,10 @@ struct SATCollectTransact : public resfilter::PoolItemFilterFunctor
 
     bool operator()( PoolItem item )           // only transacts() items go here
     {
+       if (item->installOnly()) {
+           resolver. addPoolItemParallelInstall(item);     
+       }
+       
        ResStatus status = item.status();
        bool by_solver = (status.isBySolver() || status.isByApplLow());
 
@@ -369,7 +380,7 @@ struct SATCollectTransact : public resfilter::PoolItemFilterFunctor
         else if (status.isKept()
                 && !by_solver) {
            resolver.addPoolItemToKeep (item);
-        }      
+        }
 
        return true;
     }
@@ -579,10 +590,7 @@ SATResolver::solving()
 
 
 void
-SATResolver::solverInit(const PoolItemList & weakItems,
-                       const CapabilitySet & noObsoletesCapability,
-                       const PoolItemSet & noObsoletesItem,
-                       const ObsoleteStrings & noObsoletesString)
+SATResolver::solverInit(const PoolItemList & weakItems)
 {
     SATCollectTransact info (*this);
     
@@ -599,7 +607,8 @@ SATResolver::solverInit(const PoolItemList & weakItems,
     _items_to_install.clear();
     _items_to_remove.clear();
     _items_to_lock.clear();
-    _items_to_keep.clear();    
+    _items_to_keep.clear();
+    _items_parallel_install.clear();
 
     invokeOnEach ( _pool.begin(), _pool.end(),
                   functor::functorRef<bool,PoolItem>(info) );
@@ -614,13 +623,7 @@ SATResolver::solverInit(const PoolItemList & weakItems,
         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) {
+    for (PoolItemList::iterator it = _items_parallel_install.begin(); it != _items_parallel_install.end(); ++it) {
        Id id = (*it)->satSolvable().id();
        if (id == ID_NULL) {
            ERR << "Item " << *it << " not found" << endl;
@@ -630,13 +633,6 @@ SATResolver::solverInit(const PoolItemList & weakItems,
            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
@@ -652,18 +648,12 @@ SATResolver::solverEnd()
 bool
 SATResolver::resolvePool(const CapabilitySet & requires_caps,
                         const CapabilitySet & conflict_caps,
-                        const PoolItemList & weakItems,
-                        const CapabilitySet & noObsoletesCapability,
-                        const PoolItemSet & noObsoletesItem,
-                        const ObsoleteStrings & noObsoletesString)
+                        const PoolItemList & weakItems)
 {
     MIL << "SATResolver::resolvePool()" << endl;
     
     // initialize
-    solverInit(weakItems,
-              noObsoletesCapability,
-              noObsoletesItem,
-              noObsoletesString);
+    solverInit(weakItems);
     
     for (PoolItemList::const_iterator iter = _items_to_install.begin(); iter != _items_to_install.end(); iter++) {
        Id id = (*iter)->satSolvable().id();
@@ -714,18 +704,12 @@ SATResolver::resolvePool(const CapabilitySet & requires_caps,
 
 bool
 SATResolver::resolveQueue(const SolverQueueItemList &requestQueue,
-                         const PoolItemList & weakItems,
-                         const CapabilitySet & noObsoletesCapability,
-                         const PoolItemSet & noObsoletesItem,
-                         const ObsoleteStrings & noObsoletesString)
+                         const PoolItemList & weakItems)
 {
     MIL << "SATResolver::resolvQueue()" << endl;
     
     // initialize
-    solverInit(weakItems,
-              noObsoletesCapability,
-              noObsoletesItem,
-              noObsoletesString);
+    solverInit(weakItems);
 
     // generate solver queue
     for (SolverQueueItemList::const_iterator iter = requestQueue.begin(); iter != requestQueue.end(); iter++) {
@@ -773,10 +757,7 @@ void SATResolver::doUpdate()
     MIL << "SATResolver::doUpdate()" << endl;
 
     // initialize
-    solverInit(PoolItemList(),
-              CapabilitySet(),
-              PoolItemSet(),
-              ObsoleteStrings());
+    solverInit(PoolItemList());
 
     // set requirements for a running system
     setSystemRequirements();
index a2d2bc2..5d18558 100644 (file)
@@ -70,6 +70,7 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable {
     PoolItemList _items_to_remove;
     PoolItemList _items_to_lock;
     PoolItemList _items_to_keep;
+    PoolItemList _items_parallel_install;
 
     // solve results
     PoolItemList _result_items_to_install;
@@ -92,10 +93,7 @@ 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,
-                   const CapabilitySet & noObsoletesCapability,
-                   const PoolItemSet & noObsoletesItem,
-                   const ObsoleteStrings & noObsoletesString);
+    void solverInit(const PoolItemList & weakItems);
     // common solver run with the _jobQueue; Save results back to pool
     bool solving();
     // cleanup solver
@@ -122,17 +120,11 @@ 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 CapabilitySet & noObsoletesCapability,
-                    const PoolItemSet & noObsoletesItem,
-                    const ObsoleteStrings & noObsoletesString
+                    const PoolItemList & weakItems
                     );
     // solver run with the given request queue
     bool resolveQueue(const SolverQueueItemList &requestQueue,
-                     const PoolItemList & weakItems,
-                     const CapabilitySet & noObsoletesCapability,
-                     const PoolItemSet & noObsoletesItem,
-                     const ObsoleteStrings & noObsoletesString               
+                     const PoolItemList & weakItems
                      );
     // searching for new packages
     void doUpdate();
@@ -144,7 +136,9 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable {
     void addPoolItemsToInstallFromList (PoolItemList & rl);
 
     void addPoolItemToLock (PoolItem item);
-    void addPoolItemToKeep (PoolItem item);    
+    void addPoolItemToKeep (PoolItem item);
+
+    void addPoolItemParallelInstall (PoolItem item);        
 
     void addPoolItemToRemove (PoolItem item);
     void addPoolItemsToRemoveFromList (PoolItemList & rl);