[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