21 #include <boost/static_assert.hpp>
23 #define ZYPP_USE_RESOLVER_INTERNALS
45 #define MAXSOLVERRUNS 5
50 #undef ZYPP_BASE_LOGGER_LOGGROUP
51 #define ZYPP_BASE_LOGGER_LOGGROUP "zypp::solver"
70 os <<
"<resolver>" << endl;
71 #define OUTS(t) os << " " << #t << ":\t" << t << endl;
75 OUTS( _onlyRequires );
76 OUTS( _solveSrcPackages );
77 OUTS( _cleandepsOnRemove );
78 OUTS( _ignoreAlreadyRecommended );
80 return os <<
"<resolver/>";
89 , _poolchanged(_pool.serial() )
90 , _upgradeMode (
false)
94 , _solveSrcPackages (
false )
96 , _ignoreAlreadyRecommended (
true )
99 _satResolver =
new SATResolver(_pool, satPool.get());
110 #define ZOLV_FLAG_TRIBOOL( ZSETTER, ZGETTER, ZVARNAME, ZVARDEFAULT ) \
111 void Resolver::ZSETTER( TriBool state_r ) \
112 { _satResolver->ZVARNAME = indeterminate(state_r) ? ZVARDEFAULT : bool(state_r); } \
113 bool Resolver::ZGETTER() const \
114 { return _satResolver->ZVARNAME; } \
121 ZOLV_FLAG_TRIBOOL( setAllowArchChange, allowArchChange, _allowarchchange, false )
129 #undef ZOLV_FLAG_TRIBOOL
152 _extra_requires.clear();
153 _extra_conflicts.clear();
156 _isInstalledBy.clear();
158 _satifiedByInstalled.clear();
159 _installedSatisfied.clear();
166 return resolvePool();
172 return _satResolver->doUpdate();
176 {
return _satResolver->problematicUpdateItems(); }
178 void Resolver::addExtraRequire(
const Capability & capability )
179 { _extra_requires.insert (capability); }
181 void Resolver::removeExtraRequire(
const Capability & capability )
182 { _extra_requires.erase (capability); }
184 void Resolver::addExtraConflict(
const Capability & capability )
185 { _extra_conflicts.insert (capability); }
187 void Resolver::removeExtraConflict(
const Capability & capability )
188 { _extra_conflicts.erase (capability); }
190 void Resolver::removeQueueItem( SolverQueueItem_Ptr item )
193 for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin();
194 iter != _added_queue_items.end(); iter++) {
196 _added_queue_items.remove(*iter);
202 _removed_queue_items.push_back (item);
203 _removed_queue_items.unique ();
207 void Resolver::addQueueItem( SolverQueueItem_Ptr item )
210 for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin();
211 iter != _removed_queue_items.end(); iter++) {
213 _removed_queue_items.remove(*iter);
219 _added_queue_items.push_back (item);
220 _added_queue_items.unique ();
224 void Resolver::addWeak(
const PoolItem & item )
225 { _addWeak.push_back( item ); }
263 DBG <<
"Resolver::verifySystem()" << endl;
269 functor::functorRef<bool,PoolItem>(resetting) );
271 return resolvePool();
280 MIL <<
"*** undo ***" << endl;
283 functor::functorRef<bool,PoolItem>(info) );
288 _removed_queue_items.clear();
289 _added_queue_items.clear();
294 void Resolver::solverInit()
297 static bool poolDumped =
false;
298 MIL <<
"-------------- Calling SAT Solver -------------------" << endl;
299 if ( getenv(
"ZYPP_FULLLOG") ) {
300 Testcase testcase(
"/var/log/YaST2/autoTestcase");
302 testcase.createTestcase (*
this,
true,
false);
305 testcase.createTestcase (*
this,
false,
false);
309 _satResolver->setFixsystem ( isVerifyingMode() );
310 _satResolver->setIgnorealreadyrecommended ( ignoreAlreadyRecommended() );
311 _satResolver->setOnlyRequires ( onlyRequires() );
312 _satResolver->setUpdatesystem (_updateMode);
313 _satResolver->setSolveSrcPackages ( solveSrcPackages() );
314 _satResolver->setCleandepsOnRemove ( cleandepsOnRemove() );
316 _satResolver->setDistupgrade (_upgradeMode);
319 _satResolver->setDistupgrade_removeunsupported (
false);
323 _isInstalledBy.clear();
325 _satifiedByInstalled.clear();
326 _installedSatisfied.clear();
332 return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak, _upgradeRepos );
340 for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin();
341 iter != _removed_queue_items.end(); iter++) {
342 for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) {
343 if ( (*iterQueue)->cmp(*iter) == 0) {
344 MIL <<
"remove from queue" << *iter;
345 queue.remove(*iterQueue);
351 for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin();
352 iter != _added_queue_items.end(); iter++) {
354 for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) {
355 if ( (*iterQueue)->cmp(*iter) == 0) {
361 MIL <<
"add to queue" << *iter;
362 queue.push_back(*iter);
368 _removed_queue_items.clear();
369 _added_queue_items.clear();
371 return _satResolver->resolveQueue(queue, _addWeak);
378 ret.autoInstalled( _satResolver->autoInstalled() );
388 MIL <<
"Resolver::problems()" << endl;
389 return _satResolver->problems();
394 for ( ProblemSolution_Ptr solution : solutions )
396 if ( ! applySolution( *solution ) )
401 bool Resolver::applySolution(
const ProblemSolution & solution )
404 DBG <<
"apply solution " << solution << endl;
405 for ( SolutionAction_Ptr action : solution.actions() )
407 if ( ! action->execute( *
this ) )
409 WAR <<
"apply solution action failed: " << action << endl;
419 void Resolver::collectResolverInfo()
422 && _isInstalledBy.empty()
423 && _installs.empty()) {
426 PoolItemList itemsToInstall = _satResolver->resultItemsToInstall();
428 for (PoolItemList::const_iterator instIter = itemsToInstall.begin();
429 instIter != itemsToInstall.end(); instIter++) {
431 for (Capabilities::const_iterator capIt = (*instIter)->dep (
Dep::REQUIRES).begin(); capIt != (*instIter)->dep (
Dep::REQUIRES).end(); ++capIt)
433 sat::WhatProvides possibleProviders(*capIt);
434 for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
439 bool alreadySetForInstallation =
false;
440 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider);
441 while (pos != _isInstalledBy.end()
442 && pos->first == provider
444 alreadySetForInstallation =
true;
445 ItemCapKind capKind = pos->second;
446 if (capKind.item() == *instIter) found =
true;
451 && provider.status().isToBeInstalled()) {
452 if (provider.status().isBySolver()) {
453 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::REQUIRES, !alreadySetForInstallation );
454 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
457 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::REQUIRES,
false );
458 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
460 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::REQUIRES, !alreadySetForInstallation );
461 _installs.insert (make_pair( *instIter, capKindisInstalledBy));
464 if (provider.status().staysInstalled()) {
465 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::REQUIRES,
false );
466 _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy));
468 ItemCapKind installedSatisfied( *instIter, *capIt,
Dep::REQUIRES,
false );
469 _installedSatisfied.insert (make_pair( provider, installedSatisfied));
474 if (!(_satResolver->onlyRequires())) {
478 sat::WhatProvides possibleProviders(*capIt);
479 for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
484 bool alreadySetForInstallation =
false;
485 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider);
486 while (pos != _isInstalledBy.end()
487 && pos->first == provider
489 alreadySetForInstallation =
true;
490 ItemCapKind capKind = pos->second;
491 if (capKind.item() == *instIter) found =
true;
496 && provider.status().isToBeInstalled()) {
497 if (provider.status().isBySolver()) {
498 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::RECOMMENDS, !alreadySetForInstallation );
499 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
502 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::RECOMMENDS,
false );
503 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
505 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::RECOMMENDS, !alreadySetForInstallation );
506 _installs.insert (make_pair( *instIter, capKindisInstalledBy));
509 if (provider.status().staysInstalled()) {
510 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::RECOMMENDS,
false );
511 _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy));
513 ItemCapKind installedSatisfied( *instIter, *capIt,
Dep::RECOMMENDS,
false );
514 _installedSatisfied.insert (make_pair( provider, installedSatisfied));
522 sat::WhatProvides possibleProviders(*capIt);
523 for_( iter, possibleProviders.begin(), possibleProviders.end() ) {
527 bool alreadySetForInstallation =
false;
528 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(*instIter);
529 while (pos != _isInstalledBy.end()
530 && pos->first == *instIter
532 alreadySetForInstallation =
true;
533 ItemCapKind capKind = pos->second;
534 if (capKind.item() == provider) found =
true;
539 && instIter->status().isToBeInstalled()) {
540 if (instIter->status().isBySolver()) {
541 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::SUPPLEMENTS, !alreadySetForInstallation );
542 _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy));
545 ItemCapKind capKindisInstalledBy( provider, *capIt,
Dep::SUPPLEMENTS,
false );
546 _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy));
548 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::SUPPLEMENTS, !alreadySetForInstallation );
549 _installs.insert (make_pair( provider, capKindisInstalledBy));
552 if (instIter->status().staysInstalled()) {
553 ItemCapKind capKindisInstalledBy( *instIter, *capIt,
Dep::SUPPLEMENTS, !alreadySetForInstallation );
554 _satifiedByInstalled.insert (make_pair( provider, capKindisInstalledBy));
556 ItemCapKind installedSatisfied( provider, *capIt,
Dep::SUPPLEMENTS,
false );
557 _installedSatisfied.insert (make_pair( *instIter, installedSatisfied));
570 collectResolverInfo();
572 for (ItemCapKindMap::const_iterator iter = _isInstalledBy.find(item); iter != _isInstalledBy.end();) {
573 ItemCapKind info = iter->second;
574 PoolItem iterItem = iter->first;
575 if (iterItem == item) {
580 iter = _isInstalledBy.end();
589 collectResolverInfo();
591 for (ItemCapKindMap::const_iterator iter = _installs.find(item); iter != _installs.end();) {
592 ItemCapKind info = iter->second;
593 PoolItem iterItem = iter->first;
594 if (iterItem == item) {
599 iter = _installs.end();
608 collectResolverInfo();
610 for (ItemCapKindMap::const_iterator iter = _satifiedByInstalled.find(item); iter != _satifiedByInstalled.end();) {
611 ItemCapKind info = iter->second;
612 PoolItem iterItem = iter->first;
613 if (iterItem == item) {
618 iter = _satifiedByInstalled.end();
627 collectResolverInfo();
629 for (ItemCapKindMap::const_iterator iter = _installedSatisfied.find(item); iter != _installedSatisfied.end();) {
630 ItemCapKind info = iter->second;
631 PoolItem iterItem = iter->first;
632 if (iterItem == item) {
637 iter = _installedSatisfied.end();