21 #include <boost/static_assert.hpp>
23 #define ZYPP_USE_RESOLVER_INTERNALS
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 );
68 OUTS( _solveSrcPackages );
69 OUTS( _cleandepsOnRemove );
70 OUTS( _ignoreAlreadyRecommended );
72 return os <<
"<resolver/>";
81 , _poolchanged(_pool.serial() )
82 , _upgradeMode (
false)
86 , _solveSrcPackages (
false )
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") ) {
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();