Enhance UpgradeRepo interface.
[platform/upstream/libzypp.git] / zypp / Resolver.h
1 /*---------------------------------------------------------------------\
2 |                          ____ _   __ __ ___                          |
3 |                         |__  / \ / / . \ . \                         |
4 |                           / / \ V /|  _/  _/                         |
5 |                          / /__ | | | | | |                           |
6 |                         /_____||_| |_| |_|                           |
7 |                                                                      |
8 \---------------------------------------------------------------------*/
9 /** \file       zypp/Resolver.h
10  *
11 */
12 #ifndef ZYPP_RESOLVER_H
13 #define ZYPP_RESOLVER_H
14
15 #include <iosfwd>
16 #include <functional>
17
18 #include "zypp/base/ReferenceCounted.h"
19 #include "zypp/base/PtrTypes.h"
20
21 #include "zypp/ResPool.h"
22 #include "zypp/solver/detail/Resolver.h"
23 #include "zypp/solver/detail/SolverQueueItem.h"
24 #include "zypp/ProblemTypes.h"
25
26 ///////////////////////////////////////////////////////////////////
27 namespace zypp
28 { /////////////////////////////////////////////////////////////////
29
30
31   ///////////////////////////////////////////////////////////////////
32   //
33   //    CLASS NAME : Resolver
34   //
35   /**
36    * Dependency resolver interface.
37    *
38    * To resolve dependencies after making changes to the \ref ResPool (using
39    * \ref addRequire(), \ref addConflict(), \ref applySolutions(), or by making
40    * the changes directly on the \ref PoolItem status objects,
41    * call the \ref resolvePool() method.
42    */
43   class Resolver : public base::ReferenceCounted, private base::NonCopyable
44   {
45   public:
46
47     /** Ctor */
48     Resolver( const ResPool & pool );
49     /** Dtor */
50     virtual ~Resolver();
51
52     /**
53      * Resolve package dependencies:
54      *
55      * Enter \ref systemVerification mode to monitor and repair dependencies
56      * of already installed packages, and solve immediately.
57      *
58      * Call \ref setSystemVerification to turn of this mode.
59      **/
60     bool verifySystem();
61
62
63     /**
64      * Resolve package dependencies:
65      *
66      * Try to execute all pending transactions (there may be more than
67      * one!).
68      * The solver collects all transactions (install/delete resolvables)
69      * from the pool, generates task, solving it and writes the
70      * results back to pool
71      *
72      * Returns "true" on success (i.e., if there were no problems that
73      * need user interaction) and "false" if there were problems.  In
74      * the latter case, use problems() and later applySolutions()
75      * below.
76      **/
77     bool resolvePool();
78
79
80     /**
81      * Resolve package dependencies:
82      *
83      * The solver works off the given queue and writes back the solution
84      * to pool.
85      *
86      * Returns "true" on success (i.e., if there were no problems that
87      * need user interaction) and "false" if there were problems.  In
88      * the latter case, use problems() and later applySolutions()
89      * below.
90      * The solution could be that the solver remove/add some entries
91      * in the task queue. So make a new call of resolveQueue after you
92      * have applied any solution AND check the parameter "queue" if
93      * there has been any changes by the solver and adapt these changes
94      * to e.g. the selectables.
95      *
96      **/
97     bool resolveQueue( solver::detail::SolverQueueItemList & queue );
98
99     /*
100      * Undo solver changes done in resolvePool()
101      * Throwing away all ignored dependencies.
102      */
103     void undo();
104
105     /*
106      * Resets solver information and verify option.
107      */
108     void reset();
109
110
111     /**
112      * Do an distribution upgrade
113      *
114      * Perform a distribution upgrade. This performs an update of
115      * all packages with a special resolver algorithm which takes
116      * care of package splits, pattern  and  product  updates,
117      * etc.
118      *
119      * \see \ref addUpgradeRepo
120      **/
121     bool doUpgrade();
122
123     /**
124      * Update to newest package
125      *
126      * Install the newest version of your installed packages as
127      * far as possible. This means a newer package will NOT be
128      * installed if it generates dependency problems.
129      * So the user will not get an error message.
130      *
131      **/
132     void doUpdate( );
133
134     /**
135      * Unmaintained packages which does not fit to
136      * the updated system (broken dependencies) will be
137      * deleted.
138      * Return the list of deleted items.
139      * Note : This list is valid after the call doUpgrade() only.
140      **/
141     std::list<PoolItem> problematicUpdateItems() const;
142
143     /**
144      * Return the dependency problems found by the last call to
145      * resolveDependencies(). If there were no problems, the returned
146      * list will be empty.
147      **/
148     ResolverProblemList problems();
149
150
151     /**
152      * Apply problem solutions. No more than one solution per problem
153      * can be applied.
154      **/
155     void applySolutions( const ProblemSolutionList & solutions );
156
157
158     /**
159      * Remove resolvables which are conflicts with others or
160      * have unfulfilled requirements.
161      * This behaviour is favourited by ZMD.
162      **/
163     void setForceResolve( bool force );
164     bool forceResolve();
165
166     /**
167      * Ignore recommended packages that were already recommended by
168      * the installed packages
169      **/
170     void setIgnoreAlreadyRecommended( bool yesno_r );
171     bool ignoreAlreadyRecommended();
172
173     /**
174      * Setting whether required packages are installed ONLY
175      * So recommended packages, language packages and packages which depend
176      * on hardware (modalias) will not be regarded.
177      **/
178     void setOnlyRequires( bool yesno_r );
179     void resetOnlyRequires(); // set back to default (described in zypp.conf)
180     bool onlyRequires();
181
182     /**
183      * Whether the \ref Resolver is in upgrade mode.
184      */
185     bool upgradeMode() const;
186
187     /**
188      * Setting whether the solver should allow or disallow vendor changes.
189      *
190      * If OFF (the default) the solver will replace packages with packages
191      * of the same (or equivalent) vendor ony.
192      *
193      * \see \ref VendorAttr for definition of vendor equivalence.
194      **/
195     void setAllowVendorChange( bool yesno_r );
196     void setDefaultAllowVendorChange(); // set back to default (in zypp.conf)
197     bool allowVendorChange() const;
198
199     /**
200      * System verification mode also monitors and repairs dependencies
201      * of already installed packages.
202      * \see \ref verifySystem
203      */
204     void setSystemVerification( bool yesno_r );
205     void setDefaultSystemVerification();
206     bool systemVerification() const;
207
208     /**
209      * Set whether to solve source packages build dependencies per default.
210      * Usually turned off and if, enabled per source package.
211      * \NOTE This affects only source packges selected in the \ref ResPool. No solver rule
212      * will be generated for them. Source packages requested via e.g. \ref addRequire will
213      * always be solved.
214      * \NOTE Be carefull. The older the source package is, the stranger may be the
215      * result of solving it's build dependencies.
216      */
217     void setSolveSrcPackages( bool yesno_r );
218     void setDefaultSolveSrcPackages();
219     bool solveSrcPackages() const;
220
221     /** \name Upgrade to content of a specific repository.
222      * \note This is an ordinary solver request. You should simply
223      * \ref resolvePool to execute, and not \ref doUpgrade.
224      */
225     //@{
226     /**
227      * Adding request to perform a dist upgrade restricted to this repository.
228      *
229      * This is what e.g. <tt>zypper dup --repo myrepo</tt> should perform.
230      * \see \ref doUpgrade
231      */
232     void addUpgradeRepo( Repository repo_r );
233
234     /**
235      * Whether there is an \c UpgradeRepo request pending for this repo.
236      */
237     bool upgradingRepo( Repository repo_r ) const;
238
239     /**
240      * Remove an upgrade request for this repo.
241      */
242     void removeUpgradeRepo( Repository repo_r );
243
244     /**
245      * Remove all upgrade repo requests.
246      */
247     void removeUpgradeRepos();
248     //@}
249
250     /**
251      * Adding additional requirement
252      *
253      */
254     void addRequire( const Capability & capability );
255
256     /**
257      * Adding additional conflict
258      *
259      */
260     void addConflict( const Capability & capability );
261
262     /**
263      * Remove the additional requirement set by \ref addRequire(Capability).
264      *
265      */
266     void removeRequire( const Capability & capability );
267
268     /**
269      * Remove the additional conflict set by \ref addConflict(Capability).
270      *
271      */
272     void removeConflict( const Capability & capability );
273
274     /**
275      * Get all the additional requirements set by \ref addRequire(Capability).
276      *
277      */
278     CapabilitySet getRequire();
279
280     /**
281      * Get all the additional conflicts set by \ref addConflict(Capability).
282      *
283      */
284     CapabilitySet getConflict();
285
286     /**
287      * Generates a solver Testcase of the current state
288      *
289      * \parame dumpPath destination directory of the created directory
290      * \return true if it was successful
291      */
292     bool createSolverTestcase( const std::string & dumpPath = "/var/log/YaST2/solverTestcase", bool runSolver = true );
293
294     /**
295      * Gives information about WHO has pused an installation of an given item.
296      *
297      * \param item    Evaluate additional information for this resolvable.
298      * \return A list of structures which contains:
299      *          item                Item which has triggered the installation of the given param item.
300      *          initialInstallation This item has triggered the installation
301      *                              Not already fullfilled requierement only.
302      *          cap                 Capability which has triggerd this installation
303      *          capKind             Kind of that capability (e.g.  Dep::REQUIRES,Dep::RECOMMENDS,... )
304      *
305      * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid.
306      *
307      */
308     solver::detail::ItemCapKindList isInstalledBy( const PoolItem & item );
309
310     /**
311      * Gives information about WHICH additional items will be installed due the installation of an item.
312      *
313      * \param item     Evaluate additional information for this resolvable.
314      * \return A list of structures which contains:
315      *          item                Item which has triggered the installation of the given param item.
316      *          initialInstallation This item has triggered the installation
317      *                              Not already fullfilled requierement only.
318      *          cap                 Capability which has triggerd this installation
319      *          capKind             Kind of that capability (e.g.  Dep::REQUIRES,Dep::RECOMMENDS,... )
320      *
321      * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid.
322      *
323      */
324     solver::detail::ItemCapKindList installs( const PoolItem & item );
325
326     /**
327      * Gives information about WHICH installed items are requested by the installation of an item.
328      *
329      * \param item     Evaluate additional information for this resolvable.
330      * \return A list of structures which contains:
331      *          item                Item which has triggered the installation of the given param item.
332      *          initialInstallation This item has triggered the installation
333      *                              Not already fullfilled requierement only.
334      *          cap                 Capability which has triggerd this installation
335      *          capKind             Kind of that capability (e.g.  Dep::REQUIRES,Dep::RECOMMENDS,... )
336      *
337      * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid.
338      *
339      */
340     solver::detail::ItemCapKindList satifiedByInstalled( const PoolItem & item );
341
342
343     /**
344      * Gives information about WHICH items require an already installed item.
345      *
346      * \param item     Evaluate additional information for this resolvable.
347      * \return A list of structures which contains:
348      *          item                Item which has triggered the installation of the given param item.
349      *          initialInstallation This item has triggered the installation
350      *                              Not already fullfilled requierement only.
351      *          cap                 Capability which has triggerd this installation
352      *          capKind             Kind of that capability (e.g.  Dep::REQUIRES,Dep::RECOMMENDS,... )
353      *
354      * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid.
355      *
356      */
357     solver::detail::ItemCapKindList installedSatisfied( const PoolItem & item );
358
359
360
361   private:
362     solver::detail::Resolver_Ptr _pimpl;
363   };
364   ///////////////////////////////////////////////////////////////////
365
366   /////////////////////////////////////////////////////////////////
367 } // namespace zypp
368 ///////////////////////////////////////////////////////////////////
369 #endif // ZYPP_RESOLVER_H