From 3a0f50bc7fc1905245ae38b0cf9ff6ba88c24354 Mon Sep 17 00:00:00 2001 From: Stefan Schubert Date: Thu, 12 Jul 2007 15:33:34 +0000 Subject: [PATCH] Collecting the correct information about who is installing other resolvables. - Regarding ALL ResolverInfo - filter out double entries --- zypp/solver/detail/Resolver.cc | 33 +++++++++++++++++++++++++++------ zypp/solver/detail/ResolverContext.cc | 30 ++++++++++++++++-------------- zypp/solver/detail/ResolverContext.h | 2 +- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/zypp/solver/detail/Resolver.cc b/zypp/solver/detail/Resolver.cc index 9470c6a..e819f3f 100644 --- a/zypp/solver/detail/Resolver.cc +++ b/zypp/solver/detail/Resolver.cc @@ -191,11 +191,32 @@ collector_cb_needed (ResolverInfo_Ptr info, void *data) 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)); + } } } @@ -210,7 +231,7 @@ Resolver::collectResolverInfo(void) && _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; } diff --git a/zypp/solver/detail/ResolverContext.cc b/zypp/solver/detail/ResolverContext.cc index 1d7f79b..a1de57f 100644 --- a/zypp/solver/detail/ResolverContext.cc +++ b/zypp/solver/detail/ResolverContext.cc @@ -1354,7 +1354,8 @@ mark_important_info (const ResolverInfoList & il) } 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; @@ -1375,25 +1376,26 @@ ResolverContext::foreachInfo (PoolItem_Ref item, int priority, ResolverInfoFn fn } 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 diff --git a/zypp/solver/detail/ResolverContext.h b/zypp/solver/detail/ResolverContext.h index d07c670..4368bda 100644 --- a/zypp/solver/detail/ResolverContext.h +++ b/zypp/solver/detail/ResolverContext.h @@ -304,7 +304,7 @@ class ResolverContext : public base::ReferenceCounted, private base::NonCopyable 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 -- 2.7.4