[Rpm-metadata] createrepo/__init__.py createrepo/yumbased.py genpkgmetadata.py
Seth Vidal
skvidal at linux.duke.edu
Thu Aug 14 11:45:51 UTC 2008
createrepo/__init__.py | 18 +-
createrepo/yumbased.py | 336 -------------------------------------------------
genpkgmetadata.py | 5
3 files changed, 15 insertions(+), 344 deletions(-)
New commits:
commit e4a038d00c26ca2a7064e0428a9d318e02dce1a5
Author: Seth Vidal <skvidal at fedoraproject.org>
Date: Wed Aug 13 12:25:16 2008 -0400
remove most of the yumbased code, disable database-only for now
diff --git a/createrepo/__init__.py b/createrepo/__init__.py
index bebea27..e9f1e08 100644
--- a/createrepo/__init__.py
+++ b/createrepo/__init__.py
@@ -403,13 +403,11 @@ class MetaDataGenerator:
po = yumbased.CreateRepoPackage(self.ts, rpmfile)
except Errors.MiscError, e:
raise MDError, "Unable to open package: %s" % e
- # if we're going to add anything in from outside, here is where
- # you can do it
- po.crp_changelog_limit = self.conf.changelog_limit
- po.crp_cachedir = self.conf.cachedir
- po.crp_baseurl = baseurl
- po.crp_reldir = reldir
- po.crp_packagenumber = self.current_pkg
+ # external info we need
+ po._cachedir = self.conf.cachedir
+ po._baseurl = baseurl
+ po._reldir = reldir
+ po._packagenumber = self.current_pkg
for r in po.requires_print:
if r.startswith('rpmlib('):
self.rpmlib_reqs[r] = 1
@@ -466,11 +464,13 @@ class MetaDataGenerator:
po = pkg
if self.conf.database_only:
- po.do_sqlite_dump(self.md_sqlite)
+ pass # disabled right now for sanity reasons (mine)
+ #po.do_sqlite_dump(self.md_sqlite)
else:
self.primaryfile.write(po.xml_dump_primary_metadata())
self.flfile.write(po.xml_dump_filelists_metadata())
- self.otherfile.write(po.xml_dump_other_metadata())
+ self.otherfile.write(po.xml_dump_other_metadata(
+ clog_limit=self.conf.changelog_limit))
else:
if self.conf.verbose:
self.callback.log(_("Using data from old metadata for %s") % pkg)
diff --git a/createrepo/yumbased.py b/createrepo/yumbased.py
index 09f7a8c..adb6017 100644
--- a/createrepo/yumbased.py
+++ b/createrepo/yumbased.py
@@ -16,11 +16,9 @@
import os
-import struct
import rpm
import types
import re
-import xml.sax.saxutils
import md5
from yum.packages import YumLocalPackage
@@ -29,50 +27,11 @@ from yum import misc
from yum.sqlutils import executeSQL
from rpmUtils.transaction import initReadOnlyTransaction
from rpmUtils.miscutils import flagToString, stringToVersion
-import libxml2
import utils
-
-
-#FIXME - merge into class with config stuff
-fileglobs = ['.*bin\/.*', '^\/etc\/.*', '^\/usr\/lib\/sendmail$']
-file_re = []
-for glob in fileglobs:
- file_re.append(re.compile(glob))
-
-dirglobs = ['.*bin\/.*', '^\/etc\/.*']
-dir_re = []
-for glob in dirglobs:
- dir_re.append(re.compile(glob))
-
-
class CreateRepoPackage(YumLocalPackage):
def __init__(self, ts, package):
YumLocalPackage.__init__(self, ts, package)
- self._checksum = None
- self._stat = os.stat(package)
- self.filetime = str(self._stat[-2])
- self.packagesize = str(self._stat[6])
- self._hdrstart = None
- self._hdrend = None
- self.xml_node = libxml2.newDoc("1.0")
- self.arch = self.isSrpm()
- self.crp_cachedir = None
- self.crp_reldir = None
- self.crp_baseurl = ""
- self.crp_packagenumber = 1
- self.checksum_type = 'sha'
-
- def isSrpm(self):
- if self.tagByName('sourcepackage') == 1 or not self.tagByName('sourcerpm'):
- return 'src'
- else:
- return self.tagByName('arch')
-
- def _xml(self, item):
- item = utils.utf8String(item)
- item = item.rstrip()
- return xml.sax.saxutils.escape(item)
def _do_checksum(self):
"""return a checksum for a package:
@@ -87,7 +46,7 @@ class CreateRepoPackage(YumLocalPackage):
return self._checksum
# not using the cachedir
- if not self.crp_cachedir:
+ if not self._cachedir:
self._checksum = misc.checksum(self.checksum_type, self.localpath)
return self._checksum
@@ -104,7 +63,7 @@ class CreateRepoPackage(YumLocalPackage):
csumtag = '%s-%s-%s-%s' % (os.path.basename(self.localpath),
key, self.size, self.filetime)
- csumfile = '%s/%s' % (self.crp_cachedir, csumtag)
+ csumfile = '%s/%s' % (self._cachedir, csumtag)
if os.path.exists(csumfile) and float(self.filetime) <= float(os.stat(csumfile)[-2]):
csumo = open(csumfile, 'r')
@@ -120,297 +79,8 @@ class CreateRepoPackage(YumLocalPackage):
self._checksum = checksum
return self._checksum
-
- checksum = property(fget=lambda self: self._do_checksum())
-
- def _get_header_byte_range(self):
- """takes an rpm file or fileobject and returns byteranges for location of the header"""
- if self._hdrstart and self._hdrend:
- return (self._hdrstart, self._hdrend)
-
-
- fo = open(self.localpath, 'r')
- #read in past lead and first 8 bytes of sig header
- fo.seek(104)
- # 104 bytes in
- binindex = fo.read(4)
- # 108 bytes in
- (sigindex, ) = struct.unpack('>I', binindex)
- bindata = fo.read(4)
- # 112 bytes in
- (sigdata, ) = struct.unpack('>I', bindata)
- # each index is 4 32bit segments - so each is 16 bytes
- sigindexsize = sigindex * 16
- sigsize = sigdata + sigindexsize
- # we have to round off to the next 8 byte boundary
- disttoboundary = (sigsize % 8)
- if disttoboundary != 0:
- disttoboundary = 8 - disttoboundary
- # 112 bytes - 96 == lead, 8 = magic and reserved, 8 == sig header data
- hdrstart = 112 + sigsize + disttoboundary
-
- fo.seek(hdrstart) # go to the start of the header
- fo.seek(8,1) # read past the magic number and reserved bytes
-
- binindex = fo.read(4)
- (hdrindex, ) = struct.unpack('>I', binindex)
- bindata = fo.read(4)
- (hdrdata, ) = struct.unpack('>I', bindata)
-
- # each index is 4 32bit segments - so each is 16 bytes
- hdrindexsize = hdrindex * 16
- # add 16 to the hdrsize to account for the 16 bytes of misc data b/t the
- # end of the sig and the header.
- hdrsize = hdrdata + hdrindexsize + 16
-
- # header end is hdrstart + hdrsize
- hdrend = hdrstart + hdrsize
- fo.close()
- self._hdrstart = hdrstart
- self._hdrend = hdrend
-
- return (hdrstart, hdrend)
-
- hdrend = property(fget=lambda self: self._get_header_byte_range()[1])
- hdrstart = property(fget=lambda self: self._get_header_byte_range()[0])
- def _dump_base_items(self):
-
- # if we start seeing fullpaths in the location tag - this is the culprit
- if self.crp_reldir and self.localpath.startswith(self.crp_reldir):
- relpath = self.localpath.replace(self.crp_reldir, '')
- if relpath[0] == '/': relpath = relpath[1:]
- else:
- relpath = self.localpath
-
- packager = url = ''
- if self.packager:
- packager = self._xml(self.packager)
-
- if self.url:
- url = self._xml(self.url)
-
- msg = """
- <name>%s</name>
- <arch>%s</arch>
- <version epoch="%s" ver="%s" rel="%s"/>
- <checksum type="sha" pkgid="YES">%s</checksum>
- <summary>%s</summary>
- <description>%s</description>
- <packager>%s</packager>
- <url>%s</url>
- <time file="%s" build="%s"/>
- <size package="%s" installed="%s" archive="%s"/>\n""" % (self.name,
- self.arch, self.epoch, self.ver, self.rel, self.checksum,
- self._xml(self.summary), self._xml(self.description), packager,
- url, self.filetime, self.buildtime, self.packagesize, self.size,
- self.archivesize)
-
-
- if self.crp_baseurl:
- msg += """<location xml:base="%s" href="%s"/>\n""" % (self._xml(self.crp_baseurl), relpath)
- else:
- msg += """<location href="%s"/>\n""" % relpath
-
- return msg
-
- def _dump_format_items(self):
- msg = " <format>\n"
- if self.license:
- msg += """ <rpm:license>%s</rpm:license>\n""" % self._xml(self.license)
- else:
- msg += """ <rpm:license/>\n"""
-
- if self.vendor:
- msg += """ <rpm:vendor>%s</rpm:vendor>\n""" % self._xml(self.vendor)
- else:
- msg += """ <rpm:vendor/>\n"""
-
- if self.group:
- msg += """ <rpm:group>%s</rpm:group>\n""" % self._xml(self.group)
- else:
- msg += """ <rpm:group/>\n"""
-
- if self.buildhost:
- msg += """ <rpm:buildhost>%s</rpm:buildhost>\n""" % self._xml(self.buildhost)
- else:
- msg += """ <rpm:buildhost/>\n"""
-
- if self.sourcerpm:
- msg += """ <rpm:sourcerpm>%s</rpm:sourcerpm>\n""" % self._xml(self.sourcerpm)
- msg +=""" <rpm:header-range start="%s" end="%s"/>""" % (self.hdrstart,
- self.hdrend)
- msg += self._dump_pco('provides')
- msg += self._dump_requires()
- msg += self._dump_pco('conflicts')
- msg += self._dump_pco('obsoletes')
- msg += self._dump_files(True)
- msg += """\n </format>"""
- return msg
-
- def _dump_pco(self, pcotype):
-
- msg = ""
- mylist = getattr(self, pcotype)
- if mylist: msg = "\n <rpm:%s>\n" % pcotype
- for (name, flags, (e,v,r)) in mylist:
- pcostring = ''' <rpm:entry name="%s"''' % name
- if flags:
- pcostring += ''' flags="%s"''' % flags
- if e:
- pcostring += ''' epoch="%s"''' % e
- if v:
- pcostring += ''' ver="%s"''' % v
- if r:
- pcostring += ''' rel="%s"''' % r
-
- pcostring += "/>\n"
- msg += pcostring
-
- if mylist: msg += " </rpm:%s>" % pcotype
- return msg
-
- def _return_primary_files(self, list_of_files=None):
-
- returns = {}
- if list_of_files is None:
- list_of_files = self.returnFileEntries('file')
- for item in list_of_files:
- if item is None:
- continue
- for glob in file_re:
- if glob.match(item):
- returns[item] = 1
- return returns.keys()
-
- def _return_primary_dirs(self):
-
- returns = {}
- for item in self.returnFileEntries('dir'):
- if item is None:
- continue
- for glob in dir_re:
- if glob.match(item):
- returns[item] = 1
- return returns.keys()
-
-
- def _dump_files(self, primary=False):
- msg =""
- if not primary:
- files = self.returnFileEntries('file')
- dirs = self.returnFileEntries('dir')
- ghosts = self.returnFileEntries('ghost')
- else:
- files = self._return_primary_files()
- ghosts = self._return_primary_files(list_of_files = self.returnFileEntries('ghost'))
- dirs = self._return_primary_dirs()
-
- for fn in files:
- msg += """ <file>%s</file>\n""" % self._xml(fn)
- for fn in dirs:
- msg += """ <file type="dir">%s</file>\n""" % self._xml(fn)
- for fn in ghosts:
- msg += """ <file type="ghost">%s</file>\n""" % self._xml(fn)
-
- return msg
-
- def _is_pre_req(self, flag):
- """check the flags for a requirement, return 1 or 0 whether or not requires
- is a pre-requires or a not"""
- # FIXME this should probably be put in rpmUtils.miscutils since
- # - that's what it is
- newflag = flag
- if flag is not None:
- newflag = flag & rpm.RPMSENSE_PREREQ
- if newflag == rpm.RPMSENSE_PREREQ:
- return 1
- else:
- return 0
- return 0
-
- def _requires_with_pre(self):
- """returns requires with pre-require bit"""
- name = self.hdr[rpm.RPMTAG_REQUIRENAME]
- lst = self.hdr[rpm.RPMTAG_REQUIREFLAGS]
- flag = map(flagToString, lst)
- pre = map(self._is_pre_req, lst)
- lst = self.hdr[rpm.RPMTAG_REQUIREVERSION]
- vers = map(stringToVersion, lst)
- if name is not None:
- lst = zip(name, flag, vers, pre)
- mylist = misc.unique(lst)
- return mylist
-
- def _dump_requires(self):
- """returns deps in format"""
- mylist = self._requires_with_pre()
-
- msg = ""
-
- if mylist: msg = "\n <rpm:requires>\n"
- for (name, flags, (e,v,r),pre) in mylist:
- if name.startswith('rpmlib('):
- continue
- prcostring = ''' <rpm:entry name="%s"''' % name
- if flags:
- prcostring += ''' flags="%s"''' % flags
- if e:
- prcostring += ''' epoch="%s"''' % e
- if v:
- prcostring += ''' ver="%s"''' % v
- if r:
- prcostring += ''' rel="%s"''' % r
- if pre:
- prcostring += ''' pre="%s"''' % pre
-
- prcostring += "/>\n"
- msg += prcostring
-
- if mylist: msg += " </rpm:requires>"
- return msg
-
- def _dump_changelog(self):
- if not self.changelog:
- return ""
- msg = "\n"
- clog_count = 0
- for (ts, author, content) in reversed(sorted(self.changelog)):
- if self.crp_changelog_limit and clog_count >= self.crp_changelog_limit:
- break
- clog_count += 1
- c = self.xml_node.newChild(None, "changelog", None)
- c.addContent(utils.utf8String(content))
- c.newProp('author', utils.utf8String(author))
- c.newProp('date', str(ts))
- msg += c.serialize()
- c.unlinkNode()
- c.freeNode()
- del c
- return msg
-
- def xml_dump_primary_metadata(self):
- msg = """\n<package type="rpm">"""
- msg += self._dump_base_items()
- msg += self._dump_format_items()
- msg += """\n</package>"""
- return msg
-
- def xml_dump_filelists_metadata(self):
- msg = """\n<package pkgid="%s" name="%s" arch="%s">
- <version epoch="%s" ver="%s" rel="%s"/>\n""" % (self.checksum, self.name,
- self.arch, self.epoch, self.ver, self.rel)
- msg += self._dump_files()
- msg += "</package>\n"
- return msg
-
- def xml_dump_other_metadata(self):
- msg = """\n<package pkgid="%s" name="%s" arch="%s">
- <version epoch="%s" ver="%s" rel="%s"/>\n""" % (self.checksum, self.name,
- self.arch, self.epoch, self.ver, self.rel)
- msg += self._dump_changelog()
- msg += "\n</package>\n"
- return msg
+ # sqlite-direct dump code below here :-/
def _sqlite_null(self, item):
if not item:
diff --git a/genpkgmetadata.py b/genpkgmetadata.py
index 2d30dd6..6c573ee 100755
--- a/genpkgmetadata.py
+++ b/genpkgmetadata.py
@@ -59,8 +59,9 @@ def parseArgs(args, conf):
help="check timestamps on files vs the metadata to see if we need to update")
parser.add_option("-d", "--database", default=False, action="store_true",
help="create sqlite database files")
- parser.add_option("--database-only", default=False, action="store_true", dest='database_only',
- help="Only make the sqlite databases - does not work with --update, yet")
+ # temporarily disabled
+ #parser.add_option("--database-only", default=False, action="store_true", dest='database_only',
+ # help="Only make the sqlite databases - does not work with --update, yet")
parser.add_option("--update", default=False, action="store_true",
help="use the existing repodata to speed up creation of new")
parser.add_option("--skip-stat", dest='skip_stat', default=False, action="store_true",
More information about the Rpm-metadata
mailing list