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