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>
57#define XDEBUG(x) do { if (base::logger::isExcessive()) XXX << x << std::endl;} while (0)
59#undef ZYPP_BASE_LOGGER_LOGGROUP
60#define ZYPP_BASE_LOGGER_LOGGROUP "zypp::solver"
81 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_INSTALLED, 0 );
82 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_BEST, 0 );
85 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_INSTALLED, 1 );
86 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_BEST, 0 );
89 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_INSTALLED, 0 );
90 solver_set_flag( &satSolver_r, SOLVER_FLAG_FOCUS_BEST, 1 );
98 inline sat::Queue collectPseudoInstalled(
const ResPool & pool_r )
101 for (
const PoolItem & pi : pool_r )
109 inline void solverCopyBackWeak(
sat::detail::CSolver & satSolver_r, PoolItemList & orphanedItems_r )
113 sat::Queue recommendations;
114 sat::Queue suggestions;
115 ::solver_get_recommendations( &satSolver_r, recommendations, suggestions, 0 );
117 PoolItem(sat::Solvable(recommendations[i])).status().setRecommended(
true );
119 PoolItem(sat::Solvable(suggestions[i])).status().setSuggested(
true );
122 orphanedItems_r.clear();
124 ::solver_get_orphaned( &satSolver_r, orphaned );
127 PoolItem pi { sat::Solvable(orphaned[i]) };
128 pi.status().setOrphaned(
true );
129 orphanedItems_r.push_back( pi );
134 ::solver_get_unneeded( &satSolver_r, unneeded, 1 );
136 PoolItem(sat::Solvable(unneeded[i])).status().setUnneeded(
true );
141 inline void solverCopyBackValidate(
sat::detail::CSolver & satSolver_r,
const ResPool & pool_r )
143 sat::Queue pseudoItems { collectPseudoInstalled( pool_r ) };
144 if ( ! pseudoItems.empty() )
146 sat::Queue pseudoFlags;
147 ::solver_trivial_installable( &satSolver_r, pseudoItems, pseudoFlags );
151 PoolItem pi { sat::Solvable(pseudoItems[i]) };
152 switch ( pseudoFlags[i] )
154 case 0: pi.status().setBroken();
break;
155 case 1: pi.status().setSatisfied();
break;
156 case -1: pi.status().setNonRelevant();
break;
157 default: pi.status().setUndetermined();
break;
170#define MAYBE_CLEANDEPS (cleandepsOnRemove()?SOLVER_CLEANDEPS:0)
189 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();
247SATResolver::dumpOn( std::ostream & os )
const
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( ONLY_NAMESPACE_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 )
297 , _allowvendorchange ( ZConfig::instance().solver_allowVendorChange() )
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)
306 , _dup_allowdowngrade ( ZConfig::instance().solver_dupAllowDowngrade() )
307 , _dup_allownamechange ( ZConfig::instance().solver_dupAllowNameChange() )
308 , _dup_allowarchchange ( ZConfig::instance().solver_dupAllowArchChange() )
309 , _dup_allowvendorchange ( ZConfig::instance().solver_dupAllowVendorChange() )
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();
412 case ResStatus::TRANSACT:
413 itemStatus.
isUninstalled() ? _items_to_install.push_back( item_r )
414 : _items_to_remove.push_back( item_r );
break;
415 case ResStatus::LOCKED: _items_to_lock.push_back( item_r );
break;
416 case ResStatus::KEEP_STATE: _items_to_keep.push_back( item_r );
break;
432SATResolver::solverEnd()
437 solver_free(_satSolver);
439 queue_free( &(_jobQueue) );
444SATResolver::solverInit(
const PoolItemList & weakItems)
446 MIL <<
"SATResolver::solverInit()" << endl;
450 _satSolver = solver_create( _satPool );
451 queue_init( &_jobQueue );
456 bool toRelax =
false;
457 if ( _distupgrade ) {
459 if ( ! solv.isSystem() ) {
460 MIL <<
"Relaxed vendor check requested by " << solv << endl;
466 ::pool_set_custom_vendorcheck( _satPool, toRelax ? &relaxedVendorCheck : &vendorCheck );
470 ::pool_add_userinstalled_jobs(_satPool,
sat::Pool::instance().autoInstalled(), &(_jobQueue), GET_USERINSTALLED_NAMES|GET_USERINSTALLED_INVERTED);
475 SATCollectTransact collector( _items_to_install, _items_to_remove, _items_to_lock, _items_to_keep, solveSrcPackages() );
476 invokeOnEach ( _pool.begin(), _pool.end(), std::ref( collector ) );
480 for (PoolItemList::const_iterator iter = weakItems.begin(); iter != weakItems.end(); iter++) {
483 ERR <<
"Weaken: " << *iter <<
" not found" << endl;
485 MIL <<
"Weaken dependencies of " << *iter << endl;
486 queue_push( &(_jobQueue), SOLVER_WEAKENDEPS | SOLVER_SOLVABLE );
487 queue_push( &(_jobQueue),
id );
492 queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
494 queue_push( &(_jobQueue), SOLVER_BLACKLIST|SOLVER_SOLVABLE_PROVIDES );
501 const auto & trackedLocaleIds( myPool().trackedLocaleIds() );
504 for (
const auto & locale : trackedLocaleIds.added() )
506 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
510 for (
const auto & locale : trackedLocaleIds.removed() )
512 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES | SOLVER_CLEANDEPS );
518 for (
const sat::Solvable & solv : myPool().multiversionList() )
520 queue_push( &(_jobQueue), SOLVER_NOOBSOLETES | SOLVER_SOLVABLE );
521 queue_push( &(_jobQueue), solv.id() );
530 if ( _protectPTFs ) {
531 for (
const auto & solv : sat::AllPTFs() ) {
532 if ( solv.isSystem() ) {
533 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
534 queue_push( &(_jobQueue), solv.id() );
541 solverInitSetSystemRequirements();
544 solverInitSetLocks();
547 solverInitSetModeJobsAndFlags();
550void SATResolver::solverInitSetSystemRequirements()
552 CapabilitySet system_requires = SystemCheck::instance().requiredSystemCap();
553 CapabilitySet system_conflicts = SystemCheck::instance().conflictSystemCap();
555 for (CapabilitySet::const_iterator iter = system_requires.begin(); iter != system_requires.end(); ++iter) {
556 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
557 queue_push( &(_jobQueue), iter->id() );
558 MIL <<
"SYSTEM Requires " << *iter << endl;
561 for (CapabilitySet::const_iterator iter = system_conflicts.begin(); iter != system_conflicts.end(); ++iter) {
562 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES |
MAYBE_CLEANDEPS );
563 queue_push( &(_jobQueue), iter->id() );
564 MIL <<
"SYSTEM Conflicts " << *iter << endl;
572 IdString rpm(
"rpm" );
573 for_( it, pool.byIdentBegin(rpm), pool.byIdentEnd(rpm) )
575 if ( (*it)->isSystem() )
578 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_NAME | SOLVER_ESSENTIAL );
579 queue_push( &(_jobQueue), archrule.id() );
586void SATResolver::solverInitSetLocks()
591 for (PoolItemList::const_iterator iter = _items_to_lock.begin(); iter != _items_to_lock.end(); ++iter) {
593 if (iter->status().isInstalled()) {
595 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
596 queue_push( &(_jobQueue),
id );
599 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE |
MAYBE_CLEANDEPS );
600 queue_push( &(_jobQueue),
id );
603 MIL <<
"Locked " << icnt <<
" installed items and " << acnt <<
" NOT installed items." << endl;
609 std::set<IdString> unifiedByName;
610 for (PoolItemList::const_iterator iter = _items_to_keep.begin(); iter != _items_to_keep.end(); ++iter) {
611 IdString ident( iter->ident() );
612 if ( unifiedByName.insert( ident ).second )
616 MIL <<
"Keep NOT installed name " << ident <<
" (" << *iter <<
")" << endl;
617 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_NAME | SOLVER_WEAK |
MAYBE_CLEANDEPS );
618 queue_push( &(_jobQueue), ident.id() );
624void SATResolver::solverInitSetModeJobsAndFlags()
627 queue_push( &(_jobQueue), SOLVER_VERIFY|SOLVER_SOLVABLE_ALL);
628 queue_push( &(_jobQueue), 0 );
631 queue_push( &(_jobQueue), SOLVER_UPDATE|SOLVER_SOLVABLE_ALL);
632 queue_push( &(_jobQueue), 0 );
635 queue_push( &(_jobQueue), SOLVER_DISTUPGRADE|SOLVER_SOLVABLE_ALL);
636 queue_push( &(_jobQueue), 0 );
638 if (_distupgrade_removeunsupported) {
639 queue_push( &(_jobQueue), SOLVER_DROP_ORPHANED|SOLVER_SOLVABLE_ALL);
640 queue_push( &(_jobQueue), 0 );
643 solverSetFocus( *_satSolver, _focus );
644 solver_set_flag(_satSolver, SOLVER_FLAG_ADD_ALREADY_RECOMMENDED, !_ignorealreadyrecommended);
645 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_DOWNGRADE, _allowdowngrade);
646 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_NAMECHANGE, _allownamechange);
647 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_ARCHCHANGE, _allowarchchange);
648 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_VENDORCHANGE, _allowvendorchange);
649 solver_set_flag(_satSolver, SOLVER_FLAG_ALLOW_UNINSTALL, _allowuninstall);
650 solver_set_flag(_satSolver, SOLVER_FLAG_NO_UPDATEPROVIDE, _noupdateprovide);
651 solver_set_flag(_satSolver, SOLVER_FLAG_SPLITPROVIDES, _dosplitprovides);
652 solver_set_flag(_satSolver, SOLVER_FLAG_IGNORE_RECOMMENDED,
false);
653 solver_set_flag(_satSolver, SOLVER_FLAG_ONLY_NAMESPACE_RECOMMENDED, _onlyRequires);
654 solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_DOWNGRADE, _dup_allowdowngrade );
655 solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_NAMECHANGE, _dup_allownamechange );
656 solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_ARCHCHANGE, _dup_allowarchchange );
657 solver_set_flag(_satSolver, SOLVER_FLAG_DUP_ALLOW_VENDORCHANGE, _dup_allowvendorchange );
673 : is_updated( false )
674 , _installed( installed_r )
701 MIL <<
"Starting solving...." << endl;
703 if ( solver_solve( _satSolver, &(_jobQueue) ) == 0 )
710 if ( _distupgrade_removeunsupported )
711 MIL <<
"Droplist processing not needed. RemoveUnsupported is On." << endl;
713 MIL <<
"Droplist processing is disabled in ZConfig." << endl;
716 bool resolve =
false;
717 MIL <<
"Checking droplists ..." << endl;
720 solver_get_decisionqueue( _satSolver, decisionq );
727 static const Capability productCap {
"product()" };
728 if ( slv && slv.provides().matches( productCap ) )
730 CapabilitySet droplist { slv.valuesOfNamespace(
"weakremover" ) };
731 MIL <<
"Droplist for " << slv <<
": size " << droplist.size() << endl;
732 if ( !droplist.empty() )
734 for (
const auto & cap : droplist )
736 queue_push( &_jobQueue, SOLVER_DROP_ORPHANED | SOLVER_SOLVABLE_NAME );
737 queue_push( &_jobQueue, cap.id() );
740 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
741 queue_push( &(_jobQueue),
id );
747 solver_solve( _satSolver, &(_jobQueue) );
751 MIL <<
"....Solver end" << endl;
755 _result_items_to_install.clear();
756 _result_items_to_remove.clear();
760 queue_init(&decisionq);
761 solver_get_decisionqueue(_satSolver, &decisionq);
762 for (
int i = 0; i < decisionq.count; ++i )
764 Id p = decisionq.elements[i];
769 if ( ! slv || slv.isSystem() )
772 PoolItem poolItem( slv );
774 _result_items_to_install.push_back( poolItem );
776 queue_free(&decisionq);
780 if ( systemRepo && ! systemRepo.solvablesEmpty() )
782 bool mustCheckObsoletes =
false;
783 for_( it, systemRepo.solvablesBegin(), systemRepo.solvablesEnd() )
785 if (solver_get_decisionlevel(_satSolver, it->id()) > 0)
789 CheckIfUpdate info( *it );
790 PoolItem poolItem( *it );
792 _pool.byIdentEnd( poolItem ),
793 resfilter::ByUninstalled(),
796 if (info.is_updated) {
800 if ( ! mustCheckObsoletes )
801 mustCheckObsoletes =
true;
803 _result_items_to_remove.push_back (poolItem);
805 if ( mustCheckObsoletes )
807 sat::WhatObsoletes obsoleted( _result_items_to_install.begin(), _result_items_to_install.end() );
808 for_( it, obsoleted.poolItemBegin(), obsoleted.poolItemEnd() )
810 ResStatus & status( it->status() );
812 if ( status.transacts() && ! status.isToBeUninstalledDueToUpgrade() )
813 status.setToBeUninstalledDueToObsolete();
820 solverCopyBackWeak( *_satSolver, _problem_items );
821 solverCopyBackValidate( *_satSolver, _pool );
826 for (CapabilitySet::const_iterator iter = requires_caps.begin(); iter != requires_caps.end(); iter++) {
827 sat::WhatProvides rpmProviders(*iter);
828 for_( iter2, rpmProviders.begin(), rpmProviders.end() ) {
829 PoolItem poolItem(*iter2);
830 if (poolItem.status().isToBeInstalled()) {
831 MIL <<
"User requirement " << *iter <<
" sets " << poolItem << endl;
836 for (CapabilitySet::const_iterator iter = conflict_caps.begin(); iter != conflict_caps.end(); iter++) {
837 sat::WhatProvides rpmProviders(*iter);
838 for_( iter2, rpmProviders.begin(), rpmProviders.end() ) {
839 PoolItem poolItem(*iter2);
840 if (poolItem.status().isToBeUninstalled()) {
841 MIL <<
"User conflict " << *iter <<
" sets " << poolItem << endl;
847 if (solver_problem_count(_satSolver) > 0 )
849 ERR <<
"Solverrun finished with an ERROR" << endl;
856void SATResolver::solverAddJobsFromPool()
858 for (PoolItemList::const_iterator iter = _items_to_install.begin(); iter != _items_to_install.end(); iter++) {
861 ERR <<
"Install: " << *iter <<
" not found" << endl;
863 MIL <<
"Install " << *iter << endl;
864 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE );
865 queue_push( &(_jobQueue),
id );
869 for (PoolItemList::const_iterator iter = _items_to_remove.begin(); iter != _items_to_remove.end(); iter++) {
872 ERR <<
"Delete: " << *iter <<
" not found" << endl;
874 MIL <<
"Delete " << *iter << endl;
875 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE |
MAYBE_CLEANDEPS );
876 queue_push( &(_jobQueue),
id);
883 for (CapabilitySet::const_iterator iter = requires_caps.begin(); iter != requires_caps.end(); iter++) {
884 queue_push( &(_jobQueue), SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES );
885 queue_push( &(_jobQueue), iter->id() );
886 MIL <<
"Requires " << *iter << endl;
889 for (CapabilitySet::const_iterator iter = conflict_caps.begin(); iter != conflict_caps.end(); iter++) {
890 queue_push( &(_jobQueue), SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES |
MAYBE_CLEANDEPS );
891 queue_push( &(_jobQueue), iter->id() );
892 MIL <<
"Conflicts " << *iter << endl;
899 const PoolItemList & weakItems,
900 const std::set<Repository> & upgradeRepos)
902 MIL <<
"SATResolver::resolvePool()" << endl;
905 solverInit(weakItems);
908 solverAddJobsFromPool();
909 solverAddJobsFromExtraQueues( requires_caps, conflict_caps );
911 for_( iter, upgradeRepos.begin(), upgradeRepos.end() )
913 queue_push( &(_jobQueue), SOLVER_DISTUPGRADE | SOLVER_SOLVABLE_REPO );
914 queue_push( &(_jobQueue), iter->get()->repoid );
915 MIL <<
"Upgrade repo " << *iter << endl;
919 bool ret = solving(requires_caps, conflict_caps);
921 (ret?
MIL:
WAR) <<
"SATResolver::resolvePool() done. Ret:" << ret << endl;
927SATResolver::resolveQueue(
const SolverQueueItemList &requestQueue,
928 const PoolItemList & weakItems)
930 MIL <<
"SATResolver::resolvQueue()" << endl;
933 solverInit(weakItems);
936 for (SolverQueueItemList::const_iterator iter = requestQueue.begin(); iter != requestQueue.end(); iter++) {
937 (*iter)->addRule(_jobQueue);
941 solverAddJobsFromPool();
944 bool ret = solving();
946 (ret?
MIL:
WAR) <<
"SATResolver::resolveQueue() done. Ret:" << ret << endl;
951void SATResolver::doUpdate()
953 MIL <<
"SATResolver::doUpdate()" << endl;
956 solverInit(PoolItemList());
966 MIL <<
"Starting solving for update...." << endl;
968 solver_solve( _satSolver, &(_jobQueue) );
969 MIL <<
"....Solver end" << endl;
976 queue_init(&decisionq);
977 solver_get_decisionqueue(_satSolver, &decisionq);
978 for (
int i = 0; i < decisionq.count; i++)
980 Id p = decisionq.elements[i];
985 if ( ! solv || solv.isSystem() )
990 queue_free(&decisionq);
993 if ( _satSolver->pool->installed ) {
994 for (
int i = _satSolver->pool->installed->start; i < _satSolver->pool->installed->start + _satSolver->pool->installed->nsolvables; i++)
996 if (solver_get_decisionlevel(_satSolver, i) > 0)
999 PoolItem poolItem( _pool.find( sat::Solvable(i) ) );
1002 CheckIfUpdate info( (sat::Solvable(i)) );
1004 _pool.byIdentEnd( poolItem ),
1005 resfilter::ByUninstalled(),
1008 if (info.is_updated) {
1014 ERR <<
"id " << i <<
" not found in ZYPP pool." << endl;
1021 solverCopyBackWeak( *_satSolver, _problem_items );
1022 solverCopyBackValidate( *_satSolver, _pool );
1024 MIL <<
"SATResolver::doUpdate() done" << endl;
1044 : problemSolution (p)
1051 problemSolution->addSingleAction (p, action);
1079{
return PoolItem( mapBuddy( item ) ); }
1084std::vector<std::string> SATResolver::SATgetCompleteProblemInfoStrings ( Id problem )
1086 std::vector<std::string> ret;
1087 sat::Queue problems;
1088 solver_findallproblemrules( _satSolver, problem, problems );
1094 SolverRuleinfo ruleClass = solver_ruleclass( _satSolver, problems[i]);
1095 if ( ruleClass != SolverRuleinfo::SOLVER_RULE_UPDATE && ruleClass != SolverRuleinfo::SOLVER_RULE_JOB ) {
1101 SolverRuleinfo ruleClass = solver_ruleclass( _satSolver, problems[i]);
1102 if ( nobad && ( ruleClass == SolverRuleinfo::SOLVER_RULE_UPDATE || ruleClass == SolverRuleinfo::SOLVER_RULE_JOB ) ) {
1108 std::string pInfo = SATproblemRuleInfoString( problems[i], detail, ignore );
1111 if ( std::find( ret.begin(), ret.end(), pInfo ) == ret.end() )
1112 ret.push_back( pInfo );
1117std::string SATResolver::SATprobleminfoString(Id problem, std::string &detail, Id &ignoreId)
1121 Id probr = solver_findproblemrule(_satSolver, problem);
1122 return SATproblemRuleInfoString( probr, detail, ignoreId );
1125std::string SATResolver::SATproblemRuleInfoString (Id probr, std::string &detail, Id &ignoreId)
1129 Id dep, source, target;
1130 SolverRuleinfo type = solver_ruleinfo(_satSolver, probr, &source, &target, &dep);
1134 sat::Solvable s = mapSolvable( source );
1135 sat::Solvable s2 = mapSolvable( target );
1142 case SOLVER_RULE_DISTUPGRADE:
1144 ret = str::Format(
_(
"the installed %1% does not belong to a distupgrade repository and must be replaced") ) % s.asString();
1146 ret = str::Format(
_(
"the to be installed %1% does not belong to a distupgrade repository") ) % s.asString();
1148 case SOLVER_RULE_INFARCH:
1150 ret = str::Format(
_(
"the installed %1% has inferior architecture") ) % s.asString();
1152 ret = str::Format(
_(
"the to be installed %1% has inferior architecture") ) % s.asString();
1154 case SOLVER_RULE_UPDATE:
1155 ret = str::Format(
_(
"problem with the installed %1%") ) % s.asString();
1157 case SOLVER_RULE_JOB:
1158 ret =
_(
"conflicting requests");
1160 case SOLVER_RULE_PKG:
1161 ret =
_(
"some dependency problem");
1163 case SOLVER_RULE_JOB_NOTHING_PROVIDES_DEP:
1164 ret = str::Format(
_(
"nothing provides the requested '%1%'") ) % pool_dep2str(pool, dep);
1165 detail +=
_(
"Have you enabled all the required repositories?");
1167 case SOLVER_RULE_JOB_UNKNOWN_PACKAGE:
1168 ret = str::Format(
_(
"the requested package %1% does not exist") ) % pool_dep2str(pool, dep);
1169 detail +=
_(
"Have you enabled all the required repositories?");
1171 case SOLVER_RULE_JOB_UNSUPPORTED:
1172 ret =
_(
"unsupported request");
1174 case SOLVER_RULE_JOB_PROVIDED_BY_SYSTEM:
1175 ret = str::Format(
_(
"'%1%' is provided by the system and cannot be erased") ) % pool_dep2str(pool, dep);
1177 case SOLVER_RULE_PKG_NOT_INSTALLABLE:
1178 ret = str::Format(
_(
"%1% is not installable") ) % s.asString();
1180 case SOLVER_RULE_PKG_NOTHING_PROVIDES_DEP:
1183 ret = str::Format(
_(
"nothing provides '%1%' needed by the installed %2%") ) % pool_dep2str(pool, dep) % s.asString();
1185 ret = str::Format(
_(
"nothing provides '%1%' needed by the to be installed %2%") ) % pool_dep2str(pool, dep) % s.asString();
1187 case SOLVER_RULE_PKG_SAME_NAME:
1188 ret = str::Format(
_(
"cannot install both %1% and %2%") ) % s.asString() % s2.asString();
1190 case SOLVER_RULE_PKG_CONFLICTS:
1191 if ( s.isSystem() ) {
1192 if ( s2.isSystem() )
1193 ret = str::Format(
_(
"the installed %1% conflicts with '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1195 ret = str::Format(
_(
"the installed %1% conflicts with '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1198 if ( s2.isSystem() )
1199 ret = str::Format(
_(
"the to be installed %1% conflicts with '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1201 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();
1204 case SOLVER_RULE_PKG_OBSOLETES:
1205 case SOLVER_RULE_PKG_INSTALLED_OBSOLETES:
1206 if ( s.isSystem() ) {
1207 if ( s2.isSystem() )
1208 ret = str::Format(
_(
"the installed %1% obsoletes '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1210 ret = str::Format(
_(
"the installed %1% obsoletes '%2%' provided by the to be installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1213 if ( s2.isSystem() )
1214 ret = str::Format(
_(
"the to be installed %1% obsoletes '%2%' provided by the installed %3%") ) % s.asString() % pool_dep2str(pool, dep) % s2.asString();
1216 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();
1219 case SOLVER_RULE_PKG_SELF_CONFLICT:
1221 ret = str::Format(
_(
"the installed %1% conflicts with '%2%' provided by itself") ) % s.asString() % pool_dep2str(pool, dep);
1223 ret = str::Format(
_(
"the to be installed %1% conflicts with '%2%' provided by itself") ) % s.asString() % pool_dep2str(pool, dep);
1225 case SOLVER_RULE_PKG_REQUIRES: {
1227 Capability cap(dep);
1228 sat::WhatProvides possibleProviders(cap);
1231 typedef std::list<PoolItem> ProviderList;
1232 ProviderList providerlistInstalled, providerlistUninstalled;
1233 for_( iter1, possibleProviders.begin(), possibleProviders.end() ) {
1237 for_( iter2, possibleProviders.begin(), possibleProviders.end() ) {
1239 if (compareByNVR (provider1,provider2) == 0
1240 && ( (provider1.status().isInstalled() && provider2.status().isUninstalled())
1241 || (provider2.status().isInstalled() && provider1.status().isUninstalled()) )) {
1247 if (provider1.status().isInstalled())
1248 providerlistInstalled.push_back(provider1);
1250 providerlistUninstalled.push_back(provider1);
1255 ret = str::Format(
_(
"the installed %1% requires '%2%', but this requirement cannot be provided") ) % s.asString() % pool_dep2str(pool, dep);
1257 ret = str::Format(
_(
"the to be installed %1% requires '%2%', but this requirement cannot be provided") ) % s.asString() % pool_dep2str(pool, dep);
1258 if (providerlistInstalled.size() > 0) {
1259 detail +=
_(
"deleted providers: ");
1260 for (ProviderList::const_iterator iter = providerlistInstalled.begin(); iter != providerlistInstalled.end(); iter++) {
1261 if (iter == providerlistInstalled.begin())
1267 if (providerlistUninstalled.size() > 0) {
1268 if (detail.size() > 0)
1269 detail +=
_(
"\nnot installable providers: ");
1271 detail =
_(
"not installable providers: ");
1272 for (ProviderList::const_iterator iter = providerlistUninstalled.begin(); iter != providerlistUninstalled.end(); iter++) {
1273 if (iter == providerlistUninstalled.begin())
1282 DBG <<
"Unknown rule type(" << type <<
") going to query libsolv for rule information." << endl;
1283 ret =
str::asString( ::solver_problemruleinfo2str( _satSolver, type,
static_cast<Id
>(s.id()),
static_cast<Id
>(s2.id()), dep ) );
1295 void notInstallPatch( sat::Solvable slv_r )
1296 {
_patch.push_back( slv_r.ident() ); }
1298 void removePtf( sat::Solvable slv_r,
bool showremoveProtectHint_r =
false )
1301 bool applies()
const
1302 {
return not
_ptf.empty(); }
1304 std::string description()
const {
1305 if ( not
_patch.empty() ) {
1308 << (str::Format(
_(
"%1% is not yet fully integrated into %2%.") ) % printlist(
_ptf) % printlist(
_patch)) << endl
1309 <<
_(
"Typically you want to keep the PTF and choose to not install the maintenance patches.");
1314 const std::string & removeptfCommand { str::Format(
"zypper removeptf %1%") % printlist(
_ptf) };
1317 << (str::Format(
_(
"Removing the installed %1% in this context will remove (not replace!) the included PTF-packages too." ) ) % printlist(
_ptf)) << endl
1318 << (str::Format(
_(
"The PTF should be removed by calling '%1%'. This will update the included PTF-packages rather than removing them." ) ) % removeptfCommand) << endl
1319 <<
_(
"Typically you want to keep the PTF or choose to cancel the action.");
1324 << (str::Format(
_(
"The installed %1% blocks the desired action.") ) % printlist(
_ptf)) << endl
1325 <<
_(
"Typically you want to keep the PTF and choose to cancel the action.");
1328 using StoreType = IdString;
1329 static std::string printlist(
const std::vector<StoreType> & list_r )
1330 { str::Str ret;
dumpRange( ret.stream(), list_r.begin(), list_r.end(),
"",
"",
", ",
"",
"" );
return ret; }
1340SATResolver::problems ()
1343 if (_satSolver && solver_problem_count(_satSolver)) {
1347 Id problem, solution, element;
1348 sat::Solvable s, sd;
1350 CapabilitySet system_requires = SystemCheck::instance().requiredSystemCap();
1351 CapabilitySet system_conflicts = SystemCheck::instance().conflictSystemCap();
1353 MIL <<
"Encountered problems! Here are the solutions:\n" << endl;
1356 while ((problem = solver_next_problem(_satSolver, problem)) != 0) {
1357 MIL <<
"Problem " << pcnt++ <<
":" << endl;
1358 MIL <<
"====================================" << endl;
1361 std::string whatString = SATprobleminfoString (problem,detail,ignoreId);
1362 MIL << whatString << endl;
1363 MIL <<
"------------------------------------" << endl;
1364 ResolverProblem_Ptr resolverProblem =
new ResolverProblem (whatString, detail, SATgetCompleteProblemInfoStrings( problem ));
1365 PtfPatchHint ptfPatchHint;
1367 while ((solution = solver_next_solution(_satSolver, problem, solution)) != 0) {
1369 ProblemSolutionCombi *problemSolution =
new ProblemSolutionCombi;
1370 while ((element = solver_next_solutionelement(_satSolver, problem, solution, element, &p, &rp)) != 0) {
1371 if (p == SOLVER_SOLUTION_JOB) {
1373 what = _jobQueue.elements[rp];
1374 switch (_jobQueue.elements[rp-1]&(SOLVER_SELECTMASK|SOLVER_JOBMASK))
1376 case SOLVER_INSTALL | SOLVER_SOLVABLE: {
1377 s = mapSolvable (what);
1378 PoolItem poolItem = _pool.find (s);
1380 if (pool->installed && s.get()->repo == pool->installed) {
1381 problemSolution->addSingleAction (poolItem, REMOVE);
1382 std::string description = str::Format(
_(
"remove lock to allow removal of %1%") ) % s.asString();
1383 MIL << description << endl;
1384 problemSolution->addDescription (description);
1385 if ( _protectPTFs && s.isPtfMaster() )
1386 ptfPatchHint.removePtf( s, _protectPTFs );
1388 problemSolution->addSingleAction (poolItem, KEEP);
1389 std::string description = str::Format(
_(
"do not install %1%") ) % s.asString();
1390 MIL << description << endl;
1391 problemSolution->addDescription (description);
1392 if ( s.isKind<Patch>() )
1393 ptfPatchHint.notInstallPatch( s );
1396 ERR <<
"SOLVER_INSTALL_SOLVABLE: No item found for " << s.asString() << endl;
1400 case SOLVER_ERASE | SOLVER_SOLVABLE: {
1401 s = mapSolvable (what);
1402 PoolItem poolItem = _pool.find (s);
1404 if (pool->installed && s.get()->repo == pool->installed) {
1405 problemSolution->addSingleAction (poolItem, KEEP);
1406 std::string description = str::Format(
_(
"keep %1%") ) % s.asString();
1407 MIL << description << endl;
1408 problemSolution->addDescription (description);
1410 problemSolution->addSingleAction (poolItem, UNLOCK);
1411 std::string description = str::Format(
_(
"remove lock to allow installation of %1%") ) %
itemToString( poolItem );
1412 MIL << description << endl;
1413 problemSolution->addDescription (description);
1416 ERR <<
"SOLVER_ERASE_SOLVABLE: No item found for " << s.asString() << endl;
1420 case SOLVER_INSTALL | SOLVER_SOLVABLE_NAME:
1422 IdString ident( what );
1423 SolverQueueItemInstall_Ptr install =
1424 new SolverQueueItemInstall(_pool, ident.asString(),
false );
1425 problemSolution->addSingleAction (install, REMOVE_SOLVE_QUEUE_ITEM);
1427 std::string description = str::Format(
_(
"do not install %1%") ) % ident;
1428 MIL << description << endl;
1429 problemSolution->addDescription (description);
1432 case SOLVER_ERASE | SOLVER_SOLVABLE_NAME:
1436 IdString ident( what );
1437 FindPackage info (problemSolution, KEEP);
1439 _pool.byIdentEnd( ident ),
1441 resfilter::ByTransact ()),
1444 SolverQueueItemDelete_Ptr del =
1445 new SolverQueueItemDelete(_pool, ident.asString(),
false );
1446 problemSolution->addSingleAction (del, REMOVE_SOLVE_QUEUE_ITEM);
1448 std::string description = str::Format(
_(
"keep %1%") ) % ident;
1449 MIL << description << endl;
1450 problemSolution->addDescription (description);
1453 case SOLVER_INSTALL | SOLVER_SOLVABLE_PROVIDES:
1455 problemSolution->addSingleAction (Capability(what), REMOVE_EXTRA_REQUIRE);
1456 std::string description =
"";
1459 if (system_requires.find(Capability(what)) != system_requires.end()) {
1461 resolverProblem->setDetails( resolverProblem->description() +
"\n" + resolverProblem->details() );
1462 resolverProblem->setDescription(
_(
"This request will break your system!"));
1463 description =
_(
"ignore the warning of a broken system");
1464 description += std::string(
" (requires:")+pool_dep2str(pool, what)+
")";
1465 MIL << description << endl;
1466 problemSolution->addFrontDescription (description);
1468 description = str::Format(
_(
"do not ask to install a solvable providing %1%") ) % pool_dep2str(pool, what);
1469 MIL << description << endl;
1470 problemSolution->addDescription (description);
1474 case SOLVER_ERASE | SOLVER_SOLVABLE_PROVIDES:
1476 problemSolution->addSingleAction (Capability(what), REMOVE_EXTRA_CONFLICT);
1477 std::string description =
"";
1480 if (system_conflicts.find(Capability(what)) != system_conflicts.end()) {
1482 resolverProblem->setDetails( resolverProblem->description() +
"\n" + resolverProblem->details() );
1483 resolverProblem->setDescription(
_(
"This request will break your system!"));
1484 description =
_(
"ignore the warning of a broken system");
1485 description += std::string(
" (conflicts:")+pool_dep2str(pool, what)+
")";
1486 MIL << description << endl;
1487 problemSolution->addFrontDescription (description);
1490 description = str::Format(
_(
"do not ask to delete all solvables providing %1%") ) % pool_dep2str(pool, what);
1491 MIL << description << endl;
1492 problemSolution->addDescription (description);
1496 case SOLVER_UPDATE | SOLVER_SOLVABLE:
1498 s = mapSolvable (what);
1499 PoolItem poolItem = _pool.find (s);
1501 if (pool->installed && s.get()->repo == pool->installed) {
1502 problemSolution->addSingleAction (poolItem, KEEP);
1503 std::string description = str::Format(
_(
"do not install most recent version of %1%") ) % s.asString();
1504 MIL << description << endl;
1505 problemSolution->addDescription (description);
1507 ERR <<
"SOLVER_INSTALL_SOLVABLE_UPDATE " << poolItem <<
" is not selected for installation" << endl;
1510 ERR <<
"SOLVER_INSTALL_SOLVABLE_UPDATE: No item found for " << s.asString() << endl;
1515 MIL <<
"- do something different" << endl;
1516 ERR <<
"No valid solution available" << endl;
1519 }
else if (p == SOLVER_SOLUTION_INFARCH) {
1520 s = mapSolvable (rp);
1521 PoolItem poolItem = _pool.find (s);
1522 if (pool->installed && s.get()->repo == pool->installed) {
1523 problemSolution->addSingleAction (poolItem, LOCK);
1524 std::string description = str::Format(
_(
"keep %1% despite the inferior architecture") ) % s.asString();
1525 MIL << description << endl;
1526 problemSolution->addDescription (description);
1528 problemSolution->addSingleAction (poolItem, INSTALL);
1529 std::string description = str::Format(
_(
"install %1% despite the inferior architecture") ) % s.asString();
1530 MIL << description << endl;
1531 problemSolution->addDescription (description);
1533 }
else if (p == SOLVER_SOLUTION_DISTUPGRADE) {
1534 s = mapSolvable (rp);
1535 PoolItem poolItem = _pool.find (s);
1536 if (pool->installed && s.get()->repo == pool->installed) {
1537 problemSolution->addSingleAction (poolItem, LOCK);
1538 std::string description = str::Format(
_(
"keep obsolete %1%") ) % s.asString();
1539 MIL << description << endl;
1540 problemSolution->addDescription (description);
1542 problemSolution->addSingleAction (poolItem, INSTALL);
1543 std::string description = str::Format(
_(
"install %1% from excluded repository") ) % s.asString();
1544 MIL << description << endl;
1545 problemSolution->addDescription (description);
1547 }
else if ( p == SOLVER_SOLUTION_BLACK ) {
1550 s = mapSolvable (rp);
1551 PoolItem poolItem = _pool.find (s);
1553 problemSolution->addSingleAction (poolItem, INSTALL);
1554 std::string description;
1555 if ( s.isRetracted() ) {
1557 description = str::Format(
_(
"install %1% although it has been retracted")) % s.asString();
1558 }
else if ( s.isPtf() ) {
1560 description = str::Format(
_(
"allow installing the PTF %1%")) % s.asString();
1563 description = str::Format(
_(
"install %1% although it is blacklisted")) % s.asString();
1565 MIL << description << endl;
1566 problemSolution->addDescription( description );
1567 }
else if ( p > 0 ) {
1569 s = mapSolvable (p);
1570 PoolItem itemFrom = _pool.find (s);
1575 sd = mapSolvable (rp);
1576 PoolItem itemTo = _pool.find (sd);
1577 if (itemFrom && itemTo) {
1578 problemSolution->addSingleAction (itemTo, INSTALL);
1579 int illegal = policy_is_illegal(_satSolver, s.get(), sd.get(), 0);
1581 if ((illegal & POLICY_ILLEGAL_DOWNGRADE) != 0)
1583 std::string description = str::Format(
_(
"downgrade of %1% to %2%") ) % s.asString() % sd.asString();
1584 MIL << description << endl;
1585 problemSolution->addDescription (description);
1588 if ((illegal & POLICY_ILLEGAL_ARCHCHANGE) != 0)
1590 std::string description = str::Format(
_(
"architecture change of %1% to %2%") ) % s.asString() % sd.asString();
1591 MIL << description << endl;
1592 problemSolution->addDescription (description);
1595 if ((illegal & POLICY_ILLEGAL_VENDORCHANGE) != 0)
1597 IdString s_vendor( s.vendor() );
1598 IdString sd_vendor( sd.vendor() );
1599 std::string description;
1601 description = str::Format(
_(
"install %1% (with vendor change)\n %2% --> %3%") )
1603 % ( s_vendor ? s_vendor.c_str() :
" (no vendor) " )
1604 % ( sd_vendor ? sd_vendor.c_str() :
" (no vendor) " );
1606 description = str::Format(
_(
"install %1% from vendor %2%\n replacing %3% from vendor %4%") )
1607 % sd.asString() % ( sd_vendor ? sd_vendor.c_str() :
" (no vendor) " )
1608 % s.asString() % ( s_vendor ? s_vendor.c_str() :
" (no vendor) " );
1610 MIL << description << endl;
1611 problemSolution->addDescription (description);
1615 std::string description = str::Format(
_(
"replacement of %1% with %2%") ) % s.asString() % sd.asString();
1616 MIL << description << endl;
1617 problemSolution->addDescription (description);
1620 ERR << s.asString() <<
" or " << sd.asString() <<
" not found" << endl;
1626 std::string description = str::Format(
_(
"deinstallation of %1%") ) % s.asString();
1627 MIL << description << endl;
1628 problemSolution->addDescription (description);
1629 problemSolution->addSingleAction (itemFrom, REMOVE);
1630 if ( s.isPtfMaster() )
1631 ptfPatchHint.removePtf( s );
1637 INT <<
"Unknown solution " << p << endl;
1641 resolverProblem->addSolution (problemSolution,
1642 problemSolution->actionCount() > 1 ?
true :
false);
1643 MIL <<
"------------------------------------" << endl;
1648 PoolItem item = _pool.find (sat::Solvable(ignoreId));
1649 ProblemSolutionIgnore *problemSolution =
new ProblemSolutionIgnore(item);
1650 resolverProblem->addSolution (problemSolution,
1652 MIL <<
"ignore some dependencies of " << item << endl;
1653 MIL <<
"------------------------------------" << endl;
1657 if ( ptfPatchHint.applies() ) {
1658 resolverProblem->setDescription( str::Str() << ptfPatchHint.description() << endl <<
"(" << resolverProblem->description() <<
")" );
1661 resolverProblems.push_back (resolverProblem);
1664 return resolverProblems;
1668{ Resolver( _pool ).applySolutions( solutions ); }
1674 ::solver_get_userinstalled( _satSolver, ret, GET_USERINSTALLED_NAMES|GET_USERINSTALLED_INVERTED );
1682 ::solver_get_userinstalled( _satSolver, ret, GET_USERINSTALLED_NAMES );
std::vector< StoreType > _ptf
std::vector< StoreType > _patch
bool _showremoveProtectHint
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.
size_type reposSize() const
Number of repos in Pool.
static Pool instance()
Singleton ctor.
void prepare() const
Update housekeeping data if necessary (e.g.
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()
Repository repository() const
The Repository this Solvable belongs to.
Container of Solvable providing a Capability (read only).
bool operator()(const PoolItem &item)
CheckIfUpdate(const sat::Solvable &installed_r)
static Ptr get(const pool::ByIdent &ident_r)
Get the Selctable.
Chain< TACondition, TBCondition > chain(TACondition conda_r, TBCondition condb_r)
Convenience function for creating a Chain from two conditions conda_r and condb_r.
::s_Solver CSolver
Wrapped libsolv C data type exposed as backdoor.
int IdType
Generic Id type.
::s_Pool CPool
Wrapped libsolv C data type exposed as backdoor.
unsigned SolvableIdType
Id type to connect Solvable and sat-solvable.
Queue StringQueue
Queue with String ids.
static void SATSolutionToPool(PoolItem item, const ResStatus &status, const ResStatus::TransactByValue causer)
int vendorCheck(sat::detail::CPool *pool, Solvable *solvable1, Solvable *solvable2)
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)
sat::Solvable mapBuddy(const PoolItem &item_r)
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
std::ostream & dumpRange(std::ostream &str, TIterator begin, TIterator end, const std::string &intro="{", const std::string &pfx="\n ", const std::string &sep="\n ", const std::string &sfx="\n", const std::string &extro="}")
Print range defined by iterators (multiline style).
ResolverFocus
The resolver's 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.
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.
#define IMPL_PTR_TYPE(NAME)