[yum-cvs] yum-utils repoquery.py,1.4,1.5

Panu Matilainen pmatilai at login.linux.duke.edu
Tue May 31 18:56:34 UTC 2005


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

Modified Files:
	repoquery.py 
Log Message:
More repoquery stuff:
- add option to run from cache only
- get rid of the ugly runtime extensions to yum.AvailablePackage class, 
  generating new pkgQuery instances seems to be just as fast in practice


Index: repoquery.py
===================================================================
RCS file: /home/groups/yum/cvs/yum-utils/repoquery.py,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- repoquery.py	31 May 2005 17:41:55 -0000	1.4
+++ repoquery.py	31 May 2005 18:56:31 -0000	1.5
@@ -63,74 +63,79 @@
         rt = "-%s" % r
     return "%s%s%s" % (et, vt, rt)
 
-# Runtime extensions to YumAvailablePackage class
-def pkgGetitem(self, item):
-    res = None
-    try:
-        res = self.returnSimple(item)
-    except KeyError:
-        if item == "license":
-            res = " ".join(self.licenses)
-    return res
-
-def pkgDoQuery(self, method, *args, **kw):
-    if std_qf.has_key(method):
-        self.qf = std_qf[method]
-        return self.queryformat()
-    else:
-        return getattr(self, method)(*args, **kw)
+class pkgQuery:
+    def __init__(self, pkg, qf):
+        self.pkg = pkg
+        self.qf = qf
+        self.name = pkg.name
+    
+    def __getitem__(self, item):
+        res = None
+        try:
+            res = self.pkg.returnSimple(item)
+        except KeyError:
+            if item == "license":
+                res = " ".join(self.licenses)
+        return res
 
-def pkgPrco(self, what, **kw):
-    rpdict = {}
-    for rptup in self.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
+    def doQuery(self, method, *args, **kw):
+        if std_qf.has_key(method):
+            self.qf = std_qf[method]
+            return self.queryformat()
         else:
-            rpdict[rpn] = None
-    return rpdict.keys()
+            return getattr(self, method)(*args, **kw)
 
-# these return formatted strings, not lists..
-def fmtQueryformat(self):
+    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 queryformat(self):
+
+        if not self.qf:
+            qf = std_qf["nevra"]
+        else:
+            qf = self.qf
 
-    if not self.qf:
-        qf = std_qf["nevra"]
-    else:
-        qf = self.qf
-
-    qf = qf.replace("\\n", "\n")
-    pattern = re.compile('%{(\w*?)}')
-    fmt = re.sub(pattern, r'%(\1)s', qf)
-    return fmt % self
-
-def fmtList(self, **kw):
-    fdict = {}
-    for file in self.returnFileEntries():
-        fdict[file] = None
-    files = fdict.keys()
-    files.sort()
-    return "\n".join(files)
-
-def fmtChangelog(self, **kw):
-    changelog = []
-    for date, author, message in self.returnChangelog():
-        changelog.append("* %s %s\n%s\n" % (time.ctime(int(date)), author, message))
-    return "\n".join(changelog)
-
-def fmtObsoletes(self, **kw):
-    return "\n".join(self._prco("obsoletes"))
+        qf = qf.replace("\\n", "\n")
+        pattern = re.compile('%{(\w*?)}')
+        fmt = re.sub(pattern, r'%(\1)s', qf)
+        return fmt % self
+
+    def list(self, **kw):
+        fdict = {}
+        for file in self.pkg.returnFileEntries():
+            fdict[file] = None
+        files = fdict.keys()
+        files.sort()
+        return "\n".join(files)
+
+    def changelog(self, **kw):
+        changelog = []
+        for date, author, message in self.pkg.returnChangelog():
+            changelog.append("* %s %s\n%s\n" % (time.ctime(int(date)), author, message))
+        return "\n".join(changelog)
+
+    def obsoletes(self, **kw):
+        return "\n".join(self.pkg._prco("obsoletes"))
 
-def fmtProvides(self, **kw):
-    return "\n".join(self._prco("provides", **kw))
+    def provides(self, **kw):
+        return "\n".join(self.pkg._prco("provides", **kw))
 
-def fmtRequires(self, **kw):
-    return "\n".join(self._prco("requires", **kw))
+    def requires(self, **kw):
+        return "\n".join(self.pkg._prco("requires", **kw))
 
-def fmtConflicts(self, **kw):
-    return "\n".join(self._prco("conflicts", **kw))
+    def conflicts(self, **kw):
+        return "\n".join(self.pkg._prco("conflicts", **kw))
 
 class groupQuery:
     def __init__(self, groupinfo, name, grouppkgs="required"):
@@ -177,24 +182,6 @@
         self.pkgops = pkgops
         self.sackops = sackops
 
