[yum-cvs] yum-utils repoquery.py, 1.20.2.1, 1.20.2.2 yum-utils.spec, 1.8, 1.8.2.1

Panu Matilainen pmatilai at login.linux.duke.edu
Sat Sep 17 08:52:37 UTC 2005


Update of /home/groups/yum/cvs/yum-utils
In directory login:/tmp/cvs-serv1561

Modified Files:
      Tag: yum-2_4_X
	repoquery.py yum-utils.spec 
Log Message:
Apply repoquery and changelog fixes from HEAD,  mark as 0.3.1.


Index: repoquery.py
===================================================================
RCS file: /home/groups/yum/cvs/yum-utils/repoquery.py,v
retrieving revision 1.20.2.1
retrieving revision 1.20.2.2
diff -u -r1.20.2.1 -r1.20.2.2
--- repoquery.py	25 Aug 2005 19:29:27 -0000	1.20.2.1
+++ repoquery.py	17 Sep 2005 08:52:35 -0000	1.20.2.2
@@ -32,9 +32,10 @@
 import yum.packages
 import repomd.mdErrors
 from rpmUtils.arch import getArchList
+from rpmUtils.miscutils import formatRequire
 from yum.misc import getCacheDir
 
-version = "0.0.10"
+version = "0.0.11"
 
 flags = { 'EQ':'=', 'LT':'<', 'LE':'<=', 'GT':'>', 'GE':'>=', 'None':' '}
 
@@ -92,11 +93,13 @@
         exceptions.Exception.__init__(self)
         self.msg = msg
 
+# abstract class
 class pkgQuery:
     def __init__(self, pkg, qf):
         self.pkg = pkg
         self.qf = qf
         self.name = pkg.name
+        self.classname = None
     
     def __getitem__(self, item):
         if hasattr(self, "fmt_%s" % item):
@@ -113,13 +116,15 @@
             else:
                 raise queryError("Invalid conversion: %s" % conv)
 
+        # this construct is the way it is because pkg.licenses isn't
+        # populated before calling pkg.returnSimple() ?!
         try:
             res = self.pkg.returnSimple(item)
         except KeyError:
             if item == "license":
                 res = ", ".join(self.pkg.licenses)
             else:
-                raise queryError("Invalid querytag: %s" % item)
+                raise queryError("Invalid querytag '%s' for %s" % (item, self.classname))
         if convert:
             res = convert(res)
         return res
@@ -136,20 +141,6 @@
         else:
             raise queryError("Invalid package query: %s" % method)
 
-    def _prco(self, what, **kw):
-        rpdict = {}
-        for rptup in self.pkg.returnPrco(what):
-            (rpn, rpf, (rp,rpv,rpr)) = rptup
-            # rpmlib deps should be handled on their own
-            if rpn[:6] == 'rpmlib':
-                continue
-            if rpf:
-                rpdict["%s %s %s" % (rpn, flags[rpf], rpmevr(rp,rpv,rpr))] = None
-            else:
-                rpdict[rpn] = None
-        return rpdict.keys()
-
-    # these return formatted strings, not lists..
     def fmt_queryformat(self):
 
         if not self.qf:
@@ -163,6 +154,35 @@
         fmt = re.sub(pattern, r'%(\2)\1s', qf)
         return fmt % self
 
+    def fmt_requires(self, **kw):
+        return "\n".join(self.prco('requires'))
+
+    def fmt_provides(self, **kw):
+        return "\n".join(self.prco('provides'))
+
+    def fmt_conflicts(self, **kw):
+        return "\n".join(self.prco('conflicts'))
+
+    def fmt_obsoletes(self, **kw):
+        return "\n".join(self.prco('obsoletes'))
+
+class repoPkgQuery(pkgQuery):
+    def __init__(self, pkg, qf):
+        pkgQuery.__init__(self, pkg, qf)
+        self.classname = 'repo pkg'
+
+    def prco(self, what, **kw):
+        rpdict = {}
+        for rptup in self.pkg.returnPrco(what):
+            (rpn, rpf, (rp,rpv,rpr)) = rptup
+            if rpn.startswith('rpmlib'):
+                continue
+            rpdict[self.pkg.prcoPrintable(rptup)] = None
+    
+        rplist = rpdict.keys()
+        rplist.sort()
+        return rplist
+
     def fmt_list(self, **kw):
         fdict = {}
         for file in self.pkg.returnFileEntries():
