Collecting the correct information about who is installing other
authorStefan Schubert <schubi@suse.de>
Thu, 12 Jul 2007 15:33:34 +0000 (15:33 +0000)
committerStefan Schubert <schubi@suse.de>
Thu, 12 Jul 2007 15:33:34 +0000 (15:33 +0000)
resolvables.
- Regarding ALL ResolverInfo
- filter out double entries

zypp/solver/detail/Resolver.cc
zypp/solver/detail/ResolverContext.cc
zypp/solver/detail/ResolverContext.h

index 9470c6a..e819f3f 100644 (file)
@@ -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;
     }
index 1d7f79b..a1de57f 100644 (file)
@@ -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
index d07c670..4368bda 100644 (file)
@@ -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