From 7e7925bb5c6206088aeabf14295a0298bdf1ad13 Mon Sep 17 00:00:00 2001 From: Klaus Kaempf Date: Sat, 11 Feb 2006 18:14:24 +0000 Subject: [PATCH] use the ResPool iterators to find providers during prereq sorting --- zypp/solver/detail/InstallOrder.cc | 44 ++++++++++++++++++++++++++++++++++---- zypp/solver/detail/InstallOrder.h | 3 ++- zypp/target/TargetImpl.cc | 4 ++-- 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/zypp/solver/detail/InstallOrder.cc b/zypp/solver/detail/InstallOrder.cc index d27a11c..3cec612 100644 --- a/zypp/solver/detail/InstallOrder.cc +++ b/zypp/solver/detail/InstallOrder.cc @@ -51,8 +51,9 @@ using namespace zypp; #define ITEMNAME(item) (item)->name() //----------------------------------------------------------------------------- -InstallOrder::InstallOrder( const PoolItemSet & toinstall, const PoolItemSet & installed ) - : _toinstall( toinstall ) +InstallOrder::InstallOrder( const ResPool & pool, const PoolItemSet & toinstall, const PoolItemSet & installed ) + : _pool( pool ) + , _toinstall( toinstall ) , _installed( installed ) , _dirty (true) , _numrun (0) @@ -172,6 +173,40 @@ InstallOrder::findProviderInSet( const Capability requirement, const PoolItemSet return PoolItem_Ref(); } +struct CollectProviders : public resfilter::OnCapMatchCallbackFunctor +{ + const PoolItem_Ref requestor; + PoolItemList & tovisit; + PoolItemSet & toinstall; + PoolItemSet & installed; + + CollectProviders (const PoolItem_Ref pi, PoolItemList & tv, PoolItemSet & ti, PoolItemSet & i) + : requestor (pi) + , tovisit (tv) + , toinstall (ti) + , installed (i) + { } + + + bool operator()( PoolItem_Ref provider, const Capability & match ) + { + // item provides cap which matches a requirement from info->requestor + // this function gets _all_ providers and filter out those which are + // either installed or in our toinstall input list + // +XXX << "info(" << provider <<")"<< endl; + if ((provider.resolvable() != requestor.resolvable()) // resolvable could provide its own requirement + && (toinstall.find( provider ) != toinstall.end() // only look at resolvables + || installed.find( provider ) != installed.end())) { // we are currently considering anyways + XXX << "tovisit " << ITEMNAME(provider) << endl; + tovisit.push_back (provider); + } + + return true; + } + +}; + //----------------------------------------------------------------------------- @@ -217,7 +252,7 @@ InstallOrder::rdfsvisit (const PoolItem_Ref item) _pool.byCapabilityIndexEnd( requirement.index(), dep ), resfilter::callOnCapMatchIn( dep, requirement, functor::functorRef(info) ) ); #endif -#if 0 +#if 1 CollectProviders info ( item, tovisit, _toinstall, _installed ); ResPool::const_indexiterator pend = _pool.providesend(requirement.index()); @@ -230,6 +265,7 @@ InstallOrder::rdfsvisit (const PoolItem_Ref item) } } #endif +#if 0 // item could provide its own requirement if( doesProvide( requirement, item ) ) { XXX << "self-provides " << endl; @@ -247,7 +283,7 @@ InstallOrder::rdfsvisit (const PoolItem_Ref item) } } } - +#endif for (PoolItemList::iterator it = tovisit.begin(); it != tovisit.end(); ++it) { const PoolItem_Ref must_visit = *it; diff --git a/zypp/solver/detail/InstallOrder.h b/zypp/solver/detail/InstallOrder.h index 16c840d..fb29bcd 100644 --- a/zypp/solver/detail/InstallOrder.h +++ b/zypp/solver/detail/InstallOrder.h @@ -60,6 +60,7 @@ namespace zypp class InstallOrder { private: + const ResPool & _pool; PoolItemSet _toinstall; PoolItemSet _installed; @@ -111,7 +112,7 @@ class InstallOrder * @param toinstall Set of ResItems that have to be installed * @param installed Set of ResItems that are already installed * */ - InstallOrder( const PoolItemSet & toinstall, const PoolItemSet & installed); + InstallOrder( const ResPool & pool, const PoolItemSet & toinstall, const PoolItemSet & installed); /** * Compute a list of ResItems which have no requirements and can be diff --git a/zypp/target/TargetImpl.cc b/zypp/target/TargetImpl.cc index 69fe959..3d27ed8 100644 --- a/zypp/target/TargetImpl.cc +++ b/zypp/target/TargetImpl.cc @@ -465,7 +465,7 @@ TargetImpl::getResolvablesToInsDel ( const ResPool pool_r, delset.insert( *pkgIt ); } - InstallOrder order( delset, dummy ); // sort according top prereq + InstallOrder order( pool_r, delset, dummy ); // sort according top prereq order.init(); const TargetImpl::PoolItemList dsorted( order.getTopSorted() ); @@ -518,7 +518,7 @@ TargetImpl::getResolvablesToInsDel ( const ResPool pool_r, for ( TargetImpl::PoolItemList::iterator resIt = instbackup_r.begin(); resIt != instbackup_r.end(); ++resIt ) { insset.insert( *resIt ); } - InstallOrder order( insset, installed ); + InstallOrder order( pool_r, insset, installed ); // start recursive depth-first-search order.init(); MIL << "order.init() done" << endl; -- 2.7.4