-    def extendPkgClass(self):
-        setattr(self.pkgSack.pc, "__getitem__", pkgGetitem)
-        setattr(self.pkgSack.pc, "__str__", fmtQueryformat)
-        setattr(self.pkgSack.pc, "__repr__", fmtQueryformat)
-        setattr(self.pkgSack.pc, "_prco", pkgPrco)
-        setattr(self.pkgSack.pc, "doQuery", pkgDoQuery)
-        setattr(self.pkgSack.pc, "queryformat", fmtQueryformat)
-        setattr(self.pkgSack.pc, "list", fmtList)
-        setattr(self.pkgSack.pc, "requires", fmtRequires)
-        setattr(self.pkgSack.pc, "provides", fmtProvides)
-        setattr(self.pkgSack.pc, "conflicts", fmtConflicts)
-        setattr(self.pkgSack.pc, "obsoletes", fmtObsoletes)
-        # XXX there's already "changelog" attribute in pkg class
-        setattr(self.pkgSack.pc, "xchangelog", fmtChangelog)
-
-        qf = self.options.queryformat or std_qf["nevra"]
-        setattr(self.pkgSack.pc, "qf", qf)
-
     # dont log anything..
     def log(self, value, msg):
         pass
@@ -203,6 +190,14 @@
         if not self.options.quiet:
             print >> sys.stderr, msg
 
+    def queryPkgFactory(self, pkgs):
+        qf = self.options.queryformat or std_qf["nevra"]
+        qpkgs = []
+        for pkg in pkgs:
+            qpkg = pkgQuery(pkg, qf)
+            qpkgs.append(qpkg)
+        return qpkgs
+
     def returnItems(self):
         if self.options.group:
             grps = []
@@ -212,7 +207,7 @@
                 grps.append(grp)
             return grps
         else:
-            return self.pkgSack.returnNewestByNameArch()
+            return self.queryPkgFactory(self.pkgSack.returnNewestByNameArch())
 
     def returnNewestByName(self, name):
         pkgs = []
@@ -220,7 +215,7 @@
             pkgs = self.pkgSack.returnNewestByName(name)
         except repomd.mdErrors.PackageSackError, err:
             self.errorlog(0, err)
-        return pkgs
+        return self.queryPkgFactory(pkgs)
 
     def returnPackageByDep(self, depstring):
         provider = []
@@ -228,7 +223,7 @@
             provider.append(yum.YumBase.returnPackageByDep(self, depstring))
         except yum.Errors.YumBaseError, err:
             self.errorlog(0, "No package provides %s" % depstring)
-        return provider
+        return self.queryPkgFactory(provider)
 
     def matchPkgs(self, regexs):
         if not regexs:
@@ -244,8 +239,10 @@
                 else:
                     notfound[expr] = None
 
-        for expr in notfound.keys():
-            self.errorlog(0, 'No match found for %s' % expr)
+        # This catches too many innocent victims which aren't packages at all
+        # so disabling for now
+        #for expr in notfound.keys():
+        #    self.errorlog(0, 'No match found for %s' % expr)
 
         return pkgs
 
@@ -294,9 +291,10 @@
         return pkgs.values()
 
     def location(self, name):
+        print "XXXXX", name
         loc = []
         for pkg in self.returnNewestByName(name):
-            repo = self.repos.getRepo(pkg.simple['repoid'])
+            repo = self.repos.getRepo(pkg['repoid'])
             loc.append("%s/%s" % (repo.urls[0], pkg['relativepath']))
         return loc
 
@@ -363,6 +361,8 @@
                       help="show program version and exit")
     parser.add_option("--quiet", default=0, action="store_true", 
                       help="quiet (no output to stderr)")
+    parser.add_option("-C", "--cache", default=0, action="store_true",
+                      help="run from cache only")
 
     (opts, regexs) = parser.parse_args()
     if opts.version:
@@ -422,9 +422,9 @@
     repoq = YumBaseQuery(pkgops, sackops, opts)
     repoq.doConfigSetup()
     
-    if os.geteuid() != 0:
+    if os.geteuid() != 0 or opts.cache:
         repoq.conf.setConfigOption('cache', 1)
-        repoq.errorlog(0, 'Not running as root, might not be able to import all of cache.')
+        repoq.errorlog(0, 'Running from cache, results might be out of date.')
     
     if len(opts.repoid) > 0:
         for repo in repoq.repos.findRepos('*'):
@@ -444,7 +444,6 @@
         repoq.doTsSetup()
         repoq.doGroupSetup()
 
-    repoq.extendPkgClass()
     repoq.runQuery(regexs)
 
 if __name__ == "__main__":




More information about the Yum-cvs-commits mailing list