for (PoolItemList::const_iterator iter = itemList.begin();
iter != itemList.end(); iter++) {
- ItemCapKind capKind( *iter, needed_by->capability(), needed_by->capKind(), needed_by->initialInstallation() );
- collector->isInstalledBy.insert (make_pair( item, capKind));
-
- ItemCapKind capKindReverse( item, needed_by->capability(), needed_by->capKind(), needed_by->initialInstallation() );
- collector->installs.insert (make_pair( *iter, capKindReverse));
+ bool found = false;
+ ItemCapKindMap::const_iterator pos = collector->isInstalledBy.find(item);
+ while (pos != collector->isInstalledBy.end()
+ && pos->first == item
+ && !found) {
+ ItemCapKind capKind = pos->second;
+ if (capKind.item == *iter) found = true;
+ pos++;
+ }
+ if (!found) {
+ ItemCapKind capKind( *iter, needed_by->capability(), needed_by->capKind(), needed_by->initialInstallation() );
+ collector->isInstalledBy.insert (make_pair( item, capKind));
+ }
+ found = false;
+ pos = collector->installs.find (*iter);
+ while (pos != collector->installs.end()
+ && pos->first == *iter
+ && !found) {
+ ItemCapKind capKind = pos->second;
+ if (capKind.item == item) found = true;
+ pos++;
+ }
+ if (!found) {
+ ItemCapKind capKindReverse( item, needed_by->capability(), needed_by->capKind(), needed_by->initialInstallation() );
+ collector->installs.insert (make_pair( *iter, capKindReverse));
+ }
}
}
&& _isInstalledBy.empty()
&& _installs.empty()) {
Collector collector;
- collectContext->foreachInfo (PoolItem(), RESOLVER_INFO_PRIORITY_VERBOSE, collector_cb_needed, &collector);
+ collectContext->foreachInfo (PoolItem(), RESOLVER_INFO_PRIORITY_VERBOSE, collector_cb_needed, &collector, false); // do not merge information
_isInstalledBy = collector.isInstalledBy;
_installs = collector.installs;
}
}
void
-ResolverContext::foreachInfo (PoolItem_Ref item, int priority, ResolverInfoFn fn, void *data) const
+ResolverContext::foreachInfo (PoolItem_Ref item, int priority, ResolverInfoFn fn, void *data,
+ const bool merge) const
{
ResolverInfoList info_list;
}
context = context->_parent;
}
-#if 1
- // Merge info objects
- for (ResolverInfoList::iterator iter = info_list.begin(); iter != info_list.end(); ++iter) {
+ if (merge) {
+ // Merge info objects
+ for (ResolverInfoList::iterator iter = info_list.begin(); iter != info_list.end(); ++iter) {
- ResolverInfo_Ptr info1 = (*iter);
- ResolverInfoList::iterator subiter = iter;
+ ResolverInfo_Ptr info1 = (*iter);
+ ResolverInfoList::iterator subiter = iter;
- if (info1 != NULL) {
- for (subiter++; subiter != info_list.end();) {
- ResolverInfo_Ptr info2 = *subiter;
- ResolverInfoList::iterator next = subiter; ++next;
- if (info2 && info1->merge (info2)) {
- info_list.erase( subiter );
+ if (info1 != NULL) {
+ for (subiter++; subiter != info_list.end();) {
+ ResolverInfo_Ptr info2 = *subiter;
+ ResolverInfoList::iterator next = subiter; ++next;
+ if (info2 && info1->merge (info2)) {
+ info_list.erase( subiter );
+ }
+ subiter = next;
}
- subiter = next;
}
}
}
-#endif
+
mark_important_info( info_list );
// Walk across the list of info objects and invoke our callback
void addError (ResolverInfo_Ptr info, bool askUser = false);// error progress info
// iterate over report log
- void foreachInfo (PoolItem_Ref item, int priority, ResolverInfoFn fn, void *data) const;
+ void foreachInfo (PoolItem_Ref item, int priority, ResolverInfoFn fn, void *data, const bool merge=true) const;
ResolverInfoList getInfo (void) const;
// Context compare to identify equal branches