[Rpm-metadata] createrepo/__init__.py createrepo/readMetadata.py genpkgmetadata.py
Seth Vidal
skvidal at linux.duke.edu
Wed Jan 9 16:29:35 UTC 2008
createrepo/__init__.py | 70 ++++++++++++++++++++++++++-------------------
createrepo/readMetadata.py | 7 ----
genpkgmetadata.py | 23 ++++++++++++--
3 files changed, 61 insertions(+), 39 deletions(-)
New commits:
commit 08565fca0a242a6b9fb27b01e904bd36a4eea409
Author: Seth Vidal <skvidal at fedoraproject.org>
Date: Wed Jan 9 11:27:38 2008 -0500
- clean up interface a lot
- add callback interface for progress output
- more proper catching of exceptions
- remove improper sys.exit() calls from the base class
diff --git a/createrepo/__init__.py b/createrepo/__init__.py
index 3d02645..a26a596 100644
--- a/createrepo/__init__.py
+++ b/createrepo/__init__.py
@@ -12,7 +12,7 @@ from optparse import OptionContainer
from yum import misc, Errors
import rpmUtils.transaction
-from utils import _, errorprint
+from utils import _
import readMetadata
try:
@@ -67,12 +67,30 @@ class MetaDataConfig(object):
self.mdtimestamp = 0
+class SimpleMDCallBack(object):
+ def errorlog(self, thing):
+ print >> sys.stderr, thing
+
+ def log(self, thing):
+ print thing
+
+ def progress(self, item, current, total):
+ sys.stdout.write('\r' + ' ' * 80)
+ sys.stdout.write("\r%d/%d - %s" % (current, total, item))
+ sys.stdout.flush()
+
+
class MetaDataGenerator:
- def __init__(self, config_obj=None):
+ def __init__(self, config_obj=None, callback=None):
self.conf = config_obj
if config_obj == None:
self.conf = MetaDataConfig()
-
+ if not callback:
+ self.callback = SimpleMDCallBack()
+ else:
+ self.callback = callback
+
+
self.ts = rpmUtils.transaction.initReadOnlyTransaction()
self.pkgcount = 0
self.files = []
@@ -117,7 +135,7 @@ class MetaDataGenerator:
def errorlog(self, thing):
"""subclass this if you want something different...."""
- print >> sys.stderr, thing
+ errorprint(thing)
def checkTimeStamps(self):
"""check the timestamp of our target dir. If it is not newer than the repodata
@@ -128,8 +146,7 @@ class MetaDataGenerator:
for f in files:
fn = os.path.join(self.conf.basedir, self.conf.directory, f)
if not os.path.exists(fn):
- #FIXME - raise don't print here
- errorprint(_('cannot get to file: %s') % fn)
+ self.callback.errorlog(_('cannot get to file: %s') % fn)
if os.path.getctime(fn) > self.conf.mdtimestamp:
return False
else:
@@ -142,7 +159,6 @@ class MetaDataGenerator:
for file in files:
for glob in self.conf.excludes:
if fnmatch.fnmatch(file, glob):
- # print 'excluded: %s' % file
if file not in badrpms:
badrpms.append(file)
for file in badrpms:
@@ -229,7 +245,6 @@ class MetaDataGenerator:
for pkg in pkglist:
current+=1
recycled = False
- sep = '-'
# look to see if we can get the data from the old repodata
# if so write this one out that way
@@ -247,7 +262,7 @@ class MetaDataGenerator:
po = self.read_in_package(directory, pkg)
except MDError, e:
# need to say something here
- self.errorlog("\nError %s: %s\n" % (pkg, e))
+ self.callback.errorlog("\nError %s: %s\n" % (pkg, e))
continue
reldir = os.path.join(self.conf.basedir, directory)
self.primaryfile.write(po.do_primary_xml_dump(reldir, baseurl=self.conf.baseurl))
@@ -255,8 +270,7 @@ class MetaDataGenerator:
self.otherfile.write(po.do_other_xml_dump())
else:
if self.conf.verbose:
- print "Using data from old metadata for %s" % pkg
- sep = '*'
+ self.callback.log(_("Using data from old metadata for %s") % pkg)
(primarynode, filenode, othernode) = nodes
for node, outfile in ((primarynode,self.primaryfile),
@@ -269,39 +283,37 @@ class MetaDataGenerator:
outfile.write(output)
else:
if self.conf.verbose:
- print "empty serialize on write to %s in %s" % (outfile, pkg)
+ self.callback.log(_("empty serialize on write to %s in %s") % (outfile, pkg))
outfile.write('\n')
self.oldData.freeNodes(pkg)
if not self.conf.quiet:
if self.conf.verbose:
- print '%d/%d %s %s' % (current, self.pkgcount, sep, pkg)
+ self.callback.log('%d/%d - %s' % (current, self.pkgcount, pkg))
else:
- sys.stdout.write('\r' + ' ' * 80)
- sys.stdout.write("\r%d/%d %s %s" % (current, self.pkgcount, sep, pkg))
- sys.stdout.flush()
+ self.callback.progress(pkg, current, self.pkgcount)
return current
def closeMetadataDocs(self):
if not self.conf.quiet:
- print ''
+ self.callback.log('')
# save them up to the tmp locations:
if not self.conf.quiet:
- print _('Saving Primary metadata')
+ self.callback.log(_('Saving Primary metadata'))
self.primaryfile.write('\n</metadata>')
self.primaryfile.close()
if not self.conf.quiet:
- print _('Saving file lists metadata')
+ self.callback.log(_('Saving file lists metadata'))
self.flfile.write('\n</filelists>')
self.flfile.close()
if not self.conf.quiet:
- print _('Saving other metadata')
+ self.callback.log(_('Saving other metadata'))
self.otherfile.write('\n</otherdata>')
self.otherfile.close()
@@ -429,15 +441,15 @@ class MetaDataGenerator:
try:
repodoc.saveFormatFileEnc(repofilepath, 'UTF-8', 1)
except:
- errorprint(_('Error saving temp file for rep xml: %s') % repofilepath)
- sys.exit(1)
+ self.callback.errorlog(_('Error saving temp file for repomd.xml: %s') % repofilepath)
+ raise MDError, 'Could not save temp file: %s' % repofilepath
del repodoc
class SplitMetaDataGenerator(MetaDataGenerator):
- def __init__(self, config_obj=None):
- MetaDataGenerator.__init__(self, config_obj=conf)
+ def __init__(self, config_obj=None, callback=None):
+ MetaDataGenerator.__init__(self, config_obj=conf, callback=None)
def _getFragmentUrl(self, url, fragment):
import urlparse
@@ -466,14 +478,14 @@ class SplitMetaDataGenerator(MetaDataGenerator):
os.path.walk(startdir, extension_visitor, rpmlist)
return rpmlist
- def doPkgMetadata(self, directories):
+ def doPkgMetadata(self):
"""all the heavy lifting for the package metadata"""
import types
- if type(directories) == types.StringType:
- MetaDataGenerator.doPkgMetadata(self, directories)
+ if type(self.directories) == types.StringType:
+ MetaDataGenerator.doPkgMetadata(self)
return
filematrix = {}
- for mydir in directories:
+ for mydir in self.directories:
filematrix[mydir] = self.getFileList(self.conf.basedir, mydir, '.rpm')
self.trimRpms(filematrix[mydir])
self.pkgcount += len(filematrix[mydir])
@@ -483,7 +495,7 @@ class SplitMetaDataGenerator(MetaDataGenerator):
self.conf.baseurl = self._getFragmentUrl(self.conf.baseurl, mediano)
self.openMetadataDocs()
original_basedir = self.conf.basedir
- for mydir in directories:
+ for mydir in self.directories:
self.conf.baseurl = self._getFragmentUrl(self.conf.baseurl, mediano)
current = self.writeMetadataDocs(filematrix[mydir], mydir, current)
mediano += 1
diff --git a/createrepo/readMetadata.py b/createrepo/readMetadata.py
index 5074f80..2b0713b 100644
--- a/createrepo/readMetadata.py
+++ b/createrepo/readMetadata.py
@@ -19,13 +19,8 @@ import os
import sys
import libxml2
import stat
+from utils import errorprint, _
-def errorprint(stuff):
- print >> sys.stderr, stuff
-
-def _(args):
- """Stub function for translation"""
- return args
class MetadataIndex(object):
diff --git a/genpkgmetadata.py b/genpkgmetadata.py
index bd71a4c..afc707a 100755
--- a/genpkgmetadata.py
+++ b/genpkgmetadata.py
@@ -140,6 +140,18 @@ def parseArgs(args, conf):
return conf
+class MDCallBack(object):
+ def errorlog(self, thing):
+ print >> sys.stderr, thing
+
+ def log(self, thing):
+ print thing
+
+ def progress(self, item, current, total):
+ sys.stdout.write('\r' + ' ' * 80)
+ sys.stdout.write("\r%d/%d - %s" % (current, total, item))
+ sys.stdout.flush()
+
def main(args):
conf = createrepo.MetaDataConfig()
conf = parseArgs(args, conf)
@@ -187,16 +199,19 @@ def main(args):
if conf.split:
conf.basedir = oldbase
- mdgen = createrepo.SplitMetaDataGenerator(config_obj=conf)
- mdgen.doPkgMetadata(directories)
+ mdgen = createrepo.SplitMetaDataGenerator(config_obj=conf, callback=MDCallBack())
else:
- mdgen = createrepo.MetaDataGenerator(config_obj=conf)
+ mdgen = createrepo.MetaDataGenerator(config_obj=conf, callback=MDCallBack())
if mdgen.checkTimeStamps():
if mdgen.conf.verbose:
print _('repo is up to date')
sys.exit(0)
+ try:
mdgen.doPkgMetadata()
- mdgen.doRepoMetadata()
+ mdgen.doRepoMetadata()
+ except MDError, e:
+ errorprint(_('%s') % e)
+ sys.exit(1)
output_final_dir = os.path.join(mdgen.conf.outputdir, mdgen.conf.finaldir)
output_old_dir = os.path.join(mdgen.conf.outputdir, mdgen.conf.olddir)
More information about the Rpm-metadata
mailing list