[PATCH] createrepo openSUSE patches

Duncan Mac-Vicar Prett <[email protected]>
Newsgroups gmane.linux.rpm.metadata
Message-ID <[email protected]>
Attached.

I guess the license-to-confirm patch can be ignored as that should go in 
the distribution specific data in the future.


Duncan

_______________________________________________
Rpm-metadata mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/rpm-metadata
createrepo-0.4.8-cache_utime.patch (text/x-patch, 350 B)
--- dumpMetadata.py
+++ dumpMetadata.py
@@ -614,7 +614,7 @@
             csumo = open(csumfile, 'r')
             checksum = csumo.readline()
             csumo.close()
-            
+            os.path.os.utime(csumfile, None)
         else:
             checksum = getChecksum(self.options['sumtype'], fo)
             csumo = open(csumfile, 'w')
createrepo-0.4.10-cachefix.patch (text/x-patch, 565 B)
--- dumpMetadata.py
+++ dumpMetadata.py
@@ -603,8 +603,8 @@
             t.append("".join(self.hdr[rpm.RPMTAG_SIGGPG]))   
         if type(self.hdr[rpm.RPMTAG_SIGPGP]) is not types.NoneType:
             t.append("".join(self.hdr[rpm.RPMTAG_SIGPGP]))
-        if type(self.hdr[rpm.RPMTAG_HDRID]) is not types.NoneType:
-            t.append("".join(self.hdr[rpm.RPMTAG_HDRID]))
+        if type(self.hdr[rpm.RPMTAG_SHA1HEADER]) is not types.NoneType:
+            t.append("".join(self.hdr[rpm.RPMTAG_SHA1HEADER]))
 
         key = md5.new("".join(t)).hexdigest()
createrepo-0.4.10-fixsymlinks.patch (text/x-patch, 1.9 KB)
--- createrepo/genpkgmetadata.py.20070803	2007-06-07 06:33:34.000000000 -0400
+++ createrepo/genpkgmetadata.py	2007-08-03 15:36:17.000000000 -0400
@@ -83,11 +83,15 @@
 
         def extension_visitor(filelist, dirname, names):
             for fn in names:
-                if os.path.isdir(fn):
+                if os.path.islink(dirname + '/' + fn):
+                    if self.cmds['skip-symlinks']:
+                        continue
+                    elif os.path.isdir(dirname + '/' + fn):
+                        os.path.walk(dirname + '/' + fn, extension_visitor, filelist)
+                        continue
+                elif os.path.isdir(dirname + '/' + fn):
                     continue
-                if self.cmds['skip-symlinks'] and os.path.islink(fn):
-                    continue
-                elif fn[-extlen:].lower() == '%s' % (ext):
+                if fn[-extlen:].lower() == '%s' % (ext):
                     relativepath = dirname.replace(startdir, "", 1)
                     relativepath = relativepath.lstrip("/")
                     filelist.append(os.path.join(relativepath,fn))
@@ -325,9 +329,15 @@
 
         def extension_visitor(arg, dirname, names):
             for fn in names:
-                if os.path.isdir(fn):
+                if os.path.islink(dirname + '/' + fn):
+                    if self.cmds['skip-symlinks']:
+                        continue
+                    elif os.path.isdir(dirname + '/' + fn):
+                        os.path.walk(dirname + '/' + fn, extension_visitor, arg)
+                        continue
+                elif os.path.isdir(dirname + '/' + fn):
                     continue
-                elif string.lower(fn[-extlen:]) == '%s' % (ext):
+                if string.lower(fn[-extlen:]) == '%s' % (ext):
                     reldir = os.path.basename(dirname)
                     if reldir == os.path.basename(directory):
                         reldir = ""
createrepo-license-to-confirm.patch (text/x-patch, 3.1 KB)
--- dumpMetadata.py
+++ dumpMetadata.py
@@ -18,6 +18,7 @@
 
 # $Id$
 
+import glob
 import os
 import rpm
 import exceptions
@@ -629,7 +630,7 @@
 
 
     
-def generateXML(doc, node, formatns, rpmObj, sumtype):
+def generateXML(doc, node, formatns, susens, rpmObj, sumtype):
     """takes an xml doc object and a package metadata entry node, populates a 
        package node with the md information"""
     ns = node.ns()
@@ -663,6 +664,27 @@
     if rpmObj.localurl is not None:
         location.newProp('xml:base', rpmObj.localurl)
     location.newProp('href', rpmObj.relativepath)
