#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)
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;
+ }
+
+};
+
//-----------------------------------------------------------------------------
_pool.byCapabilityIndexEnd( requirement.index(), dep ),
resfilter::callOnCapMatchIn( dep, requirement, functor::functorRef<bool,PoolItem,Capability>(info) ) );
#endif
-#if 0
+#if 1
CollectProviders info ( item, tovisit, _toinstall, _installed );
ResPool::const_indexiterator pend = _pool.providesend(requirement.index());
}
}
#endif
+#if 0
// item could provide its own requirement
if( doesProvide( requirement, item ) ) {
XXX << "self-provides " << endl;
}
}
}
-
+#endif
for (PoolItemList::iterator it = tovisit.begin(); it != tovisit.end(); ++it)
{
const PoolItem_Ref must_visit = *it;
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() );
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;