---
 yum/update_md.py |   49 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/yum/update_md.py b/yum/update_md.py
index 7da6a08..0586c1c 100644
--- a/yum/update_md.py
+++ b/yum/update_md.py
@@ -90,6 +90,20 @@ class UpdateNotice(object):
     def __setitem__(self, item, val):
         self._md[item] = val
 
+    def __eq__(self, other):
+        #  Tests to see if it's "the same data", which means that the
+        # packages can be different (see add_notice).
+
+        if not other or not hasattr(other, '_md'):
+            return False
+
+        for data in ('type', 'update_id', 'status', 'rights',
+                     'issued', 'updated', 'version', 'pushcount',
+                     'from', 'title', 'summary', 'description', 'solution'):
+            if self._md[data] != other._md[data]:
+                return False
+        return True
+
     def text(self, skip_data=('files', 'summary', 'rights', 'solution')):
         head = """
 ===============================================================================
@@ -429,9 +443,42 @@ class UpdateMetadata(object):
     def add_notice(self, un):
         """ Add an UpdateNotice object. This should be fully populated with
             data, esp. update_id and pkglist/packages. """
-        if not un or not un["update_id"] or un['update_id'] in self._notices:
+        if not un or not un["update_id"]:
             return
 
+        #  This is "special", the main thing we want to deal with here is
+        # having one errata that has multiple packages in it rpmA and rpmB, but
+        # the packages are in repos. repoA and repoB. So instead of doing a
+        # single errata pointing to both rpmA and rpmB and put the same thing
+        # in both repodata (which is legal, and works fine) people want to have
+        # just the packages from repoA in the repodata for repoA and vice 
versa.
+        if un['update_id'] in self._notices:
+            oun = self._notices[un['update_id']]
+            if oun != un:
+                return
+
+            # Ok, main parts of errata are the same, so now merge references:
+            seen = set()
+            for ref in oun['references']:
+                seen.add(ref['id'])
+            for ref in un['references']:
+                if ref['id'] in seen:
+                    continue
+                seen.add(ref['id'])
+                oun['references'].append(ref)
+
+            # ...and pkglist (this assumes that a pkglist name XYZ is the 
same):
+            seen = set()
+            for pkg in oun['pkglist']:
+                seen.add(pkg['name'])
+            for pkg in un['pkglist']:
+                if pkg['name'] in seen:
+                    continue
+                seen.add(pkg['name'])
+                oun['pkglist'].append(pkg)
+
+            un = oun
+
         self._notices[un['update_id']] = un
         for pkg in un['pkglist']:
             for filedata in pkg['packages']:
-- 
1.7.6.5

_______________________________________________
Yum-devel mailing list
Yum-devel@lists.baseurl.org
http://lists.baseurl.org/mailman/listinfo/yum-devel

Reply via email to