Imported Upstream version 16.3.2
[platform/upstream/libzypp.git] / zypp / solver / detail / Resolver.cc
index fa6a2bd..7801a50 100644 (file)
  */
 #include <boost/static_assert.hpp>
 
+#define ZYPP_USE_RESOLVER_INTERNALS
+
 #include "zypp/solver/detail/Resolver.h"
-#include "zypp/solver/detail/Helper.h"
 #include "zypp/solver/detail/Testcase.h"
 #include "zypp/solver/detail/SATResolver.h"
+#include "zypp/solver/detail/ItemCapKind.h"
+#include "zypp/solver/detail/SolutionAction.h"
+#include "zypp/solver/detail/SolverQueueItem.h"
 
 #include "zypp/Capabilities.h"
 #include "zypp/ZConfig.h"
 #include "zypp/ResFilters.h"
 #include "zypp/sat/Pool.h"
 #include "zypp/sat/Solvable.h"
+#include "zypp/sat/Transaction.h"
+#include "zypp/ResolverProblem.h"
 
 #define MAXSOLVERRUNS 5
 
+using std::endl;
+using std::make_pair;
+
 /////////////////////////////////////////////////////////////////////////
 namespace zypp
 { ///////////////////////////////////////////////////////////////////////
@@ -48,18 +57,26 @@ namespace zypp
     namespace detail
     { ///////////////////////////////////////////////////////////////////
 
-using namespace std;
-
-IMPL_PTR_TYPE(Resolver);
-
+      //using namespace std;
 
 //---------------------------------------------------------------------------
 
 
-std::ostream &
-Resolver::dumpOn( std::ostream & os ) const
+std::ostream & Resolver::dumpOn( std::ostream & os ) const
 {
-    return os << "<resolver/>";
+  os << "<resolver>" << endl;
+  #define OUTS(t) os << "  " << #t << ":\t" << t << endl;
+  OUTS( _forceResolve );
+  OUTS( _upgradeMode );
+  OUTS( _updateMode );
+  OUTS( _verifying );
+  OUTS( _onlyRequires );
+  OUTS( _allowVendorChange );
+  OUTS( _solveSrcPackages );
+  OUTS( _cleandepsOnRemove );
+  OUTS( _ignoreAlreadyRecommended );
+  #undef OUT
+  return os << "<resolver/>";
 }
 
 
@@ -69,13 +86,15 @@ Resolver::Resolver (const ResPool & pool)
     : _pool(pool)
     , _satResolver(NULL)
     , _poolchanged(_pool.serial() )
-    , _testing(false)
-    , _forceResolve(false)
-    , _upgradeMode(false)
-    , _updateMode(false)
-    , _verifying(false)
-    , _onlyRequires(indeterminate)
-    , _ignorealreadyrecommended(false)
+    , _forceResolve            (false)
+    , _upgradeMode             (false)
+    , _updateMode              (false)
+    , _verifying               (false)
+    , _onlyRequires            ( ZConfig::instance().solver_onlyRequires() )
+    , _allowVendorChange       ( ZConfig::instance().solver_allowVendorChange() )
+    , _solveSrcPackages                ( false )
+    , _cleandepsOnRemove       ( ZConfig::instance().solver_cleandepsOnRemove() )
+    , _ignoreAlreadyRecommended        ( true )
 
 {
     sat::Pool satPool( sat::Pool::instance() );
@@ -85,18 +104,46 @@ Resolver::Resolver (const ResPool & pool)
 
 Resolver::~Resolver()
 {
+  delete _satResolver;
 }
 
 //---------------------------------------------------------------------------
+// forward flags too SATResolver
+#define ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER, ZVARNAME, ZVARDEFAULT )                   \
+    void Resolver::ZSETTER( TriBool state_r )                                          \
+    { _satResolver->ZVARNAME = indeterminate(state_r) ? ZVARDEFAULT : bool(state_r); } \
+    bool Resolver::ZGETTER() const                                                     \
+    { return _satResolver->ZVARNAME; }                                                 \
+
+ZOLV_FLAG_TRIBOOL( dupSetAllowDowngrade,       dupAllowDowngrade,      _dup_allowdowngrade,    ZConfig::instance().solver_dupAllowDowngrade() )
+ZOLV_FLAG_TRIBOOL( dupSetAllowNameChange,      dupAllowNameChange,     _dup_allownamechange,   ZConfig::instance().solver_dupAllowNameChange() )
+ZOLV_FLAG_TRIBOOL( dupSetAllowArchChange,      dupAllowArchChange,     _dup_allowarchchange,   ZConfig::instance().solver_dupAllowArchChange() )
+ZOLV_FLAG_TRIBOOL( dupSetAllowVendorChange,    dupAllowVendorChange,   _dup_allowvendorchange, ZConfig::instance().solver_dupAllowVendorChange() )
+
+#undef ZOLV_FLAG_TRIBOOL
+//---------------------------------------------------------------------------
+
+void Resolver::setAllowVendorChange( TriBool state_r )
+{
+  _allowVendorChange = indeterminate(state_r) ? ZConfig::instance().solver_allowVendorChange() : bool(state_r);
+}
+
+void Resolver::setOnlyRequires( TriBool state_r )
+{
+  _onlyRequires = indeterminate(state_r) ? ZConfig::instance().solver_onlyRequires() : bool(state_r);
+}
 
-ResPool
-Resolver::pool (void) const
+void Resolver::setCleandepsOnRemove( TriBool state_r )
 {
-    return _pool;
+  _cleandepsOnRemove = indeterminate(state_r) ? ZConfig::instance().solver_cleandepsOnRemove() : bool(state_r);
 }
 
-void
-Resolver::reset (bool keepExtras )
+//---------------------------------------------------------------------------
+
+ResPool Resolver::pool() const
+{ return _pool; }
+
+void Resolver::reset( bool keepExtras )
 {
     _verifying = false;
 
@@ -111,8 +158,14 @@ Resolver::reset (bool keepExtras )
     _installedSatisfied.clear();
 }
 
-void
-Resolver::doUpdate()
+bool Resolver::doUpgrade()
+{
+  // Setting Resolver to upgrade mode. SAT solver will do the update
+  _upgradeMode = true;
+  return resolvePool();
+}
+
+void Resolver::doUpdate()
 {
     _updateMode = true;
     return _satResolver->doUpdate();
@@ -121,31 +174,19 @@ Resolver::doUpdate()
 PoolItemList Resolver::problematicUpdateItems() const
 { return _satResolver->problematicUpdateItems(); }
 
-void
-Resolver::addExtraRequire (const Capability & capability)
-{
-    _extra_requires.insert (capability);
-}
+void Resolver::addExtraRequire( const Capability & capability )
+{ _extra_requires.insert (capability); }
 
-void
-Resolver::removeExtraRequire (const Capability & capability)
-{
-    _extra_requires.erase (capability);
-}
+void Resolver::removeExtraRequire( const Capability & capability )
+{ _extra_requires.erase (capability); }
 
-void
-Resolver::addExtraConflict (const Capability & capability)
-{
-    _extra_conflicts.insert (capability);
-}
+void Resolver::addExtraConflict( const Capability & capability )
+{ _extra_conflicts.insert (capability); }
 
-void
-Resolver::removeExtraConflict (const Capability & capability)
-{
-    _extra_conflicts.erase (capability);
-}
+void Resolver::removeExtraConflict( const Capability & capability )
+{ _extra_conflicts.erase (capability); }
 
-void Resolver::removeQueueItem (const SolverQueueItem_Ptr item)
+void Resolver::removeQueueItem( SolverQueueItem_Ptr item )
 {
     bool found = false;
     for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin();
@@ -161,7 +202,8 @@ void Resolver::removeQueueItem (const SolverQueueItem_Ptr item)
        _removed_queue_items.unique ();
     }
 }
-void Resolver::addQueueItem (const SolverQueueItem_Ptr item)
+
+void Resolver::addQueueItem( SolverQueueItem_Ptr item )
 {
     bool found = false;
     for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin();
@@ -178,11 +220,8 @@ void Resolver::addQueueItem (const SolverQueueItem_Ptr item)
     }
 }
 
-void
-Resolver::addWeak (const PoolItem item)
-{
-    _addWeak.push_back (item);
-}
+void Resolver::addWeak( const PoolItem & item )
+{ _addWeak.push_back( item ); }
 
 //---------------------------------------------------------------------------
 
@@ -216,12 +255,11 @@ struct DoTransact : public resfilter::PoolItemFilterFunctor
 };
 
 
-bool
-Resolver::verifySystem ()
+bool Resolver::verifySystem()
 {
     UndoTransact resetting (ResStatus::APPL_HIGH);
 
-    _DEBUG ("Resolver::verifySystem() ");
+    DBG << "Resolver::verifySystem()" << endl;
 
     _verifying = true;
 
@@ -235,9 +273,7 @@ Resolver::verifySystem ()
 
 //----------------------------------------------------------------------------
 // undo
-
-void
-Resolver::undo(void)
+void Resolver::undo()
 {
     UndoTransact info(ResStatus::APPL_LOW);
     MIL << "*** undo ***" << endl;
@@ -254,10 +290,9 @@ Resolver::undo(void)
     return;
 }
 
-void
-Resolver::solverInit()
+void Resolver::solverInit()
 {
-    // Solving with the satsolver
+    // Solving with libsolv
     static bool poolDumped = false;
     MIL << "-------------- Calling SAT Solver -------------------" << endl;
     if ( getenv("ZYPP_FULLLOG") ) {
@@ -270,48 +305,25 @@ Resolver::solverInit()
        }
     }
 
-    _satResolver->setFixsystem(false);
-    _satResolver->setIgnorealreadyrecommended(false);
-    _satResolver->setAllowdowngrade(false);
-    _satResolver->setAllowarchchange(false);
-    _satResolver->setAllowvendorchange(false);
-    _satResolver->setAllowuninstall(false);
-    _satResolver->setUpdatesystem(false);
-    _satResolver->setAllowvirtualconflicts(false);
-    _satResolver->setNoupdateprovide(false);
-    _satResolver->setDosplitprovides(false);
-
+    _satResolver->setFixsystem                 ( isVerifyingMode() );
+    _satResolver->setIgnorealreadyrecommended  ( ignoreAlreadyRecommended() );
+    _satResolver->setOnlyRequires              ( onlyRequires() );
+    _satResolver->setAllowdowngrade            (false);
+    _satResolver->setAllowarchchange           (false);
+    _satResolver->setAllowvendorchange         ( allowVendorChange() );
+    _satResolver->setAllowuninstall            ( forceResolve() );
+    _satResolver->setUpdatesystem              (false);
+    _satResolver->setNoupdateprovide           (false);
+    _satResolver->setDosplitprovides           (true);
+    _satResolver->setSolveSrcPackages          ( solveSrcPackages() );
+    _satResolver->setCleandepsOnRemove         ( cleandepsOnRemove() );
+
+    _satResolver->setDistupgrade               (_upgradeMode);
     if (_upgradeMode) {
-       _satResolver->setAllowdowngrade(true);
-       _satResolver->setUpdatesystem(false); // not needed cause packages has already been evaluteted by distupgrade
-       _satResolver->setDosplitprovides(true);
-       if ( !getenv("ZYPP_NO_SAT_UPDATE") ) {
-           MIL << "-------------- Calling SAT Solver in distupgrade mode -------------------" << endl;
-           // SAT solver will do the dist update
-           _satResolver->setAllowarchchange(true);
-           _satResolver->setAllowvendorchange(true);
-           _satResolver->setUpdatesystem(true);
-           _satResolver->setDistupgrade(true);
-           _satResolver->setDistupgrade_removeunsupported(false);
-       }
+      // may overwrite some settings
+      _satResolver->setDistupgrade_removeunsupported   (false);
     }
 
-    if (_forceResolve)
-       _satResolver->setAllowuninstall(true);
-
-    if (indeterminate(_onlyRequires))
-       _satResolver->setOnlyRequires(ZConfig::instance().solver_onlyRequires());
-    else if (_onlyRequires)
-       _satResolver->setOnlyRequires(true);
-    else
-       _satResolver->setOnlyRequires(false);
-
-    if (_verifying)
-       _satResolver->setFixsystem(true);
-
-    if (_ignorealreadyrecommended)
-       _satResolver->setIgnorealreadyrecommended(true);
-
     // Resetting additional solver information
     _isInstalledBy.clear();
     _installs.clear();
@@ -319,15 +331,13 @@ Resolver::solverInit()
     _installedSatisfied.clear();
 }
 
-bool
-Resolver::resolvePool()
+bool Resolver::resolvePool()
 {
     solverInit();
-    return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak);
+    return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak, _upgradeRepos );
 }
 
