21 #include <boost/static_assert.hpp>
41 #define MAXSOLVERRUNS 5
63 os <<
"<resolver>" << endl;
64 #define OUTS(t) os << " " << #t << ":\t" << t << endl;
65 OUTS( _forceResolve );
69 OUTS( _onlyRequires );
70 OUTS( _allowVendorChange );
71 OUTS( _solveSrcPackages );
72 OUTS( _cleandepsOnRemove );
73 OUTS( _ignoreAlreadyRecommended );
75 return os <<
"<resolver/>";
84 , _poolchanged(_pool.serial() )
85 , _forceResolve (false)
86 , _upgradeMode (false)
89 , _onlyRequires (
ZConfig::instance().solver_onlyRequires() )
90 , _allowVendorChange (
ZConfig::instance().solver_allowVendorChange() )
91 , _solveSrcPackages ( false )
92 , _cleandepsOnRemove (
ZConfig::instance().solver_cleandepsOnRemove() )
93 , _ignoreAlreadyRecommended ( false )
97 _satResolver =
new SATResolver(_pool, satPool.get());
133 _extra_requires.clear();
134 _extra_conflicts.clear();
137 _isInstalledBy.clear();
139 _satifiedByInstalled.clear();
140 _installedSatisfied.clear();
153 return _satResolver->doUpdate();
157 {
return _satResolver->problematicUpdateItems(); }
159 void Resolver::addExtraRequire(
const Capability & capability )
160 { _extra_requires.insert (capability); }
162 void Resolver::removeExtraRequire(
const Capability & capability )
163 { _extra_requires.erase (capability); }
165 void Resolver::addExtraConflict(
const Capability & capability )
166 { _extra_conflicts.insert (capability); }
168 void Resolver::removeExtraConflict(
const Capability & capability )
169 { _extra_conflicts.erase (capability); }
171 void Resolver::removeQueueItem( SolverQueueItem_Ptr item )
174 for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin();
175 iter != _added_queue_items.end(); iter++) {
177 _added_queue_items.remove(*iter);
183 _removed_queue_items.push_back (item);
184 _removed_queue_items.unique ();
188 void Resolver::addQueueItem( SolverQueueItem_Ptr item )
191 for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin();
192 iter != _removed_queue_items.end(); iter++) {
194 _removed_queue_items.remove(*iter);
200 _added_queue_items.push_back (item);
201 _added_queue_items.unique ();
206 { _addWeak.push_back( item ); }
244 _DEBUG (
"Resolver::verifySystem() ");
250 functor::functorRef<bool,PoolItem>(resetting) );
262 MIL <<
"*** undo ***" << endl;
265 functor::functorRef<bool,PoolItem>(info) );
270 _removed_queue_items.clear();
271 _added_queue_items.clear();
276 void Resolver::solverInit()
279 static bool poolDumped =
false;
280 MIL <<
"-------------- Calling SAT Solver -------------------" << endl;
281 if ( getenv(
"ZYPP_FULLLOG") ) {
282 Testcase testcase(
"/var/log/YaST2/autoTestcase");
291 _satResolver->setFixsystem ( isVerifyingMode() );
294 _satResolver->setAllowdowngrade (
false);
295 _satResolver->setAllowarchchange (
false);
298 _satResolver->setUpdatesystem (
false);
299 _satResolver->setNoupdateprovide (
false);
300 _satResolver->setDosplitprovides (
true);
304 _satResolver->setDistupgrade (_upgradeMode);
307 _satResolver->setDistupgrade_removeunsupported (
false);
311 _isInstalledBy.clear();
313 _satifiedByInstalled.clear();
314 _installedSatisfied.clear();
320 return _satResolver->resolvePool(_extra_requires, _extra_conflicts, _addWeak, _upgradeRepos );
328 for (SolverQueueItemList::const_iterator iter = _removed_queue_items.begin();
329 iter != _removed_queue_items.end(); iter++) {
330 for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) {
331 if ( (*iterQueue)->cmp(*iter) == 0) {
332 MIL <<
"remove from queue" << *iter;
333 queue.remove(*iterQueue);
339 for (SolverQueueItemList::const_iterator iter = _added_queue_items.begin();
340 iter != _added_queue_items.end(); iter++) {
342 for (SolverQueueItemList::const_iterator iterQueue = queue.begin(); iterQueue != queue.end(); iterQueue++) {
343 if ( (*iterQueue)->cmp(*iter) == 0) {
349 MIL <<
"add to queue" << *iter;
350 queue.push_back(*iter);
356 _removed_queue_items.clear();
357 _added_queue_items.clear();
359 return _satResolver->resolveQueue(queue, _addWeak);
364 return sat::Transaction( sat::Transaction::Default() );
373 MIL <<
"Resolver::problems()" << endl;
374 return _satResolver->problems();
379 for_( iter, solutions.begin(), solutions.end() )
381 ProblemSolution_Ptr solution = *iter;
382 if ( !solution->apply( *
this ) )
387 void Resolver::collectResolverInfo()
390 && _isInstalledBy.empty()
391 && _installs.empty()) {
394 PoolItemList itemsToInstall = _satResolver->resultItemsToInstall();
396 for (PoolItemList::const_iterator instIter = itemsToInstall.begin();
397 instIter != itemsToInstall.end(); instIter++) {
402 for_( iter, possibleProviders.
begin(), possibleProviders.
end() ) {
407 bool alreadySetForInstallation =
false;
408 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider);
409 while (pos != _isInstalledBy.end()
410 && pos->first == provider
412 alreadySetForInstallation =
true;
414 if (capKind.
item == *instIter) found =
true;
422 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
426 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
429 _installs.insert (make_pair( *instIter, capKindisInstalledBy));
434 _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy));
437 _installedSatisfied.insert (make_pair( provider, installedSatisfied));
442 if (!(_satResolver->onlyRequires())) {
447 for_( iter, possibleProviders.
begin(), possibleProviders.
end() ) {
452 bool alreadySetForInstallation =
false;
453 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(provider);
454 while (pos != _isInstalledBy.end()
455 && pos->first == provider
457 alreadySetForInstallation =
true;
459 if (capKind.
item == *instIter) found =
true;
467 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
471 _isInstalledBy.insert (make_pair( provider, capKindisInstalledBy));
474 _installs.insert (make_pair( *instIter, capKindisInstalledBy));
479 _satifiedByInstalled.insert (make_pair( *instIter, capKindisInstalledBy));
482 _installedSatisfied.insert (make_pair( provider, installedSatisfied));
491 for_( iter, possibleProviders.
begin(), possibleProviders.
end() ) {
495 bool alreadySetForInstallation =
false;
496 ItemCapKindMap::const_iterator pos = _isInstalledBy.find(*instIter);
497 while (pos != _isInstalledBy.end()
498 && pos->first == *instIter
500 alreadySetForInstallation =
true;
502 if (capKind.
item == provider) found =
true;
507 && instIter->status().isToBeInstalled()) {
508 if (instIter->status().isBySolver()) {
510 _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy));
514 _isInstalledBy.insert (make_pair( *instIter, capKindisInstalledBy));
517 _installs.insert (make_pair( provider, capKindisInstalledBy));
520 if (instIter->status().staysInstalled()) {
522 _satifiedByInstalled.insert (make_pair( provider, capKindisInstalledBy));
525 _installedSatisfied.insert (make_pair( *instIter, installedSatisfied));
538 collectResolverInfo();
540 for (ItemCapKindMap::const_iterator iter = _isInstalledBy.find(item); iter != _isInstalledBy.end();) {
543 if (iterItem == item) {
548 iter = _isInstalledBy.end();
557 collectResolverInfo();
559 for (ItemCapKindMap::const_iterator iter = _installs.find(item); iter != _installs.end();) {
560 ItemCapKind info = iter->second;
561 PoolItem iterItem = iter->first;
562 if (iterItem == item) {
567 iter = _installs.end();
576 collectResolverInfo();
578 for (ItemCapKindMap::const_iterator iter = _satifiedByInstalled.find(item); iter != _satifiedByInstalled.end();) {
579 ItemCapKind info = iter->second;
580 PoolItem iterItem = iter->first;
581 if (iterItem == item) {
586 iter = _satifiedByInstalled.end();
595 collectResolverInfo();
597 for (ItemCapKindMap::const_iterator iter = _installedSatisfied.find(item); iter != _installedSatisfied.end();) {
598 ItemCapKind info = iter->second;
599 PoolItem iterItem = iter->first;
600 if (iterItem == item) {
605 iter = _installedSatisfied.end();