[Rpm-metadata] 2 commits - docs/createrepo.8 dumpMetadata.py genpkgmetadata.py modifyrepo.py

Seth Vidal skvidal at linux.duke.edu
Tue Dec 18 18:46:07 UTC 2007


 docs/createrepo.8 |    4 ++++
 dumpMetadata.py   |   36 ++++++++++++++++++++++++++----------
 genpkgmetadata.py |   19 +++++++++++++++++--
 modifyrepo.py     |   10 ++++++++++
 4 files changed, 57 insertions(+), 12 deletions(-)

New commits:
commit ed049feeb8bb9304f45f85768aa0929abed865b8
Merge: e2e124a... b6d217e...
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Tue Dec 18 13:43:28 2007 -0500

    Merge branch 'master' of ssh://login.linux.duke.edu/home/groups/createrepo/git/createrepo
    
    * 'master' of ssh://login.linux.duke.edu/home/groups/createrepo/git/createrepo:
      Update ChangeLog
      Remove some unnecessary imports
      Better unicode handling in modifyrepo
      Add a man page for modifyrepo

commit e2e124a979d8ab2d5768f8c3112d39bb7cd98f94
Author: Seth Vidal <skvidal at fedoraproject.org>
Date:   Tue Dec 18 13:43:19 2007 -0500

    merge maintenance changes up to head before we nuke it from orbit

diff --git a/docs/createrepo.8 b/docs/createrepo.8
index 358ee85..419e872 100644
--- a/docs/createrepo.8
+++ b/docs/createrepo.8
@@ -18,6 +18,10 @@ time)
 Optional output directory (useful for read only media).
 .IP "\fB\-x --exclude\fP <package>"
 File globs to exclude, can be specified multiple times.
+.IP "\fB\-i --pkglist\fP <filename>"
+specify a text file which contains the complete list of files to
+include in the repository from the set found in the directory. File format is one
+package per line, no wildcards or globs.
 .IP "\fB\-q --quiet\fP"
 Run quietly.
 .IP "\fB\-g --groupfile\fP <groupfile>"
diff --git a/dumpMetadata.py b/dumpMetadata.py
index 396435a..84df6a1 100644
--- a/dumpMetadata.py
+++ b/dumpMetadata.py
@@ -28,7 +28,10 @@ import struct
 import re
 import stat
 import bz2
-import sqlitecachec
+try:
+    import sqlitecachec
+except ImportError:
+    pass
 
 # done to fix gzip randomly changing the checksum
 import gzip
@@ -217,9 +220,12 @@ def byteranges(file):
     
 
 class MDError(exceptions.Exception):
-    def __init__(self, args=None):
+    def __init__(self, value=None):
         exceptions.Exception.__init__(self)
-        self.args = args
+        self.value = value
+    
+    def __str__(self):
+        return self.value
 
 
 
@@ -400,7 +406,9 @@ class RpmMetaData:
         except TypeError:
             del u  # move on to the next method
         else:
-            return u.keys()
+            ret = u.keys()
+            ret.sort()
+            return ret
     
         # We can't hash all the elements.  Second fastest is to sort,
         # which brings the equal elements together; then duplicates are
@@ -497,7 +505,7 @@ class RpmMetaData:
             for glob in self.filerc:
                 if glob.match(item):
                     returns[item] = 1
-        return returns
+        return returns.keys()
                     
     def usefulGhosts(self):
         """search for useful ghost file names"""
@@ -508,7 +516,7 @@ class RpmMetaData:
             for glob in self.filerc:
                 if glob.match(item):
                     returns[item] = 1
-        return returns
+        return returns.keys()
 
 
     def usefulDirs(self):
@@ -596,7 +604,9 @@ class RpmMetaData:
 
         key = md5.new("".join(t)).hexdigest()
                                         
-        csumtag = '%s-%s' % (self.hdr['name'] , key)
+        csumtag = '%s-%s-%s-%s' % (os.path.basename(self.relativepath), 
+                                   self.hdr[rpm.RPMTAG_SHA1HEADER], 
+                                   self.size, self.mtime)
         csumfile = '%s/%s' % (self.options['cachedir'], csumtag)
         if os.path.exists(csumfile) and self.mtime <= os.stat(csumfile)[8]:
             csumo = open(csumfile, 'r')
@@ -704,16 +714,22 @@ def generateXML(doc, node, formatns, rpmObj, sumtype):
             if prereq == 1:
                 entry.newProp('pre', str(prereq))
         
-    for file in rpmObj.usefulFiles():
+    ff = rpmObj.usefulFiles()
+    ff.sort()
+    for file in ff:
         files = format.newChild(None, 'file', None)
         file = utf8String(file)
         files.addContent(file)
-    for directory in rpmObj.usefulDirs():
+    ff = rpmObj.usefulDirs()
+    ff.sort()
+    for directory in ff:
         files = format.newChild(None, 'file', None)
         directory = utf8String(directory)
         files.addContent(directory)
         files.newProp('type', 'dir')
-    for directory in rpmObj.usefulGhosts():
+    ff = rpmObj.usefulGhosts()
+    ff.sort()
+    for directory in ff:
         files = format.newChild(None, 'file', None)
         directory = utf8String(directory)
         files.addContent(directory)
diff --git a/genpkgmetadata.py b/genpkgmetadata.py
index b4f4c82..bef0225 100755
--- a/genpkgmetadata.py
+++ b/genpkgmetadata.py
@@ -76,6 +76,21 @@ class MetaDataGenerator:
         self.pkgcount = 0
         self.files = []
 
+    def _os_path_walk(self, top, func, arg):
+        """Directory tree walk with callback function.
+         copy of os.path.walk, fixes the link/stating problem
+         """
+
+        try:
+            names = os.listdir(top)
+        except os.error:
+            return
+        func(arg, top, names)
+        for name in names:
+            name = os.path.join(top, name)
+            if os.path.isdir(name):
+                self._os_path_walk(name, func, arg)
+
     def getFileList(self, basepath, directory, ext):
         """Return all files in path matching ext, store them in filelist,
         recurse dirs. Returns a list object"""
@@ -95,7 +110,7 @@ class MetaDataGenerator:
 
         filelist = []
         startdir = os.path.join(basepath, directory) + '/'
-        os.path.walk(startdir, extension_visitor, filelist)
+        self._os_path_walk(startdir, extension_visitor, filelist)
         return filelist
 
     def checkTimeStamps(self, directory):
@@ -235,7 +250,7 @@ class MetaDataGenerator:
                 #scan rpm files
                 nodes = self._getNodes(file, directory, current)
             if nodes is None:
-                return
+                continue
             basenode, filenode, othernode = nodes
             del nodes
             if not self.cmds['quiet']:
diff --git a/modifyrepo.py b/modifyrepo.py
index 30abe1c..e00da18 100755
--- a/modifyrepo.py
+++ b/modifyrepo.py
@@ -92,16 +92,25 @@ class RepoMetadata:
 
         ## 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 @@ class RepoMetadata:
         ## Write the updated repomd.xml
         outmd = file(self.repomdxml, 'w')
         self.doc.writexml(outmd)
+        outmd.write("\n")
         outmd.close()
         print "Wrote:", self.repomdxml
 



More information about the Rpm-metadata mailing list