+
+    eulas = glob.glob("%s.eula.*" % os.path.join(rpmObj.options['basedir'], rpmObj.relativepath))
+    if eulas is not None:
+        for eula in eulas:
+            match = re.match("(.*eula)\.(.*)", eula)
+            lang = match.group(2)
+
+            eulaContent = None
+
+            try:
+                fd = open(eula, "r")
+                eulaContent = fd.read()
+                fd.close()
+            except IOError:
+                raise MDError, "Failed read contents of %s" % eula
+
+            if eulaContent is not None:
+                eulaNode = pkgNode.newChild(susens, 'license-to-confirm', None)
+                eulaNode.newProp('lang', lang)
+                eulaNode.addContent(utf8String(eulaContent))
+
     format = pkgNode.newChild(ns, 'format', None)
     for tag in ['license', 'vendor', 'group', 'buildhost', 'sourcerpm']:
         value = rpmObj.tagByName(tag)
--- genpkgmetadata.py
+++ genpkgmetadata.py
@@ -181,11 +181,12 @@
         self.baseroot =  self.basedoc.newChild(None, "metadata", None)
         basens = self.baseroot.newNs('http://linux.duke.edu/metadata/common', None)
         self.formatns = self.baseroot.newNs('http://linux.duke.edu/metadata/rpm', 'rpm')
+        self.susens = self.baseroot.newNs('http://novell.com/package/metadata/suse/common', 'suse')
         self.baseroot.setNs(basens)
         basefilepath = os.path.join(self.cmds['outputdir'], self.cmds['tempdir'], self.cmds['primaryfile'])
         self.basefile = _gzipOpen(basefilepath, 'w')
         self.basefile.write('<?xml version="1.0" encoding="UTF-8"?>\n')
-        self.basefile.write('<metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm" packages="%s">\n' %
+        self.basefile.write('<metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm" xmlns:suse="http://novell.com/package/metadata/suse/common" packages="%s">\n' %
                        self.pkgcount)
 
     def _setupFilelists(self):
@@ -223,7 +224,7 @@
             errorprint('\n%s - %s' % (e, file))
             return None
         try:
-            basenode = dumpMetadata.generateXML(self.basedoc, self.baseroot, self.formatns, mdobj, self.cmds['sumtype'])
+            basenode = dumpMetadata.generateXML(self.basedoc, self.baseroot, self.formatns, self.susens, mdobj, self.cmds['sumtype'])
         except dumpMetadata.MDError, e:
             errorprint(_('\nAn error occurred creating primary metadata: %s') % e)
             return None
createrepo-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'
createrepo-suse-changelogs.patch (text/x-patch, 474 B)
--- dumpMetadata.py
+++ dumpMetadata.py
@@ -744,7 +744,10 @@
     for (name, time, text) in clogs:
         clog = pkg.newChild(None, 'changelog', None)
         clog.addContent(utf8String(text))
-        clog.newProp('author', utf8String(name))
+        if name == '' or name[0] != '-':
+          clog.newProp('author', utf8String(name))
+        else:
+          clog.newProp('author', utf8String(name[2:]))
         clog.newProp('date', str(time))
     return pkg
modifyrepo-prettyxml.patch (text/x-patch, 1.5 KB)
--- modifyrepo.py
+++ modifyrepo.py
@@ -92,16 +92,25 @@
 
         ## Build the metadata
         root = self.doc.firstChild
+        root.appendChild(self.doc.createTextNode("  "))
         data = self._insert_element(root, 'data', attrs={ 'type' : mdtype })
+        data.appendChild(self.doc.createTextNode("\n    "))
+
         self._insert_element(data, 'location',
                              attrs={ 'href' : 'repodata/' + mdname })
+        data.appendChild(self.doc.createTextNode("\n    "))
         self._insert_element(data, 'checksum', attrs={ 'type' : 'sha' },
                              text=sha.new(newmd).hexdigest())
+        data.appendChild(self.doc.createTextNode("\n    "))
         self._insert_element(data, 'timestamp',
                              text=str(os.stat(destmd).st_mtime))
+        data.appendChild(self.doc.createTextNode("\n    "))
         self._insert_element(data, 'open-checksum', attrs={ 'type' : 'sha' },
                              text=sha.new(md).hexdigest())
 
+        data.appendChild(self.doc.createTextNode("\n  "))
+        root.appendChild(self.doc.createTextNode("\n"))
+
         print "           type =", mdtype 
         print "       location =", 'repodata/' + mdname
         print "       checksum =", sha.new(newmd).hexdigest()
@@ -111,6 +120,7 @@
         ## Write the updated repomd.xml
         outmd = file(self.repomdxml, 'w')
         self.doc.writexml(outmd)
+        outmd.write("\n")
         outmd.close()
         print "Wrote:", self.repomdxml
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.