-bool
-Resolver::resolveQueue(solver::detail::SolverQueueItemList & queue)
+bool Resolver::resolveQueue( solver::detail::SolverQueueItemList & queue )
 {
     solverInit();
 
@@ -366,13 +376,52 @@ Resolver::resolveQueue(solver::detail::SolverQueueItemList & queue)
     return _satResolver->resolveQueue(queue, _addWeak);
 }
 
+sat::Transaction Resolver::getTransaction()
+{
+  // FIXME: That's an ugly way of pushing autoInstalled into the transaction.
+  sat::Transaction ret( sat::Transaction::loadFromPool );
+  ret.autoInstalled( _satResolver->autoInstalled() );
+  return ret;
+}
+
 
 //----------------------------------------------------------------------------
 // Getting more information about the solve results
 
+ResolverProblemList Resolver::problems() const
+{
+  MIL << "Resolver::problems()" << endl;
+  return _satResolver->problems();
+}
 
-void
-Resolver::collectResolverInfo(void)
+void Resolver::applySolutions( const ProblemSolutionList & solutions )
+{
+  for ( ProblemSolution_Ptr solution : solutions )
+  {
+    if ( ! applySolution( *solution ) )
+      break;
+  }
+}
+
+bool Resolver::applySolution( const ProblemSolution & solution )
+{
+  bool ret = true;
+  DBG << "apply solution " << solution << endl;
+  for ( SolutionAction_Ptr action : solution.actions() )
+  {
+    if ( ! action->execute( *this ) )
+    {
+      WAR << "apply solution action failed: " << action << endl;
+      ret = false;
+      break;
+    }
+  }
+  return ret;
+}
+
+//----------------------------------------------------------------------------
+
+void Resolver::collectResolverInfo()
 {
     if ( _satResolver
         && _isInstalledBy.empty()
@@ -399,7 +448,7 @@ Resolver::collectResolverInfo(void)
                           && !found) {
                        alreadySetForInstallation = true;
                        ItemCapKind capKind = pos->second;
-                       if (capKind.item == *instIter)  found = true;
+                       if (capKind.item() == *instIter)  found = true;
                        pos++;
                    }
 
@@ -444,7 +493,7 @@ Resolver::collectResolverInfo(void)
                               && !found) {
                            alreadySetForInstallation = true;
                            ItemCapKind capKind = pos->second;
-                           if (capKind.item == *instIter)  found = true;
+                           if (capKind.item() == *instIter)  found = true;
                            pos++;
                        }
 
