[yum-git] yum/__init__.py yum/rpmsack.py

James Antill james at linux.duke.edu
Tue Mar 25 22:57:09 UTC 2008


 yum/__init__.py |    2 +-
 yum/rpmsack.py  |   39 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 39 insertions(+), 2 deletions(-)

New commits:
commit 3cae57427bbe93681140f6d11f983905a4c04c97
Author: James Antill <james at and.org>
Date:   Tue Mar 25 18:56:34 2008 -0400

    Push pkg matching down to rpmsack, roughly 0.3 and 15MB better for list

diff --git a/yum/__init__.py b/yum/__init__.py
index 600d7f1..b6433d7 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1306,7 +1306,7 @@ class YumBase(depsolve.Depsolve):
         # list all packages - those installed and available, don't 'think about it'
         if pkgnarrow == 'all': 
             dinst = {}
-            for po in self.rpmdb:
+            for po in self.rpmdb.returnPackages(patterns=patterns):
                 dinst[po.pkgtup] = po;
             installed = dinst.values()
                         
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index a839daa..07b62f5 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -24,6 +24,10 @@ import Errors
 from packages import YumInstalledPackage
 from packageSack import PackageSackBase
 
+# For returnPackages(patterns=)
+import fnmatch
+import re
+
 class RPMInstalledPackage(YumInstalledPackage):
 
     def __init__(self, rpmhdr, index, rpmdb):
@@ -235,10 +239,43 @@ class RPMDBPackageSack(PackageSackBase):
 
         return misc.newestInList(allpkgs)
 
+    @staticmethod
+    def _compile_patterns(patterns):
+        if patterns is None:
+            return None
+        ret = []
+        for pat in patterns:
+            ret.append(re.compile(fnmatch.translate(pat)))
+        return ret
+    @staticmethod
+    def _match_repattern(repatterns, hdr):
+        if repatterns is None:
+            return True
+        for repat in repatterns:
+            if repat.match(hdr['name']):
+                return True
+            if repat.match("%(name)s-%(version)s-%(release)s.%(arch)s" % hdr):
+                return True
+            if repat.match("%(name)s.%(arch)s" % hdr):
+                return True
+            if repat.match("%(name)s-%(version)s" % hdr):
+                return True
+            if repat.match("%(name)s-%(version)s-%(release)s" % hdr):
+                return True
+            if repat.match("%(epoch)s:%(name)s-%(version)s-%(release)s.%(arch)s"
+                           % hdr):
+                return True
+            if repat.match("%(name)s-%(epoch)s:%(version)s-%(release)s.%(arch)s"
+                           % hdr):
+                return True
+        return False
+
     def returnPackages(self, repoid=None, patterns=None):
         if not self._completely_loaded:
+            rpats = self._compile_patterns(patterns)
             for hdr, idx in self._all_packages():
-                self._makePackageObject(hdr, idx)
+                if self._match_repattern(rpats, hdr):
+                    self._makePackageObject(hdr, idx)
             self._completely_loaded = True
         return self._idx2pkg.values()
 



More information about the Yum-cvs-commits mailing list