diff options
author | Jonathan Dieter <jdieter@gmail.com> | 2007-03-29 17:39:26 +0300 |
---|---|---|
committer | Jonathan Dieter <jdieter@gmail.com> | 2007-03-29 17:39:26 +0300 |
commit | b1147b441a7f4873f39c5ce337d516b2cd1483eb (patch) | |
tree | efcf451769cf54c8948bad77803baf90f7ccb068 /makerepo/dumpMetadata.py | |
parent | 3304f77f5f30e94c13147aa73eecf3d8cf9ef9aa (diff) | |
download | presto-b1147b441a7f4873f39c5ce337d516b2cd1483eb.tar.gz presto-b1147b441a7f4873f39c5ce337d516b2cd1483eb.tar.xz presto-b1147b441a7f4873f39c5ce337d516b2cd1483eb.zip |
New server
Signed-off-by: Jonathan Dieter <jdieter@gmail.com>
Diffstat (limited to 'makerepo/dumpMetadata.py')
-rwxr-xr-x | makerepo/dumpMetadata.py | 346 |
1 files changed, 10 insertions, 336 deletions
diff --git a/makerepo/dumpMetadata.py b/makerepo/dumpMetadata.py index 4ca0793..2f074da 100755 --- a/makerepo/dumpMetadata.py +++ b/makerepo/dumpMetadata.py @@ -209,7 +209,7 @@ class MDError(exceptions.Exception): class RpmMetaData: - """each rpm is one object, you pass it an rpm file + """each drpm is one object, you pass it an rpm file it opens the file, and pulls the information out in bite-sized chunks :) """ @@ -236,65 +236,13 @@ class RpmMetaData: fo.close() del fo del fd - - # setup our regex objects - fileglobs = options['file-pattern-match'] - #['.*bin\/.*', '^\/etc\/.*', '^\/usr\/lib\/sendmail$'] - dirglobs = options['dir-pattern-match'] - #['.*bin\/.*', '^\/etc\/.*'] - self.dirrc = [] - self.filerc = [] - for glob in fileglobs: - self.filerc.append(re.compile(glob)) - - for glob in dirglobs: - self.dirrc.append(re.compile(glob)) - - self.filenames = [] - self.dirnames = [] - self.ghostnames = [] - self.genFileLists() - + def arch(self): if self.tagByName('sourcepackage') == 1: return 'src' else: return self.tagByName('arch') - def _correctFlags(self, flags): - returnflags=[] - if flags is None: - return returnflags - - if type(flags) is not types.ListType: - newflag = flags & 0xf - returnflags.append(newflag) - else: - for flag in flags: - newflag = flag - if flag is not None: - newflag = flag & 0xf - returnflags.append(newflag) - return returnflags - - def _checkPreReq(self, flags): - reqs=[] - if flags is None: - return reqs - - if type(flags) is not types.ListType: - flags = [flags] - for flag in flags: - newflag = flag - if flag is not None: - newflag = flag & 64 - if newflag == 64: - reqs.append(1) - else: - reqs.append(0) - return reqs - - def _correctVersion(self, vers): returnvers = [] vertuple = (None, None, None) @@ -435,126 +383,12 @@ class RpmMetaData: lst.append(data) return lst - def epoch(self): if self.hdr['epoch'] is None: return 0 else: return self.tagByName('epoch') - - def genFileLists(self): - """produces lists of dirs and files for this header in two lists""" - - files = self.listTagByName('filenames') - fileflags = self.listTagByName('fileflags') - filemodes = self.listTagByName('filemodes') - filetuple = zip(files, filemodes, fileflags) - for (file, mode, flag) in filetuple: - #garbage checks - if mode is None or mode == '': - self.filenames.append(file) - continue - if not RpmMetaData.mode_cache.has_key(mode): - RpmMetaData.mode_cache[mode] = stat.S_ISDIR(mode) - if RpmMetaData.mode_cache[mode]: - self.dirnames.append(file) - else: - if flag is None: - self.filenames.append(file) - else: - if (flag & 64): - self.ghostnames.append(file) - continue - self.filenames.append(file) - - - def usefulFiles(self): - """search for good files""" - returns = {} - for item in self.filenames: - if item is None: - continue - for glob in self.filerc: - if glob.match(item): - returns[item] = 1 - return returns - def usefulGhosts(self): - """search for useful ghost file names""" - returns = {} - for item in self.ghostnames: - if item is None: - continue - for glob in self.filerc: - if glob.match(item): - returns[item] = 1 - return returns - - - def usefulDirs(self): - """search for good dirs""" - returns = {} - for item in self.dirnames: - if item is None: - continue - for glob in self.dirrc: - if glob.match(item): - returns[item] = 1 - return returns.keys() - - - def depsList(self): - """returns a list of tuples of dependencies""" - # these should probably compress down duplicates too - lst = [] - names = self.hdr[rpm.RPMTAG_REQUIRENAME] - tmpflags = self.hdr[rpm.RPMTAG_REQUIREFLAGS] - flags = self._correctFlags(tmpflags) - prereq = self._checkPreReq(tmpflags) - ver = self._correctVersion(self.hdr[rpm.RPMTAG_REQUIREVERSION]) - if names is not None: - lst = zip(names, flags, ver, prereq) - return self._uniq(lst) - - def obsoletesList(self): - lst = [] - names = self.hdr[rpm.RPMTAG_OBSOLETENAME] - tmpflags = self.hdr[rpm.RPMTAG_OBSOLETEFLAGS] - flags = self._correctFlags(tmpflags) - ver = self._correctVersion(self.hdr[rpm.RPMTAG_OBSOLETEVERSION]) - if names is not None: - lst = zip(names, flags, ver) - return self._uniq(lst) - - def conflictsList(self): - lst = [] - names = self.hdr[rpm.RPMTAG_CONFLICTNAME] - tmpflags = self.hdr[rpm.RPMTAG_CONFLICTFLAGS] - flags = self._correctFlags(tmpflags) - ver = self._correctVersion(self.hdr[rpm.RPMTAG_CONFLICTVERSION]) - if names is not None: - lst = zip(names, flags, ver) - return self._uniq(lst) - - def providesList(self): - lst = [] - names = self.hdr[rpm.RPMTAG_PROVIDENAME] - tmpflags = self.hdr[rpm.RPMTAG_PROVIDEFLAGS] - flags = self._correctFlags(tmpflags) - ver = self._correctVersion(self.hdr[rpm.RPMTAG_PROVIDEVERSION]) - if names is not None: - lst = zip(names, flags, ver) - return self._uniq(lst) - - def changelogLists(self): - lst = [] - names = self.listTagByName('changelogname') - times = self.listTagByName('changelogtime') - texts = self.listTagByName('changelogtext') - if len(names) > 0: - lst = zip(names, times, texts) - return lst - def doChecksumCache(self, fo): """return a checksum for a package: - check if the checksum cache is enabled @@ -583,161 +417,24 @@ class RpmMetaData: -def generateXML(doc, node, formatns, rpmObj, sumtype): +def generateXML(doc, node, formatns, drpmObj, sumtype): """takes an xml doc object and a package metadata entry node, populates a package node with the md information""" ns = node.ns() pkgNode = node.newChild(None, "package", None) pkgNode.newProp('type', 'rpm') - pkgNode.newChild(None, 'name', rpmObj.tagByName('name')) - pkgNode.newChild(None, 'arch', rpmObj.arch()) + pkgNode.newChild(None, 'name', drpmObj.tagByName('name')) + pkgNode.newChild(None, 'arch', drpmObj.arch()) version = pkgNode.newChild(None, 'version', None) - version.newProp('epoch', str(rpmObj.epoch())) - version.newProp('ver', str(rpmObj.tagByName('version'))) - version.newProp('rel', str(rpmObj.tagByName('release'))) - csum = pkgNode.newChild(None, 'checksum', rpmObj.pkgid) - csum.newProp('type', sumtype) - csum.newProp('pkgid', 'YES') - for tag in ['summary', 'description', 'packager', 'url']: - value = rpmObj.tagByName(tag) - value = utf8String(value) - value = re.sub("\n$", '', value) - entry = pkgNode.newChild(None, tag, None) - entry.addContent(value) - - time = pkgNode.newChild(None, 'time', None) - time.newProp('file', str(rpmObj.mtime)) - time.newProp('build', str(rpmObj.tagByName('buildtime'))) - size = pkgNode.newChild(None, 'size', None) - size.newProp('package', str(rpmObj.size)) - size.newProp('installed', str(rpmObj.tagByName('size'))) - size.newProp('archive', str(rpmObj.tagByName('archivesize'))) - location = pkgNode.newChild(None, 'location', None) - if rpmObj.localurl is not None: - location.newProp('xml:base', rpmObj.localurl) - location.newProp('href', rpmObj.relativepath) - format = pkgNode.newChild(ns, 'format', None) - for tag in ['license', 'vendor', 'group', 'buildhost', 'sourcerpm']: - value = rpmObj.tagByName(tag) - value = utf8String(value) - value = re.sub("\n$", '', value) - entry = format.newChild(formatns, tag, None) - entry.addContent(value) - - hr = format.newChild(formatns, 'header-range', None) - hr.newProp('start', str(rpmObj.rangestart)) - hr.newProp('end', str(rpmObj.rangeend)) - for (lst, nodename) in [(rpmObj.providesList(), 'provides'), - (rpmObj.conflictsList(), 'conflicts'), - (rpmObj.obsoletesList(), 'obsoletes')]: - if len(lst) > 0: - rpconode = format.newChild(formatns, nodename, None) - for (name, flags, (e,v,r)) in lst: - entry = rpconode.newChild(formatns, 'entry', None) - entry.newProp('name', name) - if flags != 0: - if flags == 2: arg = 'LT' - if flags == 4: arg = 'GT' - if flags == 8: arg = 'EQ' - if flags == 10: arg = 'LE' - if flags == 12: arg = 'GE' - entry.newProp('flags', arg) - # if we've got a flag we've got a version, I hope :) - if e: - entry.newProp('epoch', str(e)) - if v: - entry.newProp('ver', str(v)) - if r: - entry.newProp('rel', str(r)) - - depsList = rpmObj.depsList() - if len(depsList) > 0: - rpconode = format.newChild(formatns, 'requires', None) - for (name, flags, (e,v,r), prereq) in depsList: - entry = rpconode.newChild(formatns, 'entry', None) - entry.newProp('name', name) - if flags != 0: - if flags == 2: arg = 'LT' - if flags == 4: arg = 'GT' - if flags == 8: arg = 'EQ' - if flags == 10: arg = 'LE' - if flags == 12: arg = 'GE' - entry.newProp('flags', arg) - # if we've got a flag we've got a version, I hope :) - if e: - entry.newProp('epoch', str(e)) - if v: - entry.newProp('ver', str(v)) - if r: - entry.newProp('rel', str(r)) - if prereq == 1: - entry.newProp('pre', str(prereq)) - - for file in rpmObj.usefulFiles(): - files = format.newChild(None, 'file', None) - file = utf8String(file) - files.addContent(file) - for directory in rpmObj.usefulDirs(): - files = format.newChild(None, 'file', None) - directory = utf8String(directory) - files.addContent(directory) - files.newProp('type', 'dir') - for directory in rpmObj.usefulGhosts(): - files = format.newChild(None, 'file', None) - directory = utf8String(directory) - files.addContent(directory) - files.newProp('type', 'ghost') - + version.newProp('epoch', str(drpmObj.epoch())) + version.newProp('ver', str(drpmObj.tagByName('version'))) + version.newProp('rel', str(drpmObj.tagByName('release'))) return pkgNode - -def fileListXML(doc, node, rpmObj): - pkg = node.newChild(None, 'package', None) - pkg.newProp('pkgid', rpmObj.pkgid) - pkg.newProp('name', rpmObj.tagByName('name')) - pkg.newProp('arch', rpmObj.arch()) - version = pkg.newChild(None, 'version', None) - version.newProp('epoch', str(rpmObj.epoch())) - version.newProp('ver', str(rpmObj.tagByName('version'))) - version.newProp('rel', str(rpmObj.tagByName('release'))) - for file in rpmObj.filenames: - files = pkg.newChild(None, 'file', None) - file = utf8String(file) - files.addContent(file) - for directory in rpmObj.dirnames: - files = pkg.newChild(None, 'file', None) - directory = utf8String(directory) - files.addContent(directory) - files.newProp('type', 'dir') - for ghost in rpmObj.ghostnames: - files = pkg.newChild(None, 'file', None) - ghost = utf8String(ghost) - files.addContent(ghost) - files.newProp('type', 'ghost') - return pkg - -def otherXML(doc, node, rpmObj): - pkg = node.newChild(None, 'package', None) - pkg.newProp('pkgid', rpmObj.pkgid) - pkg.newProp('name', rpmObj.tagByName('name')) - pkg.newProp('arch', rpmObj.arch()) - version = pkg.newChild(None, 'version', None) - version.newProp('epoch', str(rpmObj.epoch())) - version.newProp('ver', str(rpmObj.tagByName('version'))) - version.newProp('rel', str(rpmObj.tagByName('release'))) - clogs = rpmObj.changelogLists() - for (name, time, text) in clogs: - clog = pkg.newChild(None, 'changelog', None) - clog.addContent(utf8String(text)) - clog.newProp('author', utf8String(name)) - clog.newProp('date', str(time)) - return pkg - + def repoXML(node, cmds): """generate the repomd.xml file that stores the info on the other files""" sumtype = cmds['sumtype'] - workfiles = [(cmds['otherfile'], 'other',), - (cmds['filelistsfile'], 'filelists'), - (cmds['primaryfile'], 'primary')] + workfiles = [(cmds['prestofile'], 'deltas')] for (file, ftype) in workfiles: @@ -757,26 +454,3 @@ def repoXML(node, cmds): timestamp = data.newChild(None, 'timestamp', str(timestamp)) unchecksum = data.newChild(None, 'open-checksum', uncsum) unchecksum.newProp('type', sumtype) - - # if we've got a group file then checksum it once and be done - if cmds['groupfile'] is not None: - grpfile = cmds['groupfile'] - timestamp = os.stat(grpfile)[8] - sfile = os.path.basename(grpfile) - fo = open(grpfile, 'r') - output = open(os.path.join(cmds['outputdir'], cmds['tempdir'], sfile), 'w') - output.write(fo.read()) - output.close() - fo.seek(0) - csum = getChecksum(sumtype, fo) - fo.close() - - data = node.newChild(None, 'data', None) - data.newProp('type', 'group') - location = data.newChild(None, 'location', None) - if cmds['baseurl'] is not None: - location.newProp('xml:base', cmds['baseurl']) - location.newProp('href', os.path.join(cmds['finaldir'], sfile)) - checksum = data.newChild(None, 'checksum', csum) - checksum.newProp('type', sumtype) - timestamp = data.newChild(None, 'timestamp', str(timestamp)) |