Patch to support enhances, supplements, suggests and recommends in createrepo

Christoph Thiel <[email protected]>
Newsgroups gmane.linux.rpm.metadata
Message-ID <[email protected]>
Hi folks,

while working on our createrepo package, I found that we ship a patches,
that could get merged upstream ;)

Please find missing-tags.patch by [email protected] attached. It's implements
support for Enhances, Supplements, Suggests, and Recommends rpm tags.


Best,
Christoph
-- 
Christoph Thiel, Tech. Project Management, Research & Development
SUSE LINUX Products GmbH, GF: Markus Rex, HRB 16746 (AG Nürnberg)

_______________________________________________
Rpm-metadata mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/rpm-metadata
missing-tags.patch (text/x-patch, 4.8 KB)
--- dumpMetadata.py
+++ dumpMetadata.py
@@ -267,14 +267,10 @@
             return returnflags
 
         if type(flags) is not types.ListType:
-            newflag = flags & 0xf
-            returnflags.append(newflag)
+            returnflags.append(flags)
         else:
             for flag in flags:
-                newflag = flag
-                if flag is not None:
-                    newflag = flag & 0xf
-                returnflags.append(newflag)
+                returnflags.append(flag)
         return returnflags
 
     def _checkPreReq(self, flags):
@@ -516,36 +512,48 @@
             lst = zip(names, flags, ver, prereq)
         return self._uniq(lst)
         
-    def obsoletesList(self):
+    def tagsList(self, name, flags, version):
         lst = []
-        names = self.hdr[rpm.RPMTAG_OBSOLETENAME]
-        tmpflags = self.hdr[rpm.RPMTAG_OBSOLETEFLAGS]
+        names = self.hdr[name]
+        tmpflags = self.hdr[flags]
         flags = self._correctFlags(tmpflags)
-        ver = self._correctVersion(self.hdr[rpm.RPMTAG_OBSOLETEVERSION])
+        ver = self._correctVersion(self.hdr[version])
         if names is not None:
             lst = zip(names, flags, ver)
         return self._uniq(lst)
 
+    def obsoletesList(self):
+        return self.tagsList(rpm.RPMTAG_OBSOLETENAME, rpm.RPMTAG_OBSOLETEFLAGS,
+                             rpm.RPMTAG_OBSOLETEVERSION)
+
     def conflictsList(self):
-        lst = []
-        names = self.hdr[rpm.RPMTAG_CONFLICTNAME]
-        tmpflags = self.hdr[rpm.RPMTAG_CONFLICTFLAGS]
-        flags = self._correctFlags(tmpflags)
-        ver = self._correctVersion(self.hdr[rpm.RPMTAG_CONFLICTVERSION])
-        if names is not None:
-            lst = zip(names, flags, ver)
-        return self._uniq(lst)
+        return self.tagsList(rpm.RPMTAG_CONFLICTNAME, rpm.RPMTAG_CONFLICTFLAGS,
+                             rpm.RPMTAG_CONFLICTVERSION)
 
     def providesList(self):
-        lst = []
-        names = self.hdr[rpm.RPMTAG_PROVIDENAME]
-        tmpflags = self.hdr[rpm.RPMTAG_PROVIDEFLAGS]
-        flags = self._correctFlags(tmpflags)
-        ver = self._correctVersion(self.hdr[rpm.RPMTAG_PROVIDEVERSION])
-        if names is not None:
-            lst = zip(names, flags, ver)
-        return self._uniq(lst)
+        return self.tagsList(rpm.RPMTAG_PROVIDENAME, rpm.RPMTAG_PROVIDEFLAGS,
+                             rpm.RPMTAG_PROVIDEVERSION)
         
+    def enhancesList(self):
+        lst = self.tagsList(rpm.RPMTAG_ENHANCESNAME, rpm.RPMTAG_ENHANCESFLAGS,
+                            rpm.RPMTAG_ENHANCESVERSION)
+        return [ l for l in lst if not l[1] & rpm.RPMSENSE_STRONG ]
+
+    def supplementsList(self):
+        lst = self.tagsList(rpm.RPMTAG_ENHANCESNAME, rpm.RPMTAG_ENHANCESFLAGS,
+                            rpm.RPMTAG_ENHANCESVERSION)
+        return [ l for l in lst if l[1] & rpm.RPMSENSE_STRONG ]
+
+    def suggestsList(self):
+        lst = self.tagsList(rpm.RPMTAG_SUGGESTSNAME, rpm.RPMTAG_SUGGESTSFLAGS,
+                            rpm.RPMTAG_SUGGESTSVERSION)
+        return [ l for l in lst if not l[1] & rpm.RPMSENSE_STRONG ]
+
+    def recommendsList(self):
+        lst = self.tagsList(rpm.RPMTAG_SUGGESTSNAME, rpm.RPMTAG_SUGGESTSFLAGS,
+                            rpm.RPMTAG_SUGGESTSVERSION)
+        return [ l for l in lst if l[1] & rpm.RPMSENSE_STRONG ]
+
     def changelogLists(self):
         lst = []
         names = self.listTagByName('changelogname')
@@ -629,12 +637,18 @@
     hr.newProp('end', str(rpmObj.rangeend))
     for (lst, nodename) in [(rpmObj.providesList(), 'provides'),
                             (rpmObj.conflictsList(), 'conflicts'),
-                            (rpmObj.obsoletesList(), 'obsoletes')]:
+                            (rpmObj.obsoletesList(), 'obsoletes'),
+                            (rpmObj.enhancesList(), 'enhances'),
+                            (rpmObj.supplementsList(), 'supplements'),
+                            (rpmObj.suggestsList(), 'suggests'),
+                            (rpmObj.recommendsList(), 'recommends')]:
         if len(lst) > 0:               
             rpconode = format.newChild(formatns, nodename, None)
             for (name, flags, (e,v,r)) in lst:
                 entry = rpconode.newChild(formatns, 'entry', None)
                 entry.newProp('name', name)
+                if flags is not None:
+                    flags = flags & 0xf
                 if flags != 0:
                     if flags == 2: arg = 'LT'
                     if flags == 4: arg = 'GT'
@@ -656,6 +670,8 @@
         for (name, flags, (e,v,r), prereq) in depsList:
             entry = rpconode.newChild(formatns, 'entry', None)
             entry.newProp('name', name)
+            if flags is not None:
+                flags = flags & 0xf
             if flags != 0:
                 if flags == 2: arg = 'LT'
                 if flags == 4: arg = 'GT'
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.