21 #include <boost/static_assert.hpp>
23 #define ZYPP_USE_RESOLVER_INTERNALS
45 #define MAXSOLVERRUNS 5
67 os <<
"<resolver>" << endl;
68 #define OUTS(t) os << " " << #t << ":\t" << t << endl;
72 OUTS( _onlyRequires );
73 OUTS( _solveSrcPackages );
74 OUTS( _cleandepsOnRemove );
75 OUTS( _ignoreAlreadyRecommended );
77 return os <<
"<resolver/>";
86 , _poolchanged(_pool.serial() )
87 , _upgradeMode (
false)
91 , _solveSrcPackages (
false )
93 , _ignoreAlreadyRecommended (
true )
97 _satResolver =
new SATResolver(_pool, satPool.get());
108 #define ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER, ZVARNAME, ZVARDEFAULT ) \
109 void Resolver::ZSETTER( TriBool state_r ) \
110 { _satResolver->ZVARNAME = indeterminate(state_r) ? ZVARDEFAULT : bool(state_r); } \
111 bool Resolver::ZGETTER() const \
112 { return _satResolver->ZVARNAME; } \
119 ZOLV_FLAG_TRIBOOL( setAllowArchChange, allowArchChange, _allowarchchange, false )
127 #undef ZOLV_FLAG_TRIBOOL
150 _extra_requires.clear();
151 _extra_conflicts.clear();
154 _isInstalledBy.clear();
156 _satifiedByInstalled.clear();
157 _installedSatisfied.clear();
164 return resolvePool();
170 return _satResolver->doUpdate();
174 {
return _satResolver->problematicUpdateItems(); }
176 void Resolver::addExtraRequire(
const Capability & capability )
177 { _extra_requires.insert (capability); }
179 void Resolver::removeExtraRequire(
const Capability & capability )
180 { _extra_requires.erase (capability); }
182 void Resolver::addExtraConflict(
const Capability & capability )
183 { _extra_conflicts.insert (capability); }
185 void Resolver::removeExtraConflict(
const Capability & capability )
186 { _extra_conflicts.erase (capability); }
188 void Resolver::removeQueueItem( SolverQueueItem_Ptr item )
191 for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin();
192 iter != _added_queue_items.end(); iter++) {
194 _added_queue_items.remove(*iter);
200 _removed_queue_items.push_back (item);
201 _removed_queue_items.unique ();
205 void Resolver::addQueueItem( SolverQueueItem_Ptr item )
208 for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin();
209 iter != _removed_queue_items.end(); iter++) {
211 _removed_queue_items.remove(*iter);
217 _added_queue_items.push_back (item);
218 _added_queue_items.unique ();
222 void Resolver::addWeak(
const PoolItem & item )
223 { _addWeak.push_back( item ); }
261 DBG <<
"Resolver::verifySystem()" << endl;
267 functor::functorRef<bool,PoolItem>(resetting) );
269 return resolvePool();
278 MIL <<
"*** undo ***" << endl;
281 functor::functorRef<bool,PoolItem>(info) );
286 _removed_queue_items.clear();
287 _added_queue_items.clear();
292 void Resolver::solverInit()
295 static bool poolDumped =
false;
296 MIL <<
"-------------- Calling SAT Solver -------------------" << endl;
297 if ( getenv(
"ZYPP_FULLLOG") ) {
298 Testcase testcase(
"/var/log/YaST2/autoTestcase");
300 testcase.createTestcase (*
this,
true,
false);
303 testcase.createTestcase (*
this,
false,
false);
307 _satResolver->setFixsystem ( isVerifyingMode() );
308 _satResolver->setIgnorealreadyrecommended ( ignoreAlreadyRecommended() );
309 _satResolver->setOnlyRequires ( onlyRequires() );
310 _satResolver->setUpdatesystem (_updateMode);
311 _satResolver->setSolveSrcPackages ( solveSrcPackages() );
312 _satResolver->setCleandepsOnRemove ( cleandepsOnRemove() );
314 _satResolver->setDistupgrade (_upgradeMode);
317 _satResolver->setDistupgrade_removeunsupported (
false);
321 _isInstalledBy.clear();
323 _satifiedByInstalled.clear();
324 _installedSatisfied.clear();
330 return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak, _upgradeRepos );
338 for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin();
339 iter != _removed_queue_items.end(); iter++) {
340 for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) {
341 if ( (*iterQueue)->cmp(*iter) == 0) {
342 MIL <<
"remove from queue" << *iter;
343 queue.remove(*iterQueue);
349 for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin();
350 iter != _added_queue_items.end(); iter++) {
352 for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) {
353 if ( (*iterQueue)->cmp(*iter) == 0) {
359 MIL <<
"add to queue" << *iter;
360 queue.push_back(*iter);
366 _removed_queue_items.clear();
367 _added_queue_items.clear();
369 return _satResolver->resolveQueue(queue, _addWeak);
376 ret.autoInstalled( _satResolver->autoInstalled() );
386 MIL <<
"Resolver::problems()" << endl;
387 return _satResolver->problems();
392 for ( ProblemSolution_Ptr solution : solutions )
394 if ( ! applySolution( *solution ) )
399 bool Resolver::applySolution(
const ProblemSolution & solution )
402 DBG <<
"apply solution " << solution << endl;
403 for ( SolutionAction_Ptr action : solution.actions() )
405 if ( ! action->execute( *
this ) )
407 WAR <<
"apply solution action failed: " << action << endl;
417 void Resolver::collectResolverInfo()
420 && _isInstalledBy.empty()
421 && _installs.empty()) {
424 PoolItemList itemsToInstall = _satResolver->resultItemsToInstall();
426 for (PoolItemList::const_iterator instIter = itemsToInstall.begin();
427 instIter != itemsToInstall.end(); instIter++) {
429 for (Capabilities::const_iterator capIt = (*instIter)->dep (
Dep::REQUIRES).begin(); capIt != (*instIter)->dep (
Dep::REQUIRES).end(); ++capIt)
431 sat::WhatProvides possibleProviders(*capIt);
432 for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
437 bool alreadySetForInstallation =
false;
438 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider);
439 while (pos != _isInstalledBy.end()
440 && pos->first == provider
442 alreadySetForInstallation =
true;
443 ItemCapKind capKind = pos->second;
444 if (capKind.item() == *instIter) found =
true;
449 && provider.status().isToBeInstalled()) {
450 if (provider.status().isBySolver()) {
451 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::REQUIRES, !alreadySetForInstallation );
452 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
455 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::REQUIRES,
false );
456 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
458 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::REQUIRES, !alreadySetForInstallation );
459 _installs.insert (make_pair( *instIter, capKindisInstalledBy));
462 if (provider.status().staysInstalled()) {
463 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::REQUIRES,
false );
464 _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy));
466 ItemCapKind installedSatisfied( *instIter, *capIt,
Dep::REQUIRES,
false );
467 _installedSatisfied.insert (make_pair( provider, installedSatisfied));
472 if (!(_satResolver->onlyRequires())) {
476 sat::WhatProvides possibleProviders(*capIt);
477 for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
482 bool alreadySetForInstallation =
false;
483 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider);
484 while (pos != _isInstalledBy.end()
485 && pos->first == provider
487 alreadySetForInstallation =
true;
488 ItemCapKind capKind = pos->second;
489 if (capKind.item() == *instIter) found =
true;
494 && provider.status().isToBeInstalled()) {
495 if (provider.status().isBySolver()) {
496 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::RECOMMENDS, !alreadySetForInstallation );
497 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
500 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::RECOMMENDS,
false );
501 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
503 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::RECOMMENDS, !alreadySetForInstallation );
504 _installs.insert (make_pair( *instIter, capKindisInstalledBy));
507 if (provider.status().staysInstalled()) {
508 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::RECOMMENDS,
false );
509 _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy));
511 ItemCapKind installedSatisfied( *instIter, *capIt,
Dep::RECOMMENDS,
false );
512 _installedSatisfied.insert (make_pair( provider, installedSatisfied));
520 sat::WhatProvides possibleProviders(*capIt);
521 for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
525 bool alreadySetForInstallation =
false;
526 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(*instIter);
527 while (pos != _isInstalledBy.end()
528 && pos->first == *instIter
530 alreadySetForInstallation =
true;
531 ItemCapKind capKind = pos->second;
532 if (capKind.item() == provider) found =
true;
537 && instIter->status().isToBeInstalled()) {
538 if (instIter->status().isBySolver()) {
539 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::SUPPLEMENTS, !alreadySetForInstallation );
540 _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy));
543 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::SUPPLEMENTS,
false );
544 _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy));
546 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::SUPPLEMENTS, !alreadySetForInstallation );
547 _installs.insert (make_pair( provider, capKindisInstalledBy));
550 if (instIter->status().staysInstalled()) {
551 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::SUPPLEMENTS, !alreadySetForInstallation );
552 _satifiedByInstalled.insert (make_pair( provider, capKindisInstalledBy));
554 ItemCapKind installedSatisfied( provider, *capIt,
Dep::SUPPLEMENTS,
false );
555 _installedSatisfied.insert (make_pair( *instIter, installedSatisfied));
568 collectResolverInfo();
570 for (ItemCapKindMap::const_iterator iter = _isInstalledBy.find(item); iter != _isInstalledBy.end();) {
571 ItemCapKind info = iter->second;
572 PoolItem iterItem = iter->first;
573 if (iterItem == item) {
578 iter = _isInstalledBy.end();
587 collectResolverInfo();
589 for (ItemCapKindMap::const_iterator iter = _installs.find(item); iter != _installs.end();) {
590 ItemCapKind info = iter->second;
591 PoolItem iterItem = iter->first;
592 if (iterItem == item) {
597 iter = _installs.end();
606 collectResolverInfo();
608 for (ItemCapKindMap::const_iterator iter = _satifiedByInstalled.find(item); iter != _satifiedByInstalled.end();) {
609 ItemCapKind info = iter->second;
610 PoolItem iterItem = iter->first;
611 if (iterItem == item) {
616 iter = _satifiedByInstalled.end();
625 collectResolverInfo();
627 for (ItemCapKindMap::const_iterator iter = _installedSatisfied.find(item); iter != _installedSatisfied.end();) {
628 ItemCapKind info = iter->second;
629 PoolItem iterItem = iter->first;
630 if (iterItem == item) {
635 iter = _installedSatisfied.end();