On Fri, Feb 5, 2010 at 11:42 PM, Seth Vidal <skvi...@fedoraproject.org>wrote:
> this patch adds the pkgtags metatadata and the integrates it into our > search mechanism. Completely optional repodata format. > > Also adds a decompress() function from yum.misc that allows for us > to pass files to it and not care what compression mechanism they are using > it's a bit simplistic at the moment but can easily be enhanced. > --- > yum/__init__.py | 72 > ++++++++++++++++++++++++++++++++++++++++++++++++++++++- > yum/misc.py | 25 +++++++++++++++++++ > yum/repos.py | 2 +- > 3 files changed, 97 insertions(+), 2 deletions(-) > > diff --git a/yum/__init__.py b/yum/__init__.py > index 083b445..8b69788 100644 > --- a/yum/__init__.py > +++ b/yum/__init__.py > @@ -44,6 +44,7 @@ import rpmUtils.updates > from rpmUtils.arch import canCoinstall, ArchStorage, isMultiLibArch > import rpmUtils.transaction > import comps > +import pkgtag_db > from repos import RepoStorage > import misc > from parser import ConfigPreProcessor, varReplace > @@ -144,6 +145,7 @@ class YumBase(depsolve.Depsolve): > self._history = None > self._pkgSack = None > self._lockfile = None > + self._tags = None > self.skipped_packages = [] # packages skip by the skip-broken > code > self.logger = logging.getLogger("yum.YumBase") > self.verbose_logger = logging.getLogger("yum.verbose.YumBase") > @@ -719,6 +721,38 @@ class YumBase(depsolve.Depsolve): > self.verbose_logger.debug('group time: %0.3f' % (time.time() - > group_st)) > return self._comps > > + def _getTags(self): > + """ create the tags object used to search/report from the pkgtags > + metadata""" > + > + tag_st = time.time() > + self.verbose_logger.log(logginglevels.DEBUG_4, > + _('Getting pkgtags metadata')) > + > + if self._tags is None: > + self._tags = yum.pkgtag_db.PackageTags() > + > + for repo in self.repos.listEnabled(): > + if 'pkgtags' not in repo.repoXML.fileTypes(): > + continue > + > + self.verbose_logger.log(logginglevels.DEBUG_4, > + _('Adding tags from repository: %s'), repo) > + > + # fetch the sqlite tagdb > + try: > + tag_md = repo.retrieveMD('pkgtags') > + tag_sqlite = yum.misc.decompress(tag_md) > + # feed it into _tags.add() > + self._tags.add(repo.id, tag_sqlite) > + except (Errors.RepoError, Errors.PkgTagsError), e: > + msg = _('Failed to add Pkg Tags for repository: %s - > %s') % (repo, str(e)) > + self.logger.critical(msg) > + > + > + self.verbose_logger.debug('tags time: %0.3f' % (time.time() - > tag_st)) > + return self._tags > + > def _getHistory(self): > """auto create the history object that to access/append the > transaction > history information. """ > @@ -764,6 +798,11 @@ class YumBase(depsolve.Depsolve): > fset=lambda self, value: setattr(self, > "_history",value), > fdel=lambda self: setattr(self, "_history", None), > doc="Yum History Object") > + > + pkgtags = property(fget=lambda self: self._getTags(), > + fset=lambda self, value: setattr(self, > "_tags",value), > + fdel=lambda self: setattr(self, "_tags", None), > + doc="Yum Package Tags Object") > > > def doSackFilelistPopulate(self): > @@ -2076,6 +2115,22 @@ class YumBase(depsolve.Depsolve): > results2sorted_lists(tmpres, sorted_lists) > del tmpres > > + tmpres = self.searchPackageTags(real_crit_lower) > + for pkg in tmpres: > + count = 0 > + matchkeys = [] > + tagresults = [] > + for (match, taglist) in tmpres[pkg]: > + count += len(taglist) > + matchkeys.append(rcl2c[match]) > + tagresults.extend(taglist) > + > + > + if count not in sorted_lists: sorted_lists[count] = [] > + sorted_lists[count].append((pkg, matchkeys, tagresults)) > + > + del tmpres > + > # By default just sort using package sorting > sort_func = operator.itemgetter(0) > if keys: > @@ -2097,7 +2152,22 @@ class YumBase(depsolve.Depsolve): > if not showdups: > yielded[(po.name, po.arch)] = 1 > > - > + def searchPackageTags(self, criteria): > + results = {} # name = [(criteria, taglist)] > + for c in criteria: > + c = c.lower() > + res = self.pkgtags.search_tags(c) > + for (name, taglist) in res.items(): > + pkgs = self.pkgSack.searchNevra(name=name) > + if not pkgs: > + continue > + pkg = pkgs[0] > + if pkg not in results: > + results[pkg] = [] > + results[pkg].append((c, taglist)) > + > + return results > + > def searchPackages(self, fields, criteria, callback=None): > """Search specified fields for matches to criteria > optional callback specified to print out results > diff --git a/yum/misc.py b/yum/misc.py > index 4b0226b..d63993b 100644 > --- a/yum/misc.py > +++ b/yum/misc.py > @@ -17,6 +17,7 @@ import glob > import pwd > import fnmatch > import bz2 > +import gzip > from stat import * > try: > import gpgme > @@ -945,3 +946,27 @@ def get_uuid(savepath): > > return myid > > +def decompress(filename): > + """take a filename and decompress it into the same relative location. > + if the file is not compressed just return the file""" > + out = filename > + if filename.endswith('.gz'): > + out = filename.replace('.gz', '') > + decom = gzip.open(filename) > + fo = open(out, 'w') > + fo.write(decom.read()) > + fo.flush() > + fo.close() > + decom.close() > + elif filename.endswith('.bz') or filename.endswith('.bz2'): > + if filename.endswith('.bz'): > + out = filename.replace('.bz','') > + else: > + out = filename.replace('.bz2', '') > + bunzipFile(filename, out) > + > + #add magical lzma/xz trick here > + > + return out > + > + > diff --git a/yum/repos.py b/yum/repos.py > index c6ebf8f..cd477ba 100644 > --- a/yum/repos.py > +++ b/yum/repos.py > @@ -206,7 +206,7 @@ class RepoStorage: > def setCacheDir(self, cachedir): > """sets the cachedir value in all repos""" > > - self.repos._cachedir = cachedir > + self._cachedir = cachedir > for repo in self.repos.values(): > repo.old_base_cache_dir = repo.basecachedir > repo.basecachedir = cachedir > -- > 1.6.6 > > _______________________________________________ > Yum-devel mailing list > Yum-devel@lists.baseurl.org > http://lists.baseurl.org/mailman/listinfo/yum-devel > ACK
_______________________________________________ Yum-devel mailing list Yum-devel@lists.baseurl.org http://lists.baseurl.org/mailman/listinfo/yum-devel