21 #include <boost/static_assert.hpp> 23 #define ZYPP_USE_RESOLVER_INTERNALS 25 #include <zypp/base/LogTools.h> 28 #include <zypp/solver/detail/Resolver.h> 38 #define MAXSOLVERRUNS 5 43 #undef ZYPP_BASE_LOGGER_LOGGROUP 44 #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::solver" 62 os <<
"<resolver>" << endl;
63 #define OUTS(t) os << " " << #t << ":\t" << t << endl; 67 OUTS( _onlyRequires );
69 OUTS( _cleandepsOnRemove );
70 OUTS( _ignoreAlreadyRecommended );
72 return os <<
"<resolver/>";
81 , _poolchanged(_pool.serial() )
82 , _upgradeMode (false)
85 , _onlyRequires (
ZConfig::instance().solver_onlyRequires() )
86 , _solveSrcPackages ( false )
87 , _cleandepsOnRemove (
ZConfig::instance().solver_cleandepsOnRemove() )
88 , _ignoreAlreadyRecommended ( true )
91 _satResolver =
new SATResolver(_pool, satPool.get());
101 {
return _satResolver->get(); }
109 #define ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER, ZVARNAME, ZVARDEFAULT ) \ 110 void Resolver::ZSETTER( TriBool state_r ) \ 111 { _satResolver->ZVARNAME = indeterminate(state_r) ? ZVARDEFAULT : bool(state_r); } \ 112 bool Resolver::ZGETTER() const \ 113 { return _satResolver->ZVARNAME; } \ 120 ZOLV_FLAG_TRIBOOL( setAllowArchChange, allowArchChange, _allowarchchange, false )
128 #undef ZOLV_FLAG_TRIBOOL 151 _extra_requires.clear();
152 _extra_conflicts.clear();
155 _isInstalledBy.clear();
157 _satifiedByInstalled.clear();
158 _installedSatisfied.clear();
165 return resolvePool();
171 return _satResolver->doUpdate();
175 {
return _satResolver->problematicUpdateItems(); }
177 void Resolver::addExtraRequire(
const Capability & capability )
178 { _extra_requires.insert (capability); }
180 void Resolver::removeExtraRequire(
const Capability & capability )
181 { _extra_requires.erase (capability); }
183 void Resolver::addExtraConflict(
const Capability & capability )
184 { _extra_conflicts.insert (capability); }
186 void Resolver::removeExtraConflict(
const Capability & capability )
187 { _extra_conflicts.erase (capability); }
189 void Resolver::removeQueueItem( SolverQueueItem_Ptr item )
192 for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin();
193 iter != _added_queue_items.end(); iter++) {
195 _added_queue_items.remove(*iter);
201 _removed_queue_items.push_back (item);
202 _removed_queue_items.unique ();
206 void Resolver::addQueueItem( SolverQueueItem_Ptr item )
209 for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin();
210 iter != _removed_queue_items.end(); iter++) {
212 _removed_queue_items.remove(*iter);
218 _added_queue_items.push_back (item);
219 _added_queue_items.unique ();
223 void Resolver::addWeak(
const PoolItem & item )
224 { _addWeak.push_back( item ); }
262 DBG <<
"Resolver::verifySystem()" << endl;
268 functor::functorRef<bool,PoolItem>(resetting) );
270 return resolvePool();
279 MIL <<
"*** undo ***" << endl;
282 functor::functorRef<bool,PoolItem>(info) );
287 _removed_queue_items.clear();
288 _added_queue_items.clear();
293 void Resolver::solverInit()
296 static bool poolDumped =
false;
297 MIL <<
"-------------- Calling SAT Solver -------------------" << endl;
298 if ( getenv(
"ZYPP_FULLLOG") and
get() ) {
299 Testcase testcase(
"/var/log/YaST2/autoTestcase");
301 testcase.createTestcase (*
this,
true,
false);
304 testcase.createTestcase (*
this,
false,
false);
308 _satResolver->setFixsystem ( isVerifyingMode() );
309 _satResolver->setIgnorealreadyrecommended ( ignoreAlreadyRecommended() );
310 _satResolver->setOnlyRequires ( onlyRequires() );
311 _satResolver->setUpdatesystem (_updateMode);
312 _satResolver->setSolveSrcPackages ( solveSrcPackages() );
313 _satResolver->setCleandepsOnRemove ( cleandepsOnRemove() );
315 _satResolver->setDistupgrade (_upgradeMode);
318 _satResolver->setDistupgrade_removeunsupported (
false);
322 _isInstalledBy.clear();
324 _satifiedByInstalled.clear();
325 _installedSatisfied.clear();
331 return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak, _upgradeRepos );
339 for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin();
340 iter != _removed_queue_items.end(); iter++) {
341 for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) {
342 if ( (*iterQueue)->cmp(*iter) == 0) {
343 MIL <<
"remove from queue" << *iter;
344 queue.remove(*iterQueue);
350 for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin();
351 iter != _added_queue_items.end(); iter++) {
353 for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) {
354 if ( (*iterQueue)->cmp(*iter) == 0) {
360 MIL <<
"add to queue" << *iter;
361 queue.push_back(*iter);
367 _removed_queue_items.clear();
368 _added_queue_items.clear();
370 return _satResolver->resolveQueue(queue, _addWeak);
377 ret.autoInstalled( _satResolver->autoInstalled() );
387 MIL <<
"Resolver::problems()" << endl;
388 return _satResolver->problems();
393 for ( ProblemSolution_Ptr solution : solutions )
395 if ( ! applySolution( *solution ) )
400 bool Resolver::applySolution(
const ProblemSolution & solution )
403 DBG <<
"apply solution " << solution << endl;
404 for ( SolutionAction_Ptr action : solution.actions() )
406 if ( ! action->execute( *
this ) )
408 WAR <<
"apply solution action failed: " << action << endl;
418 void Resolver::collectResolverInfo()
421 && _isInstalledBy.empty()
422 && _installs.empty()) {
425 PoolItemList itemsToInstall = _satResolver->resultItemsToInstall();
427 for (PoolItemList::const_iterator instIter = itemsToInstall.begin();
428 instIter != itemsToInstall.end(); instIter++) {
430 for (Capabilities::const_iterator capIt = (*instIter)->dep (
Dep::REQUIRES).begin(); capIt != (*instIter)->dep (
Dep::REQUIRES).end(); ++capIt)
432 sat::WhatProvides possibleProviders(*capIt);
433 for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
438 bool alreadySetForInstallation =
false;
439 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider);
440 while (pos != _isInstalledBy.end()
441 && pos->first == provider
443 alreadySetForInstallation =
true;
444 ItemCapKind capKind = pos->second;
445 if (capKind.item() == *instIter) found =
true;
450 && provider.status().isToBeInstalled()) {
451 if (provider.status().isBySolver()) {
452 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::REQUIRES, !alreadySetForInstallation );
453 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
456 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::REQUIRES,
false );
457 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
459 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::REQUIRES, !alreadySetForInstallation );
460 _installs.insert (make_pair( *instIter, capKindisInstalledBy));
463 if (provider.status().staysInstalled()) {
464 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::REQUIRES,
false );
465 _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy));
467 ItemCapKind installedSatisfied( *instIter, *capIt,
Dep::REQUIRES,
false );
468 _installedSatisfied.insert (make_pair( provider, installedSatisfied));
473 if (!(_satResolver->onlyRequires())) {
477 sat::WhatProvides possibleProviders(*capIt);
478 for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
483 bool alreadySetForInstallation =
false;
484 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider);
485 while (pos != _isInstalledBy.end()
486 && pos->first == provider
488 alreadySetForInstallation =
true;
489 ItemCapKind capKind = pos->second;
490 if (capKind.item() == *instIter) found =
true;
495 && provider.status().isToBeInstalled()) {
496 if (provider.status().isBySolver()) {
497 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::RECOMMENDS, !alreadySetForInstallation );
498 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
501 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::RECOMMENDS,
false );
502 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
504 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::RECOMMENDS, !alreadySetForInstallation );
505 _installs.insert (make_pair( *instIter, capKindisInstalledBy));
508 if (provider.status().staysInstalled()) {
509 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::RECOMMENDS,
false );
510 _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy));
512 ItemCapKind installedSatisfied( *instIter, *capIt,
Dep::RECOMMENDS,
false );
513 _installedSatisfied.insert (make_pair( provider, installedSatisfied));
521 sat::WhatProvides possibleProviders(*capIt);
522 for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
526 bool alreadySetForInstallation =
false;
527 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(*instIter);
528 while (pos != _isInstalledBy.end()
529 && pos->first == *instIter
531 alreadySetForInstallation =
true;
532 ItemCapKind capKind = pos->second;
533 if (capKind.item() == provider) found =
true;
538 && instIter->status().isToBeInstalled()) {
539 if (instIter->status().isBySolver()) {
540 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::SUPPLEMENTS, !alreadySetForInstallation );
541 _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy));
544 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::SUPPLEMENTS,
false );
545 _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy));
547 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::SUPPLEMENTS, !alreadySetForInstallation );
548 _installs.insert (make_pair( provider, capKindisInstalledBy));
551 if (instIter->status().staysInstalled()) {
552 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::SUPPLEMENTS, !alreadySetForInstallation );
553 _satifiedByInstalled.insert (make_pair( provider, capKindisInstalledBy));
555 ItemCapKind installedSatisfied( provider, *capIt,
Dep::SUPPLEMENTS,
false );
556 _installedSatisfied.insert (make_pair( *instIter, installedSatisfied));
569 collectResolverInfo();
571 for (ItemCapKindMap::const_iterator iter = _isInstalledBy.find(item); iter != _isInstalledBy.end();) {
572 ItemCapKind info = iter->second;
573 PoolItem iterItem = iter->first;
574 if (iterItem == item) {
579 iter = _isInstalledBy.end();
588 collectResolverInfo();
590 for (ItemCapKindMap::const_iterator iter = _installs.find(item); iter != _installs.end();) {
591 ItemCapKind info = iter->second;
592 PoolItem iterItem = iter->first;
593 if (iterItem == item) {
598 iter = _installs.end();
607 collectResolverInfo();
609 for (ItemCapKindMap::const_iterator iter = _satifiedByInstalled.find(item); iter != _satifiedByInstalled.end();) {
610 ItemCapKind info = iter->second;
611 PoolItem iterItem = iter->first;
612 if (iterItem == item) {
617 iter = _satifiedByInstalled.end();
626 collectResolverInfo();
628 for (ItemCapKindMap::const_iterator iter = _installedSatisfied.find(item); iter != _installedSatisfied.end();) {
629 ItemCapKind info = iter->second;
630 PoolItem iterItem = iter->first;
631 if (iterItem == item) {
636 iter = _installedSatisfied.end();
void doUpdate()
Update to newest package.
solver::detail::ItemCapKindList installs(const PoolItem &item)
Gives information about WHICH additional items will be installed due the installation of an item...
std::list< ProblemSolution_Ptr > ProblemSolutionList
bool resolvePool()
Resolve package dependencies:
sat::Transaction getTransaction()
Return the Transaction computed by the last solver run.
bool operator()(PoolItem item)
static const Dep RECOMMENDS
static const Dep SUPPLEMENTS
static ZConfig & instance()
Singleton ctor.
virtual std::ostream & dumpOn(std::ostream &str) const
Overload to realize std::ostream & operator<<.
PoolItem find(const sat::Solvable &slv_r) const
Return the corresponding PoolItem.
ResolverFocus
The resolvers general attitude.
void setCleandepsOnRemove(bool yesno_r)
Cleanup when deleting packages.
ResStatus & status() const
Returns the current status.
#define for_(IT, BEG, END)
Convenient for-loops using iterator.
UndoTransact(const ResStatus::TransactByValue &status)
void setOnlyRequires(bool yesno_r)
Setting whether required packages are installed ONLY So recommended packages, language packages and p...
bool doUpgrade()
Do an distribution upgrade (DUP)
Request the standard behavior (as defined in zypp.conf or 'Job')
bool resetTransact(TransactByValue causer_r)
Not the same as setTransact( false ).
std::list< SolverQueueItem_Ptr > SolverQueueItemList
solver::detail::ItemCapKindList isInstalledBy(const PoolItem &item)
Gives information about WHO has pused an installation of an given item.
bool resolveQueue(solver::detail::SolverQueueItemList &queue)
Resolve package dependencies:
ResolverProblemList problems()
Return the dependency problems found by the last call to resolveDependencies().
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
solver::detail::ItemCapKindList installedSatisfied(const PoolItem &item)
Gives information about WHICH items require an already installed item.
solver::detail::ItemCapKindList satifiedByInstalled(const PoolItem &item)
Gives information about WHICH installed items are requested by the installation of an item...
std::list< ResolverProblem_Ptr > ResolverProblemList
static Pool instance()
Singleton ctor.
std::list< PoolItem > problematicUpdateItems() const
Unmaintained packages which does not fit to the updated system (broken dependencies) will be deleted...
ResolverFocus focus() const
ResStatus::TransactByValue resStatus
std::unary_function< PoolItem, bool > PoolItemFilterFunctor
Interim helper class to collect global options and settings.
static const Dep REQUIRES
bool operator()(PoolItem item)
Select PoolItem by transact.
bool setTransact(bool toTansact_r, TransactByValue causer_r)
Toggle between TRANSACT and KEEP_STATE.
void applySolutions(const ProblemSolutionList &solutions)
Apply problem solutions.
bool solver_onlyRequires() const
Solver regards required packages,patterns,...
static constexpr LoadFromPoolType loadFromPool
ResolverFocus solver_focus() const
The resolvers general attitude when resolving jobs.
bool solver_cleandepsOnRemove() const
Whether removing a package should also remove no longer needed requirements.
::s_Solver CSolver
Wrapped libsolv C data type exposed as backdoor.
std::list< ItemCapKind > ItemCapKindList
ZOLV_FLAG_TRIBOOL(setAllowNameChange, allowNameChange, _allownamechange, true) ZOLV_FLAG_TRIBOOL(setAllowVendorChange
ResStatus::TransactByValue resStatus
sat::detail::CSolver * get() const
Expert backdoor.
bool verifySystem()
Resolve package dependencies:
DoTransact(const ResStatus::TransactByValue &status)
Combining sat::Solvable and ResStatus.
void setFocus(ResolverFocus focus_r)
Define the resolvers general attitude when resolving jobs.
int invokeOnEach(TIterator begin_r, TIterator end_r, TFilter filter_r, TFunction fnc_r)
Iterate through [begin_r,end_r) and invoke fnc_r on each item that passes filter_r.
Easy-to use interface to the ZYPP dependency resolver.
Resolver(const ResPool &pool)
Ctor.
static ResPool instance()
Singleton ctor.