@@ -177,17 +197,56 @@
             changelog.append("* %s %s\n%s\n" % (sec2day(date), author, message))
         return "\n".join(changelog)
 
-    def fmt_obsoletes(self, **kw):
-        return "\n".join(self._prco("obsoletes"))
+class instPkgQuery(pkgQuery):
+    # hmm, thought there'd be more things in need of mapping to rpm names :)
+    tagmap = { 'installedsize': 'size',
+             }
 
-    def fmt_provides(self, **kw):
-        return "\n".join(self._prco("provides"))
+    def __init__(self, pkg, qf):
+        pkgQuery.__init__(self, pkg, qf)
+        self.classname = 'installed pkg'
 
-    def fmt_requires(self, **kw):
-        return "\n".join(self._prco("requires"))
+    def __getitem__(self, item):
+        if self.tagmap.has_key(item):
+            return self.pkg.tagByName(self.tagmap[item])
+        else:
+            return pkgQuery.__getitem__(self, item)
+            
+    def prco(self, what, **kw):
+        prcodict = {}
+        # rpm names are without the trailing s :)
+        what = what[:-1]
+
+        names = self.pkg.tagByName('%sname' % what)
+        flags = self.pkg.tagByName('%sflags' % what)
+        ver = self.pkg.tagByName('%sversion' % what)
+        if names is not None:
+            for (n, f, v) in zip(names, flags, ver):
+                req = formatRequire(n, v, f)
+                # filter out rpmlib deps
+                if n.startswith('rpmlib'):
+                    continue
+                prcodict[req] = None
+
+        prcolist = prcodict.keys()
+        prcolist.sort()
+        return prcolist
+    
+    def fmt_list(self, **kw):
+        return "\n".join(self.pkg.tagByName('filenames'))
+
+    def fmt_changelog(self, **kw):
+        changelog = []
+        times = self.pkg.tagByName('changelogtime')
+        names = self.pkg.tagByName('changelogname')
+        texts = self.pkg.tagByName('changelogtext')
+        if times is not None:
+            tmplst = zip(times, names, texts)
+
+            for date, author, message in zip(times, names, texts):
+                changelog.append("* %s %s\n%s\n" % (sec2day(date), author, message))
+        return "\n".join(changelog)
 
-    def fmt_conflicts(self, **kw):
-        return "\n".join(self._prco("conflicts"))
 
 class groupQuery:
     def __init__(self, groupinfo, name, grouppkgs="required"):
@@ -253,11 +312,14 @@
         qf = self.options.queryformat or std_qf["nevra"]
         qpkgs = []
         for pkg in pkgs:
-            qpkg = pkgQuery(pkg, qf)
+            if isinstance(pkg, yum.packages.YumInstalledPackage):
+                qpkg = instPkgQuery(pkg, qf)
+            else:
+                qpkg = repoPkgQuery(pkg, qf)
             qpkgs.append(qpkg)
         return qpkgs
 
-    def returnNewestByName(self, name):
+    def returnByName(self, name):
         pkgs = []
         try:
             exact, match, unmatch = yum.packages.parsePackages(self.returnPkgList(), [name], casematch=1)
@@ -267,17 +329,26 @@
         return self.queryPkgFactory(pkgs)
 
     def returnPkgList(self):
-        what = self.options.pkgnarrow
-        ygh = self.doPackageLists(what)
 
-        if what == "all":
-            return ygh.available + ygh.installed
-        
-        if hasattr(ygh, what):
-            return getattr(ygh, what)
+        pkgs = []
+        if self.options.pkgnarrow == "repos":
+            if self.conf.showdupesfromrepos:
+                pkgs = self.pkgSack.returnPackages()
+            else:
+                pkgs = self.pkgSack.returnNewestByNameArch()
+
         else:
-            self.errorlog(1, "Unknown pkgnarrow method: %s" % what)
-            return []
+            what = self.options.pkgnarrow
+            ygh = self.doPackageLists(what)
+
+            if what == "all":
+                pkgs = ygh.available + ygh.installed
+            elif hasattr(ygh, what):
+                pkgs = getattr(ygh, what)
+            else:
+                self.errorlog(1, "Unknown pkgnarrow method: %s" % what)
+
+        return pkgs
     
     def returnPackagesByDep(self, depstring):
         provider = []
@@ -340,43 +411,43 @@
                     self.errorlog(0, e.msg)
 
     def doQuery(self, method, *args, **kw):
-        return getattr(self, method)(*args, **kw)
+        return getattr(self, "fmt_%s" % method)(*args, **kw)
 
-    def groupmember(self, name, **kw):
+    def fmt_groupmember(self, name, **kw):
         grps = []
         for id in self.groupInfo.grouplist:
             if name in self.groupInfo.allPkgs(id):
                 grps.append(id)
         return grps
 
-    def whatprovides(self, name, **kw):
+    def fmt_whatprovides(self, name, **kw):
         return self.returnPackagesByDep(name)
 
-    def whatrequires(self, name, **kw):
+    def fmt_whatrequires(self, name, **kw):
         pkgs = {}
         provs = [name]
                 
         if self.options.alldeps:
-            for pkg in self.returnNewestByName(name):
-                provs.extend(pkg._prco("provides"))
+            for pkg in self.returnByName(name):
+                provs.extend(pkg.prco("provides"))
 
         for prov in provs:
             for pkg in self.pkgSack.searchRequires(prov):
                 pkgs[pkg.pkgtup] = pkg
         return self.queryPkgFactory(pkgs.values())
 
-    def requires(self, name, **kw):
+    def fmt_requires(self, name, **kw):
         pkgs = {}
         
-        for pkg in self.returnNewestByName(name):
-            for req in pkg._prco("requires"):
+        for pkg in self.returnByName(name):
+            for req in pkg.prco("requires"):
                 for res in self.whatprovides(req):
                     pkgs[res.name] = res
         return pkgs.values()
 
-    def location(self, name):
+    def fmt_location(self, name):
         loc = []
-        for pkg in self.returnNewestByName(name):
+        for pkg in self.returnByName(name):
             repo = self.repos.getRepo(pkg['repoid'])
             loc.append("%s/%s" % (repo.urls[0], pkg['relativepath']))
         return loc
@@ -441,8 +512,8 @@
     parser.add_option("--grouppkgs", default="required", dest="grouppkgs",
                       help="filter which packages (all,optional etc) are shown from groups")
     # other opts
-    parser.add_option("--pkgnarrow", default="all", dest="pkgnarrow",
-                      help="query only installed/available/recent/updates packages")
+    parser.add_option("--pkgnarrow", default="repos", dest="pkgnarrow",
+                      help="limit query to installed / available / recent / updates / extras / available + installed / repository (default) packages")
     parser.add_option("--show-dupes", default=0, action="store_true",
                       help="show all versions of packages")
     parser.add_option("--repoid", default=[], action="append",

Index: yum-utils.spec
===================================================================
RCS file: /home/groups/yum/cvs/yum-utils/yum-utils.spec,v
retrieving revision 1.8
retrieving revision 1.8.2.1
diff -u -r1.8 -r1.8.2.1
--- yum-utils.spec	25 Jul 2005 16:32:38 -0000	1.8
+++ yum-utils.spec	17 Sep 2005 08:52:35 -0000	1.8.2.1
@@ -1,6 +1,6 @@
 Summary: Utilities based around the yum package manager
 Name: yum-utils
-Version: 0.3
+Version: 0.3.1
 Release: 1
 License: GPL
 Group: Development/Tools
@@ -91,6 +91,11 @@
 /usr/lib/yum-plugins
 
 %changelog
+* Sat Sep 17 2005 Panu Matilainen <pmatilai at laiskiainen.org>
+- version 0.3.1
+- various enhancements and fixes to repoquery
+- avoid tracebacks in yumex and pup when changelog plugin is enabled
+
 * Mon Jul 25 2005 Panu Matilainen <pmatilai at laiskiainen.org>
 - bump version to 0.3
 - add yum-changelog subpackage




More information about the Yum-cvs-commits mailing list