@@ -487,7 +536,7 @@ Resolver::collectResolverInfo(void)
                               && !found) {
                            alreadySetForInstallation = true;
                            ItemCapKind capKind = pos->second;
-                           if (capKind.item == provider)  found = true;
+                           if (capKind.item() == provider)  found = true;
                            pos++;
                        }
 
@@ -520,7 +569,8 @@ Resolver::collectResolverInfo(void)
 }
 
 
-const ItemCapKindList Resolver::isInstalledBy (const PoolItem item) {
+ItemCapKindList Resolver::isInstalledBy( const PoolItem & item )
+{
     ItemCapKindList ret;
     collectResolverInfo();
 
@@ -538,7 +588,8 @@ const ItemCapKindList Resolver::isInstalledBy (const PoolItem item) {
     return ret;
 }
 
-const ItemCapKindList Resolver::installs (const PoolItem item) {
+ItemCapKindList Resolver::installs( const PoolItem & item )
+{
     ItemCapKindList ret;
     collectResolverInfo();
 
@@ -556,7 +607,8 @@ const ItemCapKindList Resolver::installs (const PoolItem item) {
     return ret;
 }
 
-const ItemCapKindList Resolver::satifiedByInstalled (const PoolItem item) {
+ItemCapKindList Resolver::satifiedByInstalled( const PoolItem & item )
+{
     ItemCapKindList ret;
     collectResolverInfo();
 
@@ -574,7 +626,8 @@ const ItemCapKindList Resolver::satifiedByInstalled (const PoolItem item) {
     return ret;
 }
 
-const ItemCapKindList Resolver::installedSatisfied (const PoolItem item) {
+ItemCapKindList Resolver::installedSatisfied( const PoolItem & item )
+{
     ItemCapKindList ret;
     collectResolverInfo();