Imported Upstream version 14.45.0
[platform/upstream/libzypp.git] / zypp / solver / detail / Resolver.h
index d7dd033..565177a 100644 (file)
 #include "zypp/base/PtrTypes.h"
 
 #include "zypp/ResPool.h"
+#include "zypp/TriBool.h"
+#include "zypp/base/SerialNumber.h"
 
 #include "zypp/solver/detail/Types.h"
-#include "zypp/solver/detail/ResolverQueue.h"
-#include "zypp/solver/detail/ResolverContext.h"
+#include "zypp/solver/detail/SolverQueueItem.h"
 
 #include "zypp/ProblemTypes.h"
 #include "zypp/ResolverProblem.h"
 #include "zypp/ProblemSolution.h"
-#include "zypp/UpgradeStatistics.h"
-
-#include "zypp/CapSet.h"
+#include "zypp/Capabilities.h"
+#include "zypp/Capability.h"
 
 
 /////////////////////////////////////////////////////////////////////////
 namespace zypp
 { ///////////////////////////////////////////////////////////////////////
+
+  namespace sat
+  {
+    class Transaction;
+  }
+
   ///////////////////////////////////////////////////////////////////////
   namespace solver
   { /////////////////////////////////////////////////////////////////////
@@ -54,165 +60,199 @@ namespace zypp
     namespace detail
     { ///////////////////////////////////////////////////////////////////
 
+    class SATResolver;
+
+    ///////////////////////////////////////////////////////////////////
+    //
+    // CLASS NAME : ItemCapKind
+    //
+    /** */
+    struct ItemCapKind
+    {
+       public:
+       Capability cap; //Capability which has triggerd this selection
+       Dep capKind; //Kind of that capability
+       PoolItem item; //Item which has triggered this selection
+       bool initialInstallation; //This item has triggered the installation
+                                 //Not already fullfilled requierement only.
+
+    ItemCapKind() : capKind(Dep::PROVIDES) {}
+           ItemCapKind( PoolItem i, Capability c, Dep k, bool initial)
+               : cap( c )
+               , capKind( k )
+               , item( i )
+               , initialInstallation( initial )
+           { }
+    };
+    typedef std::multimap<PoolItem,ItemCapKind> ItemCapKindMap;
+    typedef std::list<ItemCapKind> ItemCapKindList;
+
+
 ///////////////////////////////////////////////////////////////////
 //
 //     CLASS NAME : Resolver
-
+/** A mid layer class we should remove
+ * \todo Merge this and class SATResolver. Logic and date are horribly
+ * distributed between this and SATResolver. Either SATResolver becomes
+ * a pure wrapper adapting the libsolv C interface to fit our needs, and
+ * all the solver logic and problem handling goes here; or completely merge
+ * both classes.
+ */
 class Resolver : public base::ReferenceCounted, private base::NonCopyable {
 
   private:
     ResPool _pool;
+    SATResolver *_satResolver;
+    SerialNumberWatcher _poolchanged;
+
+    CapabilitySet _extra_requires;
+    CapabilitySet _extra_conflicts;
+    std::set<Repository> _upgradeRepos;
+
+    // Regard dependencies of the item weak onl
+    PoolItemList _addWeak;
+
+    /** \name Solver flags */
+    //@{
+    bool _forceResolve;           // remove items which are conflicts with others or
+                                  // have unfulfilled requirements.
+                                  // This behaviour is favourited by ZMD
+    bool _upgradeMode;            // Resolver has been called with doUpgrade
+    bool _updateMode;            // Resolver has been called with doUpdate
+    bool _verifying;              // The system will be checked
+    bool _onlyRequires;          // do install required resolvables only
+                                  // no recommended resolvables, language
+                                  // packages, hardware packages (modalias)
+    bool _allowVendorChange;   // whether the solver should allow or disallow vendor changes.
+    bool _solveSrcPackages;    // whether to generate solver jobs for selected source packges.
+    bool _cleandepsOnRemove;   // whether removing a package should also remove no longer needed requirements
+
+    bool _ignoreAlreadyRecommended;   //ignore recommended packages that have already been recommended by the installed packages
+    //@}
+
+    // Additional QueueItems which has to be regarded by the solver
+    // This will be used e.g. by solution actions
+    solver::detail::SolverQueueItemList _removed_queue_items;
+    solver::detail::SolverQueueItemList _added_queue_items;
+
+    // Additional information about the solverrun
+    ItemCapKindMap _isInstalledBy;
+    ItemCapKindMap _installs;
+    ItemCapKindMap _satifiedByInstalled;
+    ItemCapKindMap _installedSatisfied;
 
-    int _timeout_seconds;
-    bool _verifying;
-    bool _testing;
-
-    // list populated by calls to addPoolItemTo*()
-    QueueItemList _initial_items;
-    PoolItemList _items_to_install;
-    PoolItemList _items_to_establish;
-    PoolItemList _items_to_remove;
-    PoolItemList _items_to_verify;
-
-    // list of problematic items after doUpgrade()
-    PoolItemList _update_items;
-
-
-    CapSet _extra_caps;
-    CapSet _extra_conflicts;
-
-    //typedef std::multimap<PoolItem_Ref,Capability> IgnoreMap;
-
-    // These conflict should be ignored of the concering item
-    IgnoreMap _ignoreConflicts;
-    // These requires should be ignored of the concering item    
-    IgnoreMap _ignoreRequires;
-    // These obsoletes should be ignored of the concering item    
-    IgnoreMap _ignoreObsoletes;    
-    // Ignore architecture of the item
-    PoolItemList _ignoreArchitecture;
-    // Ignore the status "installed" of the item
-    PoolItemList _ignoreInstalledItem;
-    // Ignore the architecture of the item
-    PoolItemList _ignoreArchitectureItem;    
-    
-
-    ResolverQueueList _pending_queues;
-    ResolverQueueList _pruned_queues;
-    ResolverQueueList _complete_queues;
-    ResolverQueueList _deferred_queues;
-    ResolverQueueList _invalid_queues;
-
-    int _valid_solution_count;
-
-    ResolverContext_Ptr _best_context;
-    bool _timed_out;
-
-    std::set<Source_Ref> _subscribed;
-
-    Arch _architecture;
+    // helpers
+    void collectResolverInfo();
 
-    bool _forceResolve; // remove items which are conflicts with others or
-                        // have unfulfilled requirements.
-                        // This behaviour is favourited by ZMD
-    bool _upgradeMode;  // Resolver has been called with doUpgrade    
+    // Unmaintained packages which does not fit to the updated system
+    // (broken dependencies) will be deleted.
+    // returns true if solving was successful
+    bool checkUnmaintainedItems ();
 
-    // helpers
-    bool doesObsoleteCapability (PoolItem_Ref candidate, const Capability & cap);
-    bool doesObsoleteItem (PoolItem_Ref candidate, PoolItem_Ref installed);
+    void solverInit();
 
   public:
 
-    Resolver (const ResPool & pool);
+    Resolver( const ResPool & pool );
     virtual ~Resolver();
 
     // ---------------------------------- I/O
 
     virtual std::ostream & dumpOn( std::ostream & str ) const;
-    friend std::ostream& operator<<(std::ostream& str, const Resolver & obj)
+    friend std::ostream& operator<<( std::ostream& str, const Resolver & obj )
     { return obj.dumpOn (str); }
 
-    // ---------------------------------- accessors
+    // ---------------------------------- methods
+
+    ResPool pool() const;
+    void setPool( const ResPool & pool ) { _pool = pool; }
 
-    QueueItemList initialItems () const { return _initial_items; }
+    void addUpgradeRepo( Repository repo_r )           { if ( repo_r && ! repo_r.isSystemRepo() ) _upgradeRepos.insert( repo_r ); }
+    bool upgradingRepo( Repository repo_r ) const      { return( _upgradeRepos.find( repo_r ) != _upgradeRepos.end() ); }
+    void removeUpgradeRepo( Repository repo_r )                { _upgradeRepos.erase( repo_r ); }
+    void removeUpgradeRepos()                          { _upgradeRepos.clear(); }
+    const std::set<Repository> & upgradeRepos() const  { return _upgradeRepos; }
 
-    ResolverQueueList pendingQueues () const { return _pending_queues; }
-    ResolverQueueList prunedQueues () const { return _pruned_queues; }
-    ResolverQueueList completeQueues () const { return _complete_queues; }
-    ResolverQueueList deferredQueues () const { return _deferred_queues; }
-    ResolverQueueList invalidQueues () const { return _invalid_queues; }
+    void addExtraRequire( const Capability & capability );
+    void removeExtraRequire( const Capability & capability );
+    void addExtraConflict( const Capability & capability );
+    void removeExtraConflict( const Capability & capability );
 
-    ResolverContext_Ptr bestContext (void) const { return _best_context; }
+    void removeQueueItem( SolverQueueItem_Ptr item );
+    void addQueueItem( SolverQueueItem_Ptr item );
 
-    /** depending on the last solver result, either return bestContext()
-        of the first invalid context */
-    ResolverContext_Ptr context (void) const;
+    CapabilitySet extraRequires() const                { return _extra_requires; }
+    CapabilitySet extraConflicts() const       { return _extra_conflicts; }
 
-    // ---------------------------------- methods
+    void addWeak( const PoolItem & item );
+
+    bool verifySystem();
+    bool resolvePool();
+    bool resolveQueue( SolverQueueItemList & queue );
+    void doUpdate();
 
-    void setTimeout (int seconds) { _timeout_seconds = seconds; }
+    bool doUpgrade();
+    PoolItemList problematicUpdateItems() const;
 
-    ResPool pool (void) const;
-    void setPool (const ResPool & pool) { _pool = pool; }
+    /** \name Solver flags */
+    //@{
+    bool ignoreAlreadyRecommended() const      { return _ignoreAlreadyRecommended; }
+    void setIgnoreAlreadyRecommended( bool yesno_r ) { _ignoreAlreadyRecommended = yesno_r; }
 
-    void addSubscribedSource (Source_Ref source);
+    bool onlyRequires () const                 { return _onlyRequires; }
+    void setOnlyRequires( TriBool state_r );
 
-    void addPoolItemToInstall (PoolItem_Ref item);
-    void addPoolItemsToInstallFromList (PoolItemList & rl);
+    bool forceResolve()        const                   { return _forceResolve; }
+    void setForceResolve( TriBool state_r )    { _forceResolve = indeterminate(state_r) ? false : bool(state_r); }
 
-    void addPoolItemToRemove (PoolItem_Ref item);
-    void addPoolItemsToRemoveFromList (PoolItemList & rl);
+    bool isUpgradeMode() const                         { return _upgradeMode; }// Resolver has been called with doUpgrade
+    void setUpgradeMode( bool yesno_r )                { _upgradeMode = yesno_r; }
 
-    void addPoolItemToEstablish (PoolItem_Ref item);
-    void addPoolItemsToEstablishFromList (PoolItemList & rl);
+    bool isUpdateMode() const                  { return _updateMode; } // Resolver has been called with doUpdate
 
-    void addPoolItemToVerify (PoolItem_Ref item);
+    bool isVerifyingMode() const               { return _verifying; }  // The system will be checked
+    void setVerifyingMode( TriBool state_r )   { _verifying = indeterminate(state_r) ? false : bool(state_r); }
 
-    void addExtraCapability (const Capability & capability);
-    void addExtraConflict (const Capability & capability);
+    bool allowVendorChange() const             { return _allowVendorChange; }
+    void setAllowVendorChange( TriBool state_r );
 
-    void addIgnoreConflict (const PoolItem_Ref item,
-                           const Capability & capability);
-    void addIgnoreRequires (const PoolItem_Ref item,
-                           const Capability & capability);
-    void addIgnoreObsoletes (const PoolItem_Ref item,
-                            const Capability & capability);
-    void addIgnoreInstalledItem (const PoolItem_Ref item);
-    void addIgnoreArchitectureItem (const PoolItem_Ref item);    
+    bool solveSrcPackages() const              { return _solveSrcPackages; }
+    void setSolveSrcPackages( TriBool state_r )        { _solveSrcPackages = indeterminate(state_r) ? false : bool(state_r); }
 
-    void setForceResolve (const bool force) { _forceResolve = force; }
-    const bool forceResolve() { return _forceResolve; }
+    bool cleandepsOnRemove() const             { return _cleandepsOnRemove; }
+    void setCleandepsOnRemove( TriBool state_r );
+    //@}
 
-    bool verifySystem (void);
-    void establishState (ResolverContext_Ptr context = NULL);
-    bool establishPool (void);
-    void freshenState( ResolverContext_Ptr context = NULL );
-    bool freshenPool( void );
-    bool resolveDependencies (const ResolverContext_Ptr context = NULL);
-    bool resolvePool (void);
+#define ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER )  \
+    void ZSETTER( TriBool state_r );           \
+    bool ZGETTER() const;                      \
 
-    bool transactResObject( ResObject::constPtr robj, bool install = true);
-    bool transactResKind( Resolvable::Kind kind );
-    void transactReset( ResStatus::TransactByValue causer );
+    ZOLV_FLAG_TRIBOOL( dupSetAllowDowngrade,   dupAllowDowngrade )
+    ZOLV_FLAG_TRIBOOL( dupSetAllowNameChange,  dupAllowNameChange )
+    ZOLV_FLAG_TRIBOOL( dupSetAllowArchChange,  dupAllowArchChange )
+    ZOLV_FLAG_TRIBOOL( dupSetAllowVendorChange,        dupAllowVendorChange )
 
-    void doUpgrade( zypp::UpgradeStatistics & opt_stats_r );
-    PoolItemList problematicUpdateItems( void ) const { return _update_items; }
+#undef ZOLV_FLAG_TRIBOOL
 
+    ResolverProblemList problems() const;
+    void applySolutions( const ProblemSolutionList & solutions );
 
-    ResolverProblemList problems (void) const;
-    void applySolutions (const ProblemSolutionList &solutions);
+    // Return the Transaction computed by the last solver run.
+    sat::Transaction getTransaction();
 
     // reset all SOLVER transaction in pool
-    void undo(void);
+    void undo();
 
-    // only for testsuite
-    void reset (void);
+    void reset( bool keepExtras = false );
 
-    Arch architecture() const { return _architecture; }
-    void setArchitecture( const Arch & arch) { _architecture = arch; }
+    // Get more information about the solverrun
+    // Which item will be installed by another item or triggers an item for
+    // installation
+    ItemCapKindList isInstalledBy( const PoolItem & item );
+    ItemCapKindList installs( const PoolItem & item );
+    ItemCapKindList satifiedByInstalled (const PoolItem & item );
+    ItemCapKindList installedSatisfied( const PoolItem & item );
 
-    bool testing(void) const { return _testing; }
-    void setTesting( bool testing ) { _testing = testing; }
 };
 
 ///////////////////////////////////////////////////////////////////