enable require,conflicts jobs in the SAT-solver
authorStefan Schubert <schubi@suse.de>
Tue, 15 Jan 2008 15:50:23 +0000 (15:50 +0000)
committerStefan Schubert <schubi@suse.de>
Tue, 15 Jan 2008 15:50:23 +0000 (15:50 +0000)
zypp/sat/SATResolver.cc
zypp/sat/SATResolver.h
zypp/solver/detail/Resolver.cc

index 57f99d418a24d986d37c2370399947b617d4dd48..039612d1583d603c6b34c193d909b3a9941f89e7 100644 (file)
@@ -381,7 +381,8 @@ class CheckIfUpdate : public resfilter::PoolItemFilterFunctor
 
 
 bool
-SATResolver::resolvePool()
+SATResolver::resolvePool(const CapSet & requires_caps,
+                        const CapSet & conflict_caps)
 {
     SATCollectTransact info (*this);
     MIL << "SATResolver::resolvePool()" << endl;
@@ -427,6 +428,19 @@ SATResolver::resolvePool()
        queue_push( &(jobQueue), SOLVER_ERASE_SOLVABLE_NAME );
        queue_push( &(jobQueue), s->name);
     }
+
+    for (CapSet::const_iterator iter = requires_caps.begin(); iter != requires_caps.end(); iter++) {
+       queue_push( &(jobQueue), SOLVER_INSTALL_SOLVABLE_PROVIDES );
+       queue_push( &(jobQueue), str2id( _SATPool, (iter->asString()).c_str(), 1 ) );
+       MIL << "Requires " << iter->asString() << endl;
+    }
+
+    for (CapSet::const_iterator iter = conflict_caps.begin(); iter != conflict_caps.end(); iter++) {
+       queue_push( &(jobQueue), SOLVER_ERASE_SOLVABLE_PROVIDES);
+       queue_push( &(jobQueue), str2id( _SATPool, (iter->asString()).c_str(), 1 ));
+       MIL << "Conflicts " << iter->asString() << endl;        
+    }
+    
     solv = solver_create( _SATPool, sat::Pool::instance().systemRepo().get() );
     sat::Pool::instance().setDirty();
     sat::Pool::instance().prepare();
index be0e814a4407da018c2f1b033e66b9288450d179..fdb28bd2f8405fa697cc491bcd43ebd5c9762516 100644 (file)
@@ -34,6 +34,7 @@
 #include "zypp/ProblemTypes.h"
 #include "zypp/ResolverProblem.h"
 #include "zypp/ProblemSolution.h"
+#include "zypp/CapSet.h"
 extern "C" {
 #include "satsolver/solver.h"
 #include "satsolver/pool.h"
@@ -98,7 +99,8 @@ class SATResolver : public base::ReferenceCounted, private base::NonCopyable {
     ResPool pool (void) const;
     void setPool (const ResPool & pool) { _pool = pool; }
 
-    bool resolvePool();
+    bool resolvePool(const CapSet & requires_caps,
+                    const CapSet & conflict_caps);
 
     ResolverProblemList problems ();
     void applySolutions (const ProblemSolutionList &solutions);
index 350b500874bb749531bd071cc23e939c004dce55..1554cd21aed507a87ae82541e2670daab2201ca3 100644 (file)
@@ -1326,7 +1326,7 @@ Resolver::resolvePool( bool tryAllPossibilities )
        }
        MIL << "------SAT-Pool end------" << endl;
 #endif
-       return _satResolver->resolvePool();
+       return _satResolver->resolvePool (_extra_caps, _extra_conflicts);
     }
     
     ResolverContext_Ptr saveContext = _best_context;