Imported Upstream version 17.0.0
[platform/upstream/libzypp.git] / zypp / solver / detail / Resolver.h
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */
2 /* Resolver.h
3  *
4  * Copyright (C) 2000-2002 Ximian, Inc.
5  * Copyright (C) 2005 SUSE Linux Products GmbH
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License,
9  * version 2, as published by the Free Software Foundation.
10  *
11  * This program is distributed in the hope that it will be useful, but
12  * WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19  * 02111-1307, USA.
20  */
21
22 #ifndef ZYPP_SOLVER_DETAIL_RESOLVER_H
23 #define ZYPP_SOLVER_DETAIL_RESOLVER_H
24 #ifndef ZYPP_USE_RESOLVER_INTERNALS
25 #error Do not directly include this file!
26 #else
27
28 #include <iosfwd>
29 #include <string>
30 #include <list>
31 #include <map>
32
33 #include "zypp/ResPool.h"
34 #include "zypp/TriBool.h"
35 #include "zypp/base/SerialNumber.h"
36 #include "zypp/base/NonCopyable.h"
37
38 #include "zypp/ProblemTypes.h"
39 #include "zypp/ResolverProblem.h"
40 #include "zypp/ProblemSolution.h"
41 #include "zypp/Capabilities.h"
42 #include "zypp/Capability.h"
43
44 /////////////////////////////////////////////////////////////////////////
45 namespace zypp
46 {
47   namespace sat
48   {
49     class Transaction;
50   }
51   ///////////////////////////////////////////////////////////////////////
52   namespace solver
53   {
54     /////////////////////////////////////////////////////////////////////
55     namespace detail
56     {
57       class SATResolver;
58       typedef std::list<PoolItem> PoolItemList;
59       typedef std::set<PoolItem> PoolItemSet;
60
61 ///////////////////////////////////////////////////////////////////
62 //
63 //      CLASS NAME : Resolver
64 /** A mid layer class we should remove
65  * \todo Merge this and class SATResolver. Logic and date are horribly
66  * distributed between this and SATResolver. Either SATResolver becomes
67  * a pure wrapper adapting the libsolv C interface to fit our needs, and
68  * all the solver logic and problem handling goes here; or completely merge
69  * both classes.
70  */
71 class Resolver : private base::NonCopyable
72 {
73   typedef std::multimap<PoolItem,ItemCapKind> ItemCapKindMap;
74   private:
75     ResPool _pool;
76     SATResolver *_satResolver;
77     SerialNumberWatcher _poolchanged;
78
79     CapabilitySet _extra_requires;
80     CapabilitySet _extra_conflicts;
81     std::set<Repository> _upgradeRepos;
82
83     // Regard dependencies of the item weak onl
84     PoolItemList _addWeak;
85
86     /** \name Solver flags */
87     //@{
88     bool _upgradeMode;            // Resolver has been called with doUpgrade
89     bool _updateMode;            // Resolver has been called with doUpdate
90     bool _verifying;              // The system will be checked
91     bool _onlyRequires;           // do install required resolvables only
92                                   // no recommended resolvables, language
93                                   // packages, hardware packages (modalias)
94     bool _solveSrcPackages;     // whether to generate solver jobs for selected source packges.
95     bool _cleandepsOnRemove;    // whether removing a package should also remove no longer needed requirements
96
97     bool _ignoreAlreadyRecommended;   //ignore recommended packages that have already been recommended by the installed packages
98     //@}
99
100     // Additional QueueItems which has to be regarded by the solver
101     // This will be used e.g. by solution actions
102     solver::detail::SolverQueueItemList _removed_queue_items;
103     solver::detail::SolverQueueItemList _added_queue_items;
104
105     // Additional information about the solverrun
106     ItemCapKindMap _isInstalledBy;
107     ItemCapKindMap _installs;
108     ItemCapKindMap _satifiedByInstalled;
109     ItemCapKindMap _installedSatisfied;
110
111     // helpers
112     void collectResolverInfo();
113
114     // Unmaintained packages which does not fit to the updated system
115     // (broken dependencies) will be deleted.
116     // returns true if solving was successful
117     bool checkUnmaintainedItems ();
118
119     void solverInit();
120
121   public:
122
123     Resolver( const ResPool & pool );
124     virtual ~Resolver();
125
126     // ---------------------------------- I/O
127
128     std::ostream & dumpOn( std::ostream & str ) const;
129
130     friend std::ostream& operator<<( std::ostream& str, const Resolver & obj )
131     { return obj.dumpOn (str); }
132
133     // ---------------------------------- methods
134
135     ResPool pool() const;
136     void setPool( const ResPool & pool ) { _pool = pool; }
137
138     void addUpgradeRepo( Repository repo_r )            { if ( repo_r && ! repo_r.isSystemRepo() ) _upgradeRepos.insert( repo_r ); }
139     bool upgradingRepo( Repository repo_r ) const       { return( _upgradeRepos.find( repo_r ) != _upgradeRepos.end() ); }
140     void removeUpgradeRepo( Repository repo_r )         { _upgradeRepos.erase( repo_r ); }
141     void removeUpgradeRepos()                           { _upgradeRepos.clear(); }
142     const std::set<Repository> & upgradeRepos() const   { return _upgradeRepos; }
143
144     void addExtraRequire( const Capability & capability );
145     void removeExtraRequire( const Capability & capability );
146     void addExtraConflict( const Capability & capability );
147     void removeExtraConflict( const Capability & capability );
148
149     void removeQueueItem( SolverQueueItem_Ptr item );
150     void addQueueItem( SolverQueueItem_Ptr item );
151
152     CapabilitySet extraRequires() const         { return _extra_requires; }
153     CapabilitySet extraConflicts() const        { return _extra_conflicts; }
154
155     void addWeak( const PoolItem & item );
156
157     bool verifySystem();
158     bool resolvePool();
159     bool resolveQueue( SolverQueueItemList & queue );
160     void doUpdate();
161
162     bool doUpgrade();
163     PoolItemList problematicUpdateItems() const;
164
165     /** \name Solver flags */
166     //@{
167     bool ignoreAlreadyRecommended() const       { return _ignoreAlreadyRecommended; }
168     void setIgnoreAlreadyRecommended( bool yesno_r ) { _ignoreAlreadyRecommended = yesno_r; }
169
170     bool onlyRequires () const                  { return _onlyRequires; }
171     void setOnlyRequires( TriBool state_r );
172
173     bool isUpgradeMode() const                  { return _upgradeMode; }// Resolver has been called with doUpgrade
174     void setUpgradeMode( bool yesno_r )         { _upgradeMode = yesno_r; }
175
176     bool isUpdateMode() const                   { return _updateMode; } // Resolver has been called with doUpdate
177     void setUpdateMode( bool yesno_r )          { _updateMode = yesno_r; }
178
179     bool isVerifyingMode() const                { return _verifying; }  // The system will be checked
180     void setVerifyingMode( TriBool state_r )    { _verifying = indeterminate(state_r) ? false : bool(state_r); }
181
182     bool solveSrcPackages() const               { return _solveSrcPackages; }
183     void setSolveSrcPackages( TriBool state_r ) { _solveSrcPackages = indeterminate(state_r) ? false : bool(state_r); }
184
185     bool cleandepsOnRemove() const              { return _cleandepsOnRemove; }
186     void setCleandepsOnRemove( TriBool state_r );
187     //@}
188
189 #define ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER )   \
190     void ZSETTER( TriBool state_r );            \
191     bool ZGETTER() const;                       \
192
193     ZOLV_FLAG_TRIBOOL( setForceResolve,         forceResolve )
194
195     ZOLV_FLAG_TRIBOOL( setAllowDowngrade,       allowDowngrade )
196     ZOLV_FLAG_TRIBOOL( setAllowNameChange,      allowNameChange )
197     ZOLV_FLAG_TRIBOOL( setAllowArchChange,      allowArchChange )
198     ZOLV_FLAG_TRIBOOL( setAllowVendorChange,    allowVendorChange )
199
200     ZOLV_FLAG_TRIBOOL( dupSetAllowDowngrade,    dupAllowDowngrade )
201     ZOLV_FLAG_TRIBOOL( dupSetAllowNameChange,   dupAllowNameChange )
202     ZOLV_FLAG_TRIBOOL( dupSetAllowArchChange,   dupAllowArchChange )
203     ZOLV_FLAG_TRIBOOL( dupSetAllowVendorChange, dupAllowVendorChange )
204
205 #undef ZOLV_FLAG_TRIBOOL
206
207     ResolverProblemList problems() const;
208
209     void applySolutions( const ProblemSolutionList & solutions );
210     bool applySolution( const ProblemSolution & solution );
211
212     // Return the Transaction computed by the last solver run.
213     sat::Transaction getTransaction();
214
215     // reset all SOLVER transaction in pool
216     void undo();
217
218     void reset( bool keepExtras = false );
219
220     // Get more information about the solverrun
221     // Which item will be installed by another item or triggers an item for
222     // installation
223     ItemCapKindList isInstalledBy( const PoolItem & item );
224     ItemCapKindList installs( const PoolItem & item );
225     ItemCapKindList satifiedByInstalled (const PoolItem & item );
226     ItemCapKindList installedSatisfied( const PoolItem & item );
227
228 };
229
230 ///////////////////////////////////////////////////////////////////
231     };// namespace detail
232     /////////////////////////////////////////////////////////////////////
233     /////////////////////////////////////////////////////////////////////
234   };// namespace solver
235   ///////////////////////////////////////////////////////////////////////
236   ///////////////////////////////////////////////////////////////////////
237 };// namespace zypp
238 /////////////////////////////////////////////////////////////////////////
239 #endif // ZYPP_USE_RESOLVER_INTERNALS
240 #endif // ZYPP_SOLVER_DETAIL_RESOLVER_H