1 /*---------------------------------------------------------------------\
3 | |__ / \ / / . \ . \ |
8 \---------------------------------------------------------------------*/
9 /** \file zypp/Resolver.h
12 #ifndef ZYPP_RESOLVER_H
13 #define ZYPP_RESOLVER_H
18 #include "zypp/base/ReferenceCounted.h"
19 #include "zypp/base/PtrTypes.h"
21 #include "zypp/ResPool.h"
22 #include "zypp/UpgradeStatistics.h"
23 #include "zypp/solver/detail/Resolver.h"
24 #include "zypp/solver/detail/ResolverContext.h"
25 #include "zypp/ProblemTypes.h"
27 ///////////////////////////////////////////////////////////////////
29 { /////////////////////////////////////////////////////////////////
33 ///////////////////////////////////////////////////////////////////
35 // CLASS NAME : Resolver
37 /** Resolver interface.
39 class Resolver : public base::ReferenceCounted, private base::NonCopyable
44 Resolver( const ResPool & pool );
49 * Resolve package dependencies:
51 * Verify consistency of system
57 * Resolve package dependencies:
59 * Verify consistency of system
60 * considerNewHardware = install packages which depends on
64 bool verifySystem (bool considerNewHardware);
67 * Establish state of 'higher level' Resolvables in Pool
69 * Must be called when dealing with non-package resolvables,
70 * like Patches, Patterns, and Products
72 * Must be called with a 'plain' pool, e.g. no additonal
75 * return true if it was successful
76 * return false if not (this will only happen if other
77 * transactions are in the pool which will lead to
80 bool establishPool (void);
83 * go through all package 'freshen' dependencies and
84 * schedule matches for installation.
86 * To be called at begin of installation and upgrade.
87 * Probably also useful after adding a new package
90 * return true if it was successful
91 * return false if not (this will only happen if other
92 * transactions are in the pool which will lead to
95 bool freshenPool (void);
98 * Resolve package dependencies:
100 * Try to execute all pending transactions (there may be more than
102 * The solver pays attention to the BEST packages only in order to
103 * come to a solution.
104 * If there has not been found a valid results all other branches
105 * (e.G. packages with older version numbers, worse architecture)
108 * Returns "true" on success (i.e., if there were no problems that
109 * need user interaction) and "false" if there were problems. In
110 * the latter case, use problems() and later applySolutions()
113 bool resolvePool (void);
116 * Resolve package dependencies:
118 * Try to execute all pending transactions (there may be more than
120 * If tryAllPossibilities is false, restrict searches for matching
121 * requirements to best architecture, highest version.
122 * If tryAllPossibilities is true, evaluate all possible matches
125 * Returns "true" on success (i.e., if there were no problems that
126 * need user interaction) and "false" if there were problems. In
127 * the latter case, use problems() and later applySolutions()
130 bool resolvePool (bool tryAllPossibilities);
132 bool resolveDependencies( void );
135 * Undo solver changes done in resolvePool()
136 * Throwing away all ignored dependencies.
141 * Get the most recent resolver context
143 * It will be NULL if resolvePool() or establishPool() was never called.
144 * Depending on the return code of the last resolvePool() call,
145 * it _either_ points to a valid or an invalid solution.
147 solver::detail::ResolverContext_Ptr context (void) const;
150 * Do an distribution upgrade
152 * This will run a full upgrade on the pool, taking all upgrade
153 * dependencies (provide/obsolete for package renames, split-
154 * provides, etc.) into account and actually removing installed
155 * packages if no upgrade exists.
157 * To be run with great caution. It basically brings your
158 * system 'back to start'.
159 * Quite helpful to get back to a 'sane state'. Quite disastrous
160 * since you'll loose all non-distribution packages
162 void doUpgrade( UpgradeStatistics & opt_stats_r );
165 * Return the list of problematic update items
166 * i.e. locked ones (due to foreign vendor)
168 std::list<PoolItem_Ref> problematicUpdateItems( void ) const;
171 * Return the dependency problems found by the last call to
172 * resolveDependencies(). If there were no problems, the returned
173 * list will be empty.
175 ResolverProblemList problems();
178 * Return more solver information if an error has happened.
181 std::list<std::string> problemDescription( void ) const;
184 * Apply problem solutions. No more than one solution per problem
187 void applySolutions( const ProblemSolutionList & solutions );
189 Arch architecture() const;
190 void setArchitecture( const Arch & arch);
193 * Remove resolvables which are conflicts with others or
194 * have unfulfilled requirements.
195 * This behaviour is favourited by ZMD.
197 void setForceResolve (const bool force);
201 * Prefer the result with the newest version if there are more solver
204 void setPreferHighestVersion (const bool highestVersion);
205 bool preferHighestVersion();
208 * transact a single ResObject
210 * Installs (install == true) or removes (install == false) all required
211 * and recommended packages(!) of \c robj
212 * (More or less a 'single step' resolver call)
214 * returns false if requirements are not all fulfillable
216 * Is obsolete; use resolvePool() instead
218 bool transactResObject( ResObject::constPtr robj, bool install = true);
221 * transact all objects of this kind
223 * Look through the pool and runs transactResObject, first for removes
225 * (More or less a 'single step' resolver call)
227 * returns false if any transactResObject() call returned false.
229 * Is obsolete; use resolvePool() instead
231 bool transactResKind( Resolvable::Kind kind );
234 * reset any transact states
236 * Look through the pool and clear transact state.
237 * It will only reset states which have an equal or
240 * Is obsolete; use resolvePool() instead
242 void transactReset( ResStatus::TransactByValue causer );
245 * Adding additional requirement
248 void addRequire (const Capability & capability);
251 * Adding additional conflict
254 void addConflict (const Capability & capability);
257 * Remove the additional requirement set by \ref addRequire(Capability).
260 void removeRequire (const Capability & capability);
263 * Remove the additional conflict set by \ref addConflict(Capability).
266 void removeConflict (const Capability & capability);
269 * Get all the additional requirements set by \ref addRequire(Capability).
272 const CapSet getRequire ();
275 * Get all the additional conflicts set by \ref addConflict(Capability).
278 const CapSet getConflict();
281 * Setting solver timeout
283 * Stop solving after a given timeframe (seconds)
284 * seconds = 0 : No timeout
287 void setTimeout( int seconds );
290 * Getting solver timeout in seconds
296 * Restricting solver passes
298 * Stop solving after a given amount of passes
299 * count = 0 : No restriction
302 void setMaxSolverPasses (int count);
305 * Count of max solver passes
308 int maxSolverPasses ();
311 * Generates a solver Testcase of the current state
313 * \parame dumpPath destination directory of the created directory
314 * \return true if it was successful
316 bool createSolverTestcase (const std::string & dumpPath = "/var/log/YaST2/solverTestcase");
320 * Gives information about WHO has pused an installation of an given item.
322 * \param item Evaluate additional information for this resolvable.
323 * \return A list of structures which contains:
324 * item Item which has triggered the installation of the given param item.
325 * cap Capability which has triggerd this installation
326 * capKind Kind of that capability (e.g. Dep::REQUIRES,Dep::RECOMMENDS,... )
328 * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid.
331 const solver::detail::ItemCapKindList isInstalledBy (const PoolItem_Ref item);
334 * Gives information about WHICH additional items will be installed due the installation of an item.
336 * \param item Evaluate additional information for this resolvable.
337 * \return A list of structures which contains:
338 * item Item which will be installed due to the installation of the given param item too.
339 * cap Capability which causes the installation
340 * capKind Kind of that capability (e.g. Dep::REQUIRES,Dep::RECOMMENDS,... )
342 * Note: In order to have a result start a solver run before. Not matter if it is valid or invalid.
345 const solver::detail::ItemCapKindList installs (const PoolItem_Ref item);
351 solver::detail::Resolver_Ptr _pimpl;
353 ///////////////////////////////////////////////////////////////////
355 /////////////////////////////////////////////////////////////////
357 ///////////////////////////////////////////////////////////////////
358 #endif // ZYPP_RESOLVER_H