23#include <solv/repo_solv.h>
24#include <solv/poolarch.h>
26#include <solv/poolvendor.h>
27#include <solv/policy.h>
28#include <solv/bitmap.h>
29#include <solv/queue.h>
32#define ZYPP_USE_RESOLVER_INTERNALS
34#include <zypp/base/LogTools.h>
35#include <zypp/base/Gettext.h>
40#include <zypp/AutoDispose.h>
43#include <zypp/sat/detail/PoolImpl.h>
45#include <zypp/solver/detail/Resolver.h>
58#define XDEBUG(x) do { if (base::logger::isExcessive()) XXX << x << std::endl;} while (0)
60#undef ZYPP_BASE_LOGGER_LOGGROUP
61#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::solver"
82 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_INSTALLED, 0 );
83 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_BEST, 0 );
86 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_INSTALLED, 1 );
87 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_BEST, 0 );
90 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_INSTALLED, 0 );
91 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_BEST, 1 );
99 inline sat::Queue collectPseudoInstalled(
const ResPool & pool_r )
102 for (
const PoolItem & pi : pool_r )
110 inline void solverCopyBackWeak(
sat::detail::CSolver & satSolver_r, PoolItemList & orphanedItems_r )
114 sat::Queue recommendations;
115 sat::Queue suggestions;
116 ::solver_get_recommendations( &satSolver_r, recommendations, suggestions, 0 );
118 PoolItem(sat::Solvable(recommendations[i])).status().setRecommended(
true );
120 PoolItem(sat::Solvable(suggestions[i])).status().setSuggested(
true );
123 orphanedItems_r.clear();
125 ::solver_get_orphaned( &satSolver_r, orphaned );
128 PoolItem pi { sat::Solvable(orphaned[i]) };
129 pi.status().setOrphaned(
true );
130 orphanedItems_r.push_back( pi );
135 ::solver_get_unneeded( &satSolver_r, unneeded, 1 );
137 PoolItem(sat::Solvable(unneeded[i])).status().setUnneeded(
true );
142 inline void solverCopyBackValidate(
sat::detail::CSolver & satSolver_r,
const ResPool & pool_r )
144 sat::Queue pseudoItems { collectPseudoInstalled( pool_r ) };
145 if ( ! pseudoItems.empty() )
147 sat::Queue pseudoFlags;
148 ::solver_trivial_installable( &satSolver_r, pseudoItems, pseudoFlags );
152 PoolItem pi { sat::Solvable(pseudoItems[i]) };
153 switch ( pseudoFlags[i] )
155 case 0: pi.status().setBroken();
break;
156 case 1: pi.status().setSatisfied();
break;
157 case -1: pi.status().setNonRelevant();
break;
158 default: pi.status().setUndetermined();
break;
171#define MAYBE_CLEANDEPS (cleandepsOnRemove()?SOLVER_CLEANDEPS:0)
190 if ( ! pseudoItems_r.
empty() )
192 MIL <<
"Establish..." << endl;
194 ::pool_set_custom_vendorcheck( cPool, &
vendorCheck );
200 jobQueue.
push( SOLVER_NOOBSOLETES | SOLVER_SOLVABLE );
201 jobQueue.
push( solv.id() );
206 if ( ::solver_solve( cSolver, jobQueue ) != 0 )
207 INT <<
"How can establish fail?" << endl;
209 ::solver_trivial_installable( cSolver, pseudoItems_r, pseudoFlags_r );
214 switch ( pseudoFlags_r[i] )
216 case 0: pi.status().setBroken();
break;
217 case 1: pi.status().setSatisfied();
break;
218 case -1: pi.status().setNonRelevant();
break;
219 default: pi.status().setUndetermined();
break;
222 MIL <<
"Establish DONE" << endl;
225 MIL <<
"Establish not needed." << endl;
231 return std::string();
249 os <<
"<resolver>" << endl;
251#define OUTS(X) os << " " << #X << "\t= " << solver_get_flag(_satSolver, SOLVER_FLAG_##X) << endl
252 OUTS( ALLOW_DOWNGRADE );
253 OUTS( ALLOW_ARCHCHANGE );
254 OUTS( ALLOW_VENDORCHANGE );
255 OUTS( ALLOW_NAMECHANGE );
256 OUTS( ALLOW_UNINSTALL );
257 OUTS( NO_UPDATEPROVIDE );
258 OUTS( SPLITPROVIDES );
259 OUTS( IGNORE_RECOMMENDED );
260 OUTS( ADD_ALREADY_RECOMMENDED );
261 OUTS( NO_INFARCHCHECK );
262 OUTS( KEEP_EXPLICIT_OBSOLETES );
263 OUTS( BEST_OBEY_POLICY );
264 OUTS( NO_AUTOTARGET );
265 OUTS( DUP_ALLOW_DOWNGRADE );
266 OUTS( DUP_ALLOW_ARCHCHANGE );
267 OUTS( DUP_ALLOW_VENDORCHANGE );
268 OUTS( DUP_ALLOW_NAMECHANGE );
269 OUTS( KEEP_ORPHANS );
270 OUTS( BREAK_ORPHANS );
271 OUTS( YUM_OBSOLETES );
273 os <<
" focus = " << _focus << endl;
274 os <<
" distupgrade = " << _distupgrade << endl;
275 os <<
" distupgrade_removeunsupported = " << _distupgrade_removeunsupported << endl;
276 os <<
" solveSrcPackages = " << _solveSrcPackages << endl;
277 os <<
" cleandepsOnRemove = " << _cleandepsOnRemove << endl;
278 os <<
" fixsystem = " << _fixsystem << endl;
282 return os <<
"<resolver/>" << endl;
292 , _focus ( ZConfig::instance().solver_focus() )
294 , _allowdowngrade ( false )
295 , _allownamechange ( true )
296 , _allowarchchange ( false )
298 , _allowuninstall ( false )
299 , _updatesystem(false)
300 , _noupdateprovide ( false )
301 , _dosplitprovides ( true )
302 , _onlyRequires (ZConfig::instance().solver_onlyRequires())
303 , _ignorealreadyrecommended(true)
304 , _distupgrade(false)
305 , _distupgrade_removeunsupported(false)
310 , _solveSrcPackages(false)
311 , _cleandepsOnRemove(ZConfig::instance().solver_cleandepsOnRemove())
316SATResolver::~SATResolver()
324SATResolver::pool (
void)
const
346 XDEBUG(
"SATSolutionToPool install returns " << item <<
", " << r);
350 XDEBUG(
"SATSolutionToPool upgrade returns " << item <<
", " << r);
354 XDEBUG(
"SATSolutionToPool remove returns " << item <<
", " << r);
375 PoolItemList & items_to_remove_r,
376 PoolItemList & items_to_lock_r,
377 PoolItemList & items_to_keep_r,
378 bool solveSrcPackages_r )
379 : _items_to_install( items_to_install_r )
380 , _items_to_remove( items_to_remove_r )
381 , _items_to_lock( items_to_lock_r )
382 , _items_to_keep( items_to_keep_r )
383 , _solveSrcPackages( solveSrcPackages_r )
385 _items_to_install.clear();
386 _items_to_remove.clear();
387 _items_to_lock.clear();
388 _items_to_keep.clear();
413 itemStatus.
isUninstalled() ? _items_to_install.push_back( item_r )
414 : _items_to_remove.push_back( item_r );
break;
446 : is_updated( false )
447 , _installed( installed_r )
472 queue_push( &(_jobQueue), SOLVER_VERIFY|SOLVER_SOLVABLE_ALL);
473 queue_push( &(_jobQueue), 0 );
476 queue_push( &(_jobQueue), SOLVER_UPDATE|SOLVER_SOLVABLE_ALL);
477 queue_push( &(_jobQueue), 0 );
480 queue_push( &(_jobQueue), SOLVER_DISTUPGRADE|SOLVER_SOLVABLE_ALL);
481 queue_push( &(_jobQueue), 0 );
483 if (_distupgrade_removeunsupported) {
484 queue_push( &(_jobQueue), SOLVER_DROP_ORPHANED|SOLVER_SOLVABLE_ALL);
485 queue_push( &(_jobQueue), 0 );
487 solverSetFocus( *_satSolver, _focus );
488 solver_set_flag(_satSolver, SOLVER_FLAG_ADD_ALREADY_RECOMMENDED, !_ignorealreadyrecommended);
489 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_DOWNGRADE, _allowdowngrade);
490 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_NAMECHANGE, _allownamechange);
491 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_ARCHCHANGE, _allowarchchange);
493 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_UNINSTALL, _allowuninstall);
494 solver_set_flag(_satSolver, SOLVER_FLAG_NO_UPDATEPROVIDE, _noupdateprovide);
495 solver_set_flag(_satSolver, SOLVER_FLAG_SPLITPROVIDES, _dosplitprovides);
496 solver_set_flag(_satSolver, SOLVER_FLAG_IGNORE_RECOMMENDED,
false);
497 solver_set_flag(_satSolver, SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED, _onlyRequires);
506 MIL <<
"Starting solving...." << endl;
508 if ( solver_solve( _satSolver, &(_jobQueue) ) == 0 )
515 if ( _distupgrade_removeunsupported )
516 MIL <<
"Droplist processing not needed. RemoveUnsupported is On." << endl;
518 MIL <<
"Droplist processing is disabled in ZConfig." << endl;
521 bool resolve =
false;
522 MIL <<
"Checking droplists ..." << endl;
525 solver_get_decisionqueue( _satSolver, decisionq );
532 static const Capability productCap {
"product()" };
533 if ( slv && slv.provides().matches( productCap ) )
535 CapabilitySet droplist { slv.valuesOfNamespace(
"weakremover" ) };
536 MIL <<
"Droplist for " << slv <<
": size " << droplist.size() << endl;
537 if ( !droplist.empty() )
539 for (
const auto & cap : droplist )
541 queue_push( &_jobQueue, SOLVER_DROP_ORPHANED | SOLVER_SOLVABLE_NAME );
542 queue_push( &_jobQueue, cap.id() );
545 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
546 queue_push( &(_jobQueue),
id );
552 solver_solve( _satSolver, &(_jobQueue) );
556 MIL <<
"....Solver end" << endl;
560 _result_items_to_install.clear();
561 _result_items_to_remove.clear();
565 queue_init(&decisionq);
566 solver_get_decisionqueue(_satSolver, &decisionq);
567 for (
int i = 0; i < decisionq.count; ++i )
569 Id p = decisionq.elements[i];
574 if ( ! slv || slv.isSystem() )
577 PoolItem poolItem( slv );
579 _result_items_to_install.push_back( poolItem );
581 queue_free(&decisionq);
585 if ( systemRepo && ! systemRepo.solvablesEmpty() )
587 bool mustCheckObsoletes =
false;
588 for_( it, systemRepo.solvablesBegin(), systemRepo.solvablesEnd() )
590 if (solver_get_decisionlevel(_satSolver, it->id()) > 0)
594 CheckIfUpdate info( *it );
595 PoolItem poolItem( *it );
597 _pool.byIdentEnd( poolItem ),
598 resfilter::ByUninstalled(),
599 functor::functorRef<bool,PoolItem> (info) );
601 if (info.is_updated) {
605 if ( ! mustCheckObsoletes )
606 mustCheckObsoletes =
true;
608 _result_items_to_remove.push_back (poolItem);
610 if ( mustCheckObsoletes )
612 sat::WhatObsoletes obsoleted( _result_items_to_install.begin(), _result_items_to_install.end() );
613 for_( it, obsoleted.poolItemBegin(), obsoleted.poolItemEnd() )
615 ResStatus & status( it->status() );
617 if ( status.transacts() && ! status.isToBeUninstalledDueToUpgrade() )
618 status.setToBeUninstalledDueToObsolete();
625 solverCopyBackWeak( *_satSolver, _problem_items );
626 solverCopyBackValidate( *_satSolver, _pool );
631 for (CapabilitySet::const_iterator iter = requires_caps.begin(); iter != requires_caps.end(); iter++) {
632 sat::WhatProvides rpmProviders(*iter);
633 for_( iter2, rpmProviders.begin(), rpmProviders.end() ) {
634 PoolItem poolItem(*iter2);
635 if (poolItem.status().isToBeInstalled()) {
636 MIL <<
"User requirement " << *iter <<
" sets " << poolItem << endl;
641 for (CapabilitySet::const_iterator iter = conflict_caps.begin(); iter != conflict_caps.end(); iter++) {
642 sat::WhatProvides rpmProviders(*iter);
643 for_( iter2, rpmProviders.begin(), rpmProviders.end() ) {
644 PoolItem poolItem(*iter2);
645 if (poolItem.status().isToBeUninstalled()) {
646 MIL <<
"User conflict " << *iter <<
" sets " << poolItem << endl;
652 if (solver_problem_count(_satSolver) > 0 )
654 ERR <<
"Solverrun finished with an ERROR" << endl;
663SATResolver::solverInit(
const PoolItemList & weakItems)
666 MIL <<
"SATResolver::solverInit()" << endl;
670 _satSolver = solver_create( _satPool );
674 bool toRelax =
false;
675 if ( _distupgrade ) {
676 for ( sat::Solvable solv : sat::WhatProvides( Capability(
"dup-vendor-relax(suse)") ) ) {
677 if ( ! solv.isSystem() ) {
678 MIL <<
"Relaxed vendor check requested by " << solv << endl;
687 queue_init( &_jobQueue );
691 SATCollectTransact collector( _items_to_install, _items_to_remove, _items_to_lock, _items_to_keep, solveSrcPackages() );
692 invokeOnEach ( _pool.begin(), _pool.end(), functor::functorRef<bool,PoolItem>( collector ) );
695 for (PoolItemList::const_iterator iter = weakItems.begin(); iter != weakItems.end(); iter++) {
696 Id
id = (*iter)->satSolvable().id();
698 ERR <<
"Weaken: " << *iter <<
" not found" << endl;
700 MIL <<
"Weaken dependencies of " << *iter << endl;
701 queue_push( &(_jobQueue), SOLVER_WEAKENDEPS | SOLVER_SOLVABLE );
702 queue_push( &(_jobQueue),
id );
707 queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
709 queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
716 const auto & trackedLocaleIds( myPool().trackedLocaleIds() );
719 for (
const auto & locale : trackedLocaleIds.added() )
721 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
725 for (
const auto & locale : trackedLocaleIds.removed() )
727 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | SOLVER_CLEANDEPS );
733 for (
const sat::Solvable & solv : myPool().multiversionList() )
735 queue_push( &(_jobQueue), SOLVER_NOOBSOLETES | SOLVER_SOLVABLE );
736 queue_push( &(_jobQueue), solv.id() );
739 ::pool_add_userinstalled_jobs(_satPool,
sat::Pool::instance().autoInstalled(), &(_jobQueue), GET_USERINSTALLED_NAMES|GET_USERINSTALLED_INVERTED);
743SATResolver::solverEnd()
748 solver_free(_satSolver);
750 queue_free( &(_jobQueue) );
758 const PoolItemList & weakItems,
759 const std::set<Repository> & upgradeRepos)
761 MIL <<
"SATResolver::resolvePool()" << endl;
764 solverInit(weakItems);
766 for (PoolItemList::const_iterator iter = _items_to_install.begin(); iter != _items_to_install.end(); iter++) {
767 Id
id = (*iter)->satSolvable().id();
769 ERR <<
"Install: " << *iter <<
" not found" << endl;
771 MIL <<
"Install " << *iter << endl;
772 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
773 queue_push( &(_jobQueue),
id );
777 for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) {
778 Id
id = (*iter)->satSolvable().id();
780 ERR <<
"Delete: " << *iter <<
" not found" << endl;
782 MIL <<
"Delete " << *iter << endl;
783 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE |
MAYBE_CLEANDEPS );
784 queue_push( &(_jobQueue),
id);
788 for_( iter, upgradeRepos.begin(), upgradeRepos.end() )
790 queue_push( &(_jobQueue), SOLVER_DISTUPGRADE | SOLVER_SOLVABLE_REPO );
791 queue_push( &(_jobQueue), iter->get()->repoid );
792 MIL <<
"Upgrade repo " << *iter << endl;
795 for (CapabilitySet::const_iterator iter = requires_caps.begin(); iter != requires_caps.end(); iter++) {
796 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
797 queue_push( &(_jobQueue), iter->id() );
798 MIL <<
"Requires " << *iter << endl;
801 for (CapabilitySet::const_iterator iter = conflict_caps.begin(); iter != conflict_caps.end(); iter++) {
802 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES |
MAYBE_CLEANDEPS );
803 queue_push( &(_jobQueue), iter->id() );
804 MIL <<
"Conflicts " << *iter << endl;
808 setSystemRequirements();
814 bool ret = solving(requires_caps, conflict_caps);
816 (ret?
MIL:
WAR) <<
"SATResolver::resolvePool() done. Ret:" << ret << endl;
823 const PoolItemList & weakItems)
825 MIL <<
"SATResolver::resolvQueue()" << endl;
828 solverInit(weakItems);
831 for (SolverQueueItemList::const_iterator iter = requestQueue.begin(); iter != requestQueue.end(); iter++) {
832 (*iter)->addRule(_jobQueue);
836 for (PoolItemList::const_iterator iter = _items_to_install.begin(); iter != _items_to_install.end(); iter++) {
837 Id
id = (*iter)->satSolvable().id();
839 ERR <<
"Install: " << *iter <<
" not found" << endl;
841 MIL <<
"Install " << *iter << endl;
842 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
843 queue_push( &(_jobQueue),
id );
846 for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) {
848 MIL <<
"Delete " << *iter << ident << endl;
849 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_NAME |
MAYBE_CLEANDEPS );
850 queue_push( &(_jobQueue), ident);
854 setSystemRequirements();
860 bool ret = solving();
862 MIL <<
"SATResolver::resolveQueue() done. Ret:" << ret << endl;
867void SATResolver::doUpdate()
869 MIL <<
"SATResolver::doUpdate()" << endl;
872 solverInit(PoolItemList());
875 setSystemRequirements();
881 queue_push( &(_jobQueue), SOLVER_VERIFY|SOLVER_SOLVABLE_ALL);
882 queue_push( &(_jobQueue), 0 );
885 queue_push( &(_jobQueue), SOLVER_UPDATE|SOLVER_SOLVABLE_ALL);
886 queue_push( &(_jobQueue), 0 );
889 queue_push( &(_jobQueue), SOLVER_DISTUPGRADE|SOLVER_SOLVABLE_ALL);
890 queue_push( &(_jobQueue), 0 );
892 if (_distupgrade_removeunsupported) {
893 queue_push( &(_jobQueue), SOLVER_DROP_ORPHANED|SOLVER_SOLVABLE_ALL);
894 queue_push( &(_jobQueue), 0 );
896 solverSetFocus( *_satSolver, _focus );
897 solver_set_flag(_satSolver, SOLVER_FLAG_ADD_ALREADY_RECOMMENDED, !_ignorealreadyrecommended);
898 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_DOWNGRADE, _allowdowngrade);
899 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_NAMECHANGE, _allownamechange);
900 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_ARCHCHANGE, _allowarchchange);
902 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_UNINSTALL, _allowuninstall);
903 solver_set_flag(_satSolver, SOLVER_FLAG_NO_UPDATEPROVIDE, _noupdateprovide);
904 solver_set_flag(_satSolver, SOLVER_FLAG_SPLITPROVIDES, _dosplitprovides);
905 solver_set_flag(_satSolver, SOLVER_FLAG_IGNORE_RECOMMENDED,
false);
906 solver_set_flag(_satSolver, SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED, _onlyRequires);
911 MIL <<
"Starting solving for update...." << endl;
913 solver_solve( _satSolver, &(_jobQueue) );
914 MIL <<
"....Solver end" << endl;
921 queue_init(&decisionq);
922 solver_get_decisionqueue(_satSolver, &decisionq);
923 for (
int i = 0; i < decisionq.count; i++)
925 Id p = decisionq.elements[i];
930 if ( ! solv || solv.isSystem() )
935 queue_free(&decisionq);
938 if ( _satSolver->pool->installed ) {
939 for (
int i = _satSolver->pool->installed->start; i < _satSolver->pool->installed->start + _satSolver->pool->installed->nsolvables; i++)
941 if (solver_get_decisionlevel(_satSolver, i) > 0)
944 PoolItem poolItem( _pool.find( sat::Solvable(i) ) );
947 CheckIfUpdate info( (sat::Solvable(i)) );
949 _pool.byIdentEnd( poolItem ),
950 resfilter::ByUninstalled(),
951 functor::functorRef<bool,PoolItem> (info) );
953 if (info.is_updated) {
959 ERR <<
"id " << i <<
" not found in ZYPP pool." << endl;
966 solverCopyBackWeak( *_satSolver, _problem_items );
967 solverCopyBackValidate( *_satSolver, _pool );
969 MIL <<
"SATResolver::doUpdate() done" << endl;
989 : problemSolution (p)
996 problemSolution->addSingleAction (p, action);
1029std::vector<std::string> SATResolver::SATgetCompleteProblemInfoStrings ( Id problem )
1031 std::vector<std::string> ret;
1032 sat::Queue problems;
1033 solver_findallproblemrules( _satSolver, problem, problems );
1039 SolverRuleinfo ruleClass = solver_ruleclass( _satSolver, problems[i]);
1040 if ( ruleClass != SolverRuleinfo::SOLVER_RULE_UPDATE && ruleClass != SolverRuleinfo::SOLVER_RULE_JOB ) {
1046 SolverRuleinfo ruleClass = solver_ruleclass( _satSolver, problems[i]);
1047 if ( nobad && ( ruleClass == SolverRuleinfo::SOLVER_RULE_UPDATE || ruleClass == SolverRuleinfo::SOLVER_RULE_JOB ) ) {
1053 std::string pInfo = SATproblemRuleInfoString( problems[i], detail, ignore );
1056 if ( std::find( ret.begin(), ret.end(), pInfo ) == ret.end() )
1057 ret.push_back( pInfo );
1062std::string SATResolver::SATprobleminfoString(Id problem, std::string &detail, Id &ignoreId)
1066 Id probr = solver_findproblemrule(_satSolver, problem);
1067 return SATproblemRuleInfoString( probr, detail, ignoreId );
1070std::string SATResolver::SATproblemRuleInfoString (Id probr, std::string &detail, Id &ignoreId)
1074 Id dep, source, target;
1075 SolverRuleinfo type = solver_ruleinfo(_satSolver, probr, &source, &target, &dep);
1079 sat::Solvable s = mapSolvable( source );
1080 sat::Solvable s2 = mapSolvable( target );
1087 case SOLVER_RULE_DISTUPGRADE:
1089 ret = str::Format(
_(
"the installed %1% does not belong to a distupgrade repository and must be replaced") ) % s.asString();
1091 ret = str::Format(
_(
"the to be installed %1% does not belong to a distupgrade repository") ) % s.asString();
1093 case SOLVER_RULE_INFARCH:
1095 ret = str::Format(
_(
"the installed %1% has inferior architecture") ) % s.asString();
1097 ret = str::Format(
_(
"the to be installed %1% has inferior architecture") ) % s.asString();
1099 case SOLVER_RULE_UPDATE:
1100 ret = str::Format(
_(
"problem with the installed %1%") ) % s.asString();
1102 case SOLVER_RULE_JOB:
1103 ret =
_(
"conflicting requests");
1105 case SOLVER_RULE_PKG:
1106 ret =
_(
"some dependency problem");
1108 case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
1109 ret = str::Format(
_(
"nothing provides the requested '%1%'") ) % pool_dep2str(pool, dep);
1110 detail +=
_(
"Have you enabled all the required repositories?");
1112 case SOLVER_RULE_JOB_UNKNOWN_PACKAGE:
1113 ret = str::Format(
_(
"the requested package %1% does not exist") ) % pool_dep2str(pool, dep);
1114 detail +=
_(
"Have you enabled all the required repositories?");
1116 case SOLVER_RULE_JOB_UNSUPPORTED:
1117 ret =
_(
"unsupported request");
1119 case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
1120 ret = str::Format(
_(
"'%1%' is provided by the system and cannot be erased") ) % pool_dep2str(pool, dep);
1122 case SOLVER_RULE_PKG_NOT_INSTALLABLE:
1123 ret = str::Format(
_(
"%1% is not installable") ) % s.asString();
1125 case SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP:
1128 ret = str::Format(
_(
"nothing provides '%1%' needed by the installed %2%") ) % pool_dep2str(pool, dep) % s.asString();
1130 ret = str::Format(
_(
"nothing provides '%1%' needed by the to be installed %2%") ) % pool_dep2str(pool, dep) % s.asString();
1132 case SOLVER_RULE_PKG_SAME_NAME:
1133 ret = str::Format(
_(
"cannot install both %1% and %2%") ) % s.asString() % s2.asString();
1135 case SOLVER_RULE_PKG_CONFLICTS:
1136 if ( s.isSystem() ) {
1137 if ( s2.isSystem() )
1138 ret = str::Format(
_(
"the installed %1% conflicts with '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1140 ret = str::Format(
_(
"the installed %1% conflicts with '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1143 if ( s2.isSystem() )
1144 ret = str::Format(
_(
"the to be installed %1% conflicts with '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1146 ret = str::Format(
_(
"the to be installed %1% conflicts with '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1149 case SOLVER_RULE_PKG_OBSOLETES:
1150 case SOLVER_RULE_PKG_INSTALLED_OBSOLETES:
1151 if ( s.isSystem() ) {
1152 if ( s2.isSystem() )
1153 ret = str::Format(
_(
"the installed %1% obsoletes '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1155 ret = str::Format(
_(
"the installed %1% obsoletes '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1158 if ( s2.isSystem() )
1159 ret = str::Format(
_(
"the to be installed %1% obsoletes '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1161 ret = str::Format(
_(
"the to be installed %1% obsoletes '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1164 case SOLVER_RULE_PKG_SELF_CONFLICT:
1166 ret = str::Format(
_(
"the installed %1% conflicts with '%2%' provided by itself") ) % s.asString() % pool_dep2str(pool, dep);
1168 ret = str::Format(
_(
"the to be installed %1% conflicts with '%2%' provided by itself") ) % s.asString() % pool_dep2str(pool, dep);
1170 case SOLVER_RULE_PKG_REQUIRES: {
1172 Capability cap(dep);
1173 sat::WhatProvides possibleProviders(cap);
1176 typedef std::list<PoolItem> ProviderList;
1177 ProviderList providerlistInstalled, providerlistUninstalled;
1178 for_( iter1, possibleProviders.begin(), possibleProviders.end() ) {
1182 for_( iter2, possibleProviders.begin(), possibleProviders.end() ) {
1185 && ( (provider1.status().isInstalled() && provider2.status().isUninstalled())
1186 || (provider2.status().isInstalled() && provider1.status().isUninstalled()) )) {
1192 if (provider1.status().isInstalled())
1193 providerlistInstalled.push_back(provider1);
1195 providerlistUninstalled.push_back(provider1);
1200 ret = str::Format(
_(
"the installed %1% requires '%2%', but this requirement cannot be provided") ) % s.
asString() % pool_dep2str(pool, dep);
1202 ret = str::Format(
_(
"the to be installed %1% requires '%2%', but this requirement cannot be provided") ) % s.asString() % pool_dep2str(pool, dep);
1203 if (providerlistInstalled.size() > 0) {
1204 detail +=
_(
"deleted providers: ");
1205 for (ProviderList::const_iterator iter = providerlistInstalled.begin(); iter != providerlistInstalled.end(); iter++) {
1206 if (iter == providerlistInstalled.begin())
1212 if (providerlistUninstalled.size() > 0) {
1213 if (detail.size() > 0)
1214 detail +=
_(
"\nnot installable providers: ");
1216 detail =
_(
"not installable providers: ");
1217 for (ProviderList::const_iterator iter = providerlistUninstalled.begin(); iter != providerlistUninstalled.end(); iter++) {
1218 if (iter == providerlistUninstalled.begin())
1227 DBG <<
"Unknown rule type(" << type <<
") going to query libsolv for rule information." << endl;
1228 ret =
str::asString( ::solver_problemruleinfo2str( _satSolver, type,
static_cast<Id
>(s.id()),
static_cast<Id
>(s2.id()), dep ) );
1236SATResolver::problems ()
1239 if (_satSolver && solver_problem_count(_satSolver)) {
1243 Id problem, solution, element;
1244 sat::Solvable s, sd;
1246 CapabilitySet system_requires = SystemCheck::instance().requiredSystemCap();
1247 CapabilitySet system_conflicts = SystemCheck::instance().conflictSystemCap();
1249 MIL <<
"Encountered problems! Here are the solutions:\n" << endl;
1252 while ((problem = solver_next_problem(_satSolver, problem)) != 0) {
1253 MIL <<
"Problem " << pcnt++ <<
":" << endl;
1254 MIL <<
"====================================" << endl;
1257 std::string whatString = SATprobleminfoString (problem,detail,ignoreId);
1258 MIL << whatString << endl;
1259 MIL <<
"------------------------------------" << endl;
1260 ResolverProblem_Ptr resolverProblem =
new ResolverProblem (whatString, detail, SATgetCompleteProblemInfoStrings( problem ));
1263 while ((solution = solver_next_solution(_satSolver, problem, solution)) != 0) {
1265 ProblemSolutionCombi *problemSolution =
new ProblemSolutionCombi;
1266 while ((element = solver_next_solutionelement(_satSolver, problem, solution, element, &p, &rp)) != 0) {
1267 if (p == SOLVER_SOLUTION_JOB) {
1269 what = _jobQueue.elements[rp];
1270 switch (_jobQueue.elements[rp-1]&(SOLVER_SELECTMASK|SOLVER_JOBMASK))
1272 case SOLVER_INSTALL | SOLVER_SOLVABLE: {
1273 s = mapSolvable (what);
1274 PoolItem poolItem = _pool.find (s);
1276 if (pool->installed && s.get()->repo == pool->installed) {
1277 problemSolution->addSingleAction (poolItem, REMOVE);
1278 std::string description = str::Format(
_(
"remove lock to allow removal of %1%") ) % s.asString();
1279 MIL << description << endl;
1280 problemSolution->addDescription (description);
1282 problemSolution->addSingleAction (poolItem, KEEP);
1283 std::string description = str::Format(
_(
"do not install %1%") ) % s.asString();
1284 MIL << description << endl;
1285 problemSolution->addDescription (description);
1288 ERR <<
"SOLVER_INSTALL_SOLVABLE: No item found for " << s.asString() << endl;
1292 case SOLVER_ERASE | SOLVER_SOLVABLE: {
1293 s = mapSolvable (what);
1294 PoolItem poolItem = _pool.find (s);
1296 if (pool->installed && s.get()->repo == pool->installed) {
1297 problemSolution->addSingleAction (poolItem, KEEP);
1298 std::string description = str::Format(
_(
"keep %1%") ) % s.asString();
1299 MIL << description << endl;
1300 problemSolution->addDescription (description);
1302 problemSolution->addSingleAction (poolItem, UNLOCK);
1303 std::string description = str::Format(
_(
"remove lock to allow installation of %1%") ) %
itemToString( poolItem );
1304 MIL << description << endl;
1305 problemSolution->addDescription (description);
1308 ERR <<
"SOLVER_ERASE_SOLVABLE: No item found for " << s.asString() << endl;
1312 case SOLVER_INSTALL | SOLVER_SOLVABLE_NAME:
1314 IdString ident( what );
1315 SolverQueueItemInstall_Ptr install =
1316 new SolverQueueItemInstall(_pool, ident.asString(),
false );
1317 problemSolution->addSingleAction (install, REMOVE_SOLVE_QUEUE_ITEM);
1319 std::string description = str::Format(
_(
"do not install %1%") ) % ident;
1320 MIL << description << endl;
1321 problemSolution->addDescription (description);
1324 case SOLVER_ERASE | SOLVER_SOLVABLE_NAME:
1328 IdString ident( what );
1329 FindPackage info (problemSolution, KEEP);
1331 _pool.byIdentEnd( ident ),
1333 resfilter::ByTransact ()),
1334 functor::functorRef<bool,PoolItem> (info) );
1336 SolverQueueItemDelete_Ptr del =
1337 new SolverQueueItemDelete(_pool, ident.asString(),
false );
1338 problemSolution->addSingleAction (del, REMOVE_SOLVE_QUEUE_ITEM);
1340 std::string description = str::Format(
_(
"keep %1%") ) % ident;
1341 MIL << description << endl;
1342 problemSolution->addDescription (description);
1345 case SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES:
1347 problemSolution->addSingleAction (Capability(what), REMOVE_EXTRA_REQUIRE);
1348 std::string description =
"";
1351 if (system_requires.find(Capability(what)) != system_requires.end()) {
1353 resolverProblem->setDetails( resolverProblem->description() +
"\n" + resolverProblem->details() );
1354 resolverProblem->setDescription(
_(
"This request will break your system!"));
1355 description =
_(
"ignore the warning of a broken system");
1356 description += std::string(
" (requires:")+pool_dep2str(pool, what)+
")";
1357 MIL << description << endl;
1358 problemSolution->addFrontDescription (description);
1360 description = str::Format(
_(
"do not ask to install a solvable providing %1%") ) % pool_dep2str(pool, what);
1361 MIL << description << endl;
1362 problemSolution->addDescription (description);
1366 case SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES:
1368 problemSolution->addSingleAction (Capability(what), REMOVE_EXTRA_CONFLICT);
1369 std::string description =
"";
1372 if (system_conflicts.find(Capability(what)) != system_conflicts.end()) {
1374 resolverProblem->setDetails( resolverProblem->description() +
"\n" + resolverProblem->details() );
1375 resolverProblem->setDescription(
_(
"This request will break your system!"));
1376 description =
_(
"ignore the warning of a broken system");
1377 description += std::string(
" (conflicts:")+pool_dep2str(pool, what)+
")";
1378 MIL << description << endl;
1379 problemSolution->addFrontDescription (description);
1382 description = str::Format(
_(
"do not ask to delete all solvables providing %1%") ) % pool_dep2str(pool, what);
1383 MIL << description << endl;
1384 problemSolution->addDescription (description);
1388 case SOLVER_UPDATE | SOLVER_SOLVABLE:
1390 s = mapSolvable (what);
1391 PoolItem poolItem = _pool.find (s);
1393 if (pool->installed && s.get()->repo == pool->installed) {
1394 problemSolution->addSingleAction (poolItem, KEEP);
1395 std::string description = str::Format(
_(
"do not install most recent version of %1%") ) % s.asString();
1396 MIL << description << endl;
1397 problemSolution->addDescription (description);
1399 ERR <<
"SOLVER_INSTALL_SOLVABLE_UPDATE " << poolItem <<
" is not selected for installation" << endl;
1402 ERR <<
"SOLVER_INSTALL_SOLVABLE_UPDATE: No item found for " << s.asString() << endl;
1407 MIL <<
"- do something different" << endl;
1408 ERR <<
"No valid solution available" << endl;
1411 }
else if (p == SOLVER_SOLUTION_INFARCH) {
1412 s = mapSolvable (rp);
1413 PoolItem poolItem = _pool.find (s);
1414 if (pool->installed && s.get()->repo == pool->installed) {
1415 problemSolution->addSingleAction (poolItem, LOCK);
1416 std::string description = str::Format(
_(
"keep %1% despite the inferior architecture") ) % s.asString();
1417 MIL << description << endl;
1418 problemSolution->addDescription (description);
1420 problemSolution->addSingleAction (poolItem, INSTALL);
1421 std::string description = str::Format(
_(
"install %1% despite the inferior architecture") ) % s.asString();
1422 MIL << description << endl;
1423 problemSolution->addDescription (description);
1425 }
else if (p == SOLVER_SOLUTION_DISTUPGRADE) {
1426 s = mapSolvable (rp);
1427 PoolItem poolItem = _pool.find (s);
1428 if (pool->installed && s.get()->repo == pool->installed) {
1429 problemSolution->addSingleAction (poolItem, LOCK);
1430 std::string description = str::Format(
_(
"keep obsolete %1%") ) % s.asString();
1431 MIL << description << endl;
1432 problemSolution->addDescription (description);
1434 problemSolution->addSingleAction (poolItem, INSTALL);
1435 std::string description = str::Format(
_(
"install %1% from excluded repository") ) % s.asString();
1436 MIL << description << endl;
1437 problemSolution->addDescription (description);
1439 }
else if ( p == SOLVER_SOLUTION_BLACK ) {
1442 s = mapSolvable (rp);
1443 PoolItem poolItem = _pool.find (s);
1445 problemSolution->addSingleAction (poolItem, INSTALL);
1446 std::string description;
1447 if ( s.isRetracted() ) {
1449 description = str::Format(
_(
"install %1% although it has been retracted")) % s.asString();
1450 }
else if ( s.isPtf() ) {
1452 description = str::Format(
_(
"allow to install the PTF %1%")) % s.asString();
1455 description = str::Format(
_(
"install %1% although it is blacklisted")) % s.asString();
1457 MIL << description << endl;
1458 problemSolution->addDescription( description );
1459 }
else if ( p > 0 ) {
1461 s = mapSolvable (p);
1462 PoolItem itemFrom = _pool.find (s);
1467 sd = mapSolvable (rp);
1468 PoolItem itemTo = _pool.find (sd);
1469 if (itemFrom && itemTo) {
1470 problemSolution->addSingleAction (itemTo, INSTALL);
1471 int illegal = policy_is_illegal(_satSolver, s.get(), sd.get(), 0);
1473 if ((illegal & POLICY_ILLEGAL_DOWNGRADE) != 0)
1475 std::string description = str::Format(
_(
"downgrade of %1% to %2%") ) % s.asString() % sd.asString();
1476 MIL << description << endl;
1477 problemSolution->addDescription (description);
1480 if ((illegal & POLICY_ILLEGAL_ARCHCHANGE) != 0)
1482 std::string description = str::Format(
_(
"architecture change of %1% to %2%") ) % s.asString() % sd.asString();
1483 MIL << description << endl;
1484 problemSolution->addDescription (description);
1487 if ((illegal & POLICY_ILLEGAL_VENDORCHANGE) != 0)
1489 IdString s_vendor( s.vendor() );
1490 IdString sd_vendor( sd.vendor() );
1491 std::string description;
1493 description = str::Format(
_(
"install %1% (with vendor change)\n %2% --> %3%") )
1495 % ( s_vendor ? s_vendor.c_str() :
" (no vendor) " )
1496 % ( sd_vendor ? sd_vendor.c_str() :
" (no vendor) " );
1498 description = str::Format(
_(
"install %1% from vendor %2%\n replacing %3% from vendor %4%") )
1499 % sd.asString() % ( sd_vendor ? sd_vendor.c_str() :
" (no vendor) " )
1500 % s.asString() % ( s_vendor ? s_vendor.c_str() :
" (no vendor) " );
1502 MIL << description << endl;
1503 problemSolution->addDescription (description);
1507 std::string description = str::Format(
_(
"replacement of %1% with %2%") ) % s.asString() % sd.asString();
1508 MIL << description << endl;
1509 problemSolution->addDescription (description);
1512 ERR << s.asString() <<
" or " << sd.asString() <<
" not found" << endl;
1518 std::string description = str::Format(
_(
"deinstallation of %1%") ) % s.asString();
1519 MIL << description << endl;
1520 problemSolution->addDescription (description);
1521 problemSolution->addSingleAction (itemFrom, REMOVE);
1527 INT <<
"Unknown solution " << p << endl;
1531 resolverProblem->addSolution (problemSolution,
1532 problemSolution->actionCount() > 1 ?
true :
false);
1533 MIL <<
"------------------------------------" << endl;
1538 PoolItem item = _pool.find (sat::Solvable(ignoreId));
1539 ProblemSolutionIgnore *problemSolution =
new ProblemSolutionIgnore(item);
1540 resolverProblem->addSolution (problemSolution,
1542 MIL <<
"ignore some dependencies of " << item << endl;
1543 MIL <<
"------------------------------------" << endl;
1547 resolverProblems.push_back (resolverProblem);
1550 return resolverProblems;
1554{ Resolver( _pool ).applySolutions( solutions ); }
1556void SATResolver::setLocks()
1561 for (PoolItemList::const_iterator iter = _items_to_lock.begin(); iter != _items_to_lock.end(); ++iter) {
1563 if (iter->status().isInstalled()) {
1565 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
1566 queue_push( &(_jobQueue), ident );
1569 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE |
MAYBE_CLEANDEPS );
1570 queue_push( &(_jobQueue), ident );
1573 MIL <<
"Locked " << icnt <<
" installed items and " << acnt <<
" NOT installed items." << endl;
1579 std::set<IdString> unifiedByName;
1580 for (PoolItemList::const_iterator iter = _items_to_keep.begin(); iter != _items_to_keep.end(); ++iter) {
1581 IdString ident( (*iter)->satSolvable().ident() );
1582 if ( unifiedByName.insert( ident ).second )
1586 MIL <<
"Keep NOT installed name " << ident <<
" (" << *iter <<
")" << endl;
1587 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_NAME | SOLVER_WEAK |
MAYBE_CLEANDEPS );
1588 queue_push( &(_jobQueue), ident.id() );
1594void SATResolver::setSystemRequirements()
1596 CapabilitySet system_requires = SystemCheck::instance().requiredSystemCap();
1597 CapabilitySet system_conflicts = SystemCheck::instance().conflictSystemCap();
1599 for (CapabilitySet::const_iterator iter = system_requires.begin(); iter != system_requires.end(); ++iter) {
1600 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
1601 queue_push( &(_jobQueue), iter->id() );
1602 MIL <<
"SYSTEM Requires " << *iter << endl;
1605 for (CapabilitySet::const_iterator iter = system_conflicts.begin(); iter != system_conflicts.end(); ++iter) {
1606 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES |
MAYBE_CLEANDEPS );
1607 queue_push( &(_jobQueue), iter->id() );
1608 MIL <<
"SYSTEM Conflicts " << *iter << endl;
1616 IdString rpm(
"rpm" );
1617 for_( it, pool.byIdentBegin(rpm), pool.byIdentEnd(rpm) )
1619 if ( (*it)->isSystem() )
1622 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_NAME | SOLVER_ESSENTIAL );
1623 queue_push( &(_jobQueue), archrule.id() );
1634 ::solver_get_userinstalled( _satSolver, ret, GET_USERINSTALLED_NAMES|GET_USERINSTALLED_INVERTED );
1642 ::solver_get_userinstalled( _satSolver, ret, GET_USERINSTALLED_NAMES );
Reference counted access to a Tp object calling a custom Dispose function when the last AutoDispose h...
Access to the sat-pools string space.
Combining sat::Solvable and ResStatus.
ResStatus & status() const
Returns the current status.
sat::Solvable buddy() const
Return the buddy we share our status object with.
std::string alias() const
Short unique string to identify a repo.
PoolItem find(const sat::Solvable &slv_r) const
Return the corresponding PoolItem.
static ResPool instance()
Singleton ctor.
static const ResStatus toBeInstalled
bool setToBeUninstalled(TransactByValue causer)
bool isToBeInstalled() const
bool setToBeInstalled(TransactByValue causer)
TransactValue getTransactValue() const
static const ResStatus toBeUninstalledDueToUpgrade
static const ResStatus toBeUninstalled
bool isToBeUninstalled() const
bool isToBeUninstalledDueToUpgrade() const
bool resetTransact(TransactByValue causer_r)
Not the same as setTransact( false ).
bool setToBeUninstalledDueToUpgrade(TransactByValue causer)
bool isUninstalled() const
bool equivalent(const Vendor &lVendor, const Vendor &rVendor) const
Return whether two vendor strings should be treated as the same vendor.
bool relaxedEquivalent(const Vendor &lVendor, const Vendor &rVendor) const
Like equivalent but always unifies suse and openSUSE vendor.
static const VendorAttr & instance()
(Pseudo)Singleton, mapped to the current Target::vendorAttr settings or to noTargetInstance.
static ZConfig & instance()
Singleton ctor.
static Pool instance()
Singleton ctor.
void prepare() const
Update housekeeping data if necessary (e.g.
detail::CPool * get() const
Expert backdoor.
Libsolv Id queue wrapper.
void push(value_type val_r)
Push a value to the end off the Queue.
A Solvable object within the sat Pool.
std::string asString() const
String representation "ident-edition.arch" or "noSolvable".
static const IdString ptfMasterToken
Indicator provides ptf()
bool isSystem() const
Return whether this Solvable belongs to the system repo.
static const IdString retractedToken
Indicator provides retracted-patch-package()
bool isKind(const ResKind &kind_r) const
Test whether a Solvable is of a certain ResKind.
Repository repository() const
The Repository this Solvable belongs to.
bool operator()(const PoolItem &item)
CheckIfUpdate(const sat::Solvable &installed_r)
static Ptr get(const pool::ByIdent &ident_r)
Get the Selctable.
std::ostream & dumpOn(std::ostream &str, const zypp::shared_ptr< void > &obj)
Chain< TACondition, TBCondition > chain(TACondition conda_r, TBCondition condb_r)
Convenience function for creating a Chain from two conditions conda_r and condb_r.
std::unary_function< PoolItem, bool > PoolItemFilterFunctor
std::unary_function< ResObject::constPtr, bool > ResObjectFilterFunctor
typedef::s_Solver CSolver
Wrapped libsolv C data type exposed as backdoor.
int IdType
Generic Id type.
typedef::s_Pool CPool
Wrapped libsolv C data type exposed as backdoor.
unsigned SolvableIdType
Id type to connect Solvable and sat-solvable.
bool compareByNVR(const SolvableType< Derived > &lhs, const Solvable &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Queue SolvableQueue
Queue with Solvable ids.
Queue StringQueue
Queue with String ids.
bool sameNVRA(const SolvableType< Derived > &lhs, const Solvable &rhs)
This is an overloaded member function, provided for convenience. It differs from the above function o...
static void SATSolutionToPool(PoolItem item, const ResStatus &status, const ResStatus::TransactByValue causer)
int vendorCheck(sat::detail::CPool *pool, Solvable *solvable1, Solvable *solvable2)
sat::Solvable mapBuddy(sat::Solvable item_r)
void establish(sat::Queue &pseudoItems_r, sat::Queue &pseudoFlags_r)
ResPool helper to compute the initial status of Patches etc.
int relaxedVendorCheck(sat::detail::CPool *pool, Solvable *solvable1, Solvable *solvable2)
IMPL_PTR_TYPE(SATResolver)
std::list< SolverQueueItem_Ptr > SolverQueueItemList
std::string itemToString(const PoolItem &item)
const std::string & asString(const std::string &t)
Global asString() that works with std::string too.
bool isPseudoInstalled(ResKind kind_r)
Those are denoted to be installed, if the solver verifies them as being satisfied.
Easy-to use interface to the ZYPP dependency resolver.
std::unordered_set< Capability > CapabilitySet
@ language
language support
ResolverFocus
The resolvers general attitude.
@ Update
Focus on updating requested packages and their dependencies as much as possible.
@ Default
Request the standard behavior (as defined in zypp.conf or 'Job')
@ Installed
Focus on applying as little changes to the installed packages as needed.
@ Job
Focus on installing the best version of the requested packages.
std::list< ResolverProblem_Ptr > ResolverProblemList
std::list< ProblemSolution_Ptr > ProblemSolutionList
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.
bool isKind(const ResKind &kind_r) const
Solvable satSolvable() const
Return the corresponding sat::Solvable.
std::string asString() const
bool multiversionInstall() const
bool operator()(PoolItem p)
FindPackage(ProblemSolutionCombi *p, const TransactionKind act)
ProblemSolutionCombi * problemSolution
Commit helper functor distributing PoolItem by status into lists.
PoolItemList & _items_to_lock
SATCollectTransact(PoolItemList &items_to_install_r, PoolItemList &items_to_remove_r, PoolItemList &items_to_lock_r, PoolItemList &items_to_keep_r, bool solveSrcPackages_r)
PoolItemList & _items_to_install
PoolItemList & _items_to_remove
PoolItemList & _items_to_keep
bool operator()(const PoolItem &item_r)
#define for_(IT, BEG, END)
Convenient for-loops using iterator.