Author: schubi2 Date: Thu Jul 12 17:33:34 2007 New Revision: 5996 URL: http://svn.opensuse.org/viewcvs/zypp?rev=5996&view=rev Log: Collecting the correct information about who is installing other resolvables. - Regarding ALL ResolverInfo - filter out double entries Modified: trunk/libzypp/zypp/solver/detail/Resolver.cc trunk/libzypp/zypp/solver/detail/ResolverContext.cc trunk/libzypp/zypp/solver/detail/ResolverContext.h Modified: trunk/libzypp/zypp/solver/detail/Resolver.cc URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/solver/detail/Resolver.cc?rev=5996&r1=5995&r2=5996&view=diff ============================================================================== --- trunk/libzypp/zypp/solver/detail/Resolver.cc (original) +++ trunk/libzypp/zypp/solver/detail/Resolver.cc Thu Jul 12 17:33:34 2007 @@ -191,11 +191,32 @@ 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 @@ && _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; } Modified: trunk/libzypp/zypp/solver/detail/ResolverContext.cc URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/solver/detail/ResolverContext.cc?rev=5996&r1=5995&r2=5996&view=diff ============================================================================== --- trunk/libzypp/zypp/solver/detail/ResolverContext.cc (original) +++ trunk/libzypp/zypp/solver/detail/ResolverContext.cc Thu Jul 12 17:33:34 2007 @@ -1354,7 +1354,8 @@ } 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 @@ } context = context->_parent; } -#if 1 - // Merge info objects - for (ResolverInfoList::iterator iter = info_list.begin(); iter != info_list.end(); ++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 (merge) { + // Merge info objects + for (ResolverInfoList::iterator iter = info_list.begin(); iter != info_list.end(); ++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 ); + } + subiter = next; } - subiter = next; } } } -#endif + mark_important_info( info_list ); // Walk across the list of info objects and invoke our callback Modified: trunk/libzypp/zypp/solver/detail/ResolverContext.h URL: http://svn.opensuse.org/viewcvs/zypp/trunk/libzypp/zypp/solver/detail/ResolverContext.h?rev=5996&r1=5995&r2=5996&view=diff ============================================================================== --- trunk/libzypp/zypp/solver/detail/ResolverContext.h (original) +++ trunk/libzypp/zypp/solver/detail/ResolverContext.h Thu Jul 12 17:33:34 2007 @@ -304,7 +304,7 @@ 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 -- To unsubscribe, e-mail: zypp-commit+unsubscribe@opensuse.org For additional commands, e-mail: zypp-commit+help@opensuse.org