2 commits - docs/createrepo.8 dumpMetadata.py genpkgmetadata.py modifyrepo.py

[email protected] (Seth Vidal)
Newsgroups gmane.linux.rpm.metadata
Message-ID <[email protected]>
 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 <[email protected]>
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 <[email protected]>
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
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.