[yum-cvs] yum/yum packageSack.py, 1.11, 1.12 rpmsack.py, 1.20, 1.21 sqlitesack.py, 1.39, 1.40

Seth Vidal skvidal at linux.duke.edu
Sun Aug 27 20:07:27 UTC 2006


Update of /home/groups/yum/cvs/yum/yum
In directory login1.linux.duke.edu:/tmp/cvs-serv9908/yum

Modified Files:
	packageSack.py rpmsack.py sqlitesack.py 
Log Message:


implement matchPackages() - the equivalent of packages.parsePackages() inside PackageSack.PackageSack
remove repoid optional argument from simplePkgList as it was used nowhere.
store results of anysack.simplePkgList() in anysack.pkglist and return from
there if called multiple times.



Index: packageSack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/packageSack.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- packageSack.py	25 Aug 2006 06:45:20 -0000	1.11
+++ packageSack.py	27 Aug 2006 20:07:25 -0000	1.12
@@ -18,7 +18,9 @@
 from rpmUtils import miscutils
 from packages import YumInstalledPackage
 import warnings
-
+import misc
+import re
+import fnmatch
 
 class PackageSackBase:
     """Base class that provides the interface for PackageSacks."""
@@ -133,6 +135,87 @@
 
     def searchPackages(self, fields, criteria_re, callback):
         raise NotImplementedError()
+    
+    def matchPackages(self, matchlist, casematch=False):
+        """take a list of user strings and match the packages in the sack against it
+           this will match against:
+           name
+           name.arch
+           name-ver-rel.arch
+           name-ver
+           name-ver-rel
+           epoch:name-ver-rel.arch
+           name-epoch:ver-rel.arch
+           
+           it returns 3 lists exactmatch, matched, unmatched
+           exactmatch = package objects matching exactly to the specified input (using no globs)
+           matched = package objects matching via globs
+           unmatched = user input that matched nothing
+           
+           Arguments:
+             matchlist: list
+               list of things to match
+             
+             casematch: Boolean
+                if true then match case sensitively
+                if false then match case insensitively
+                default False
+           """
+        pkgdict = {}
+        # get everything together
+        for pkgtup in self.simplePkgList():
+            (n,a,e,v,r) = pkgtup
+            name = n
+            nameArch = '%s.%s' % (n, a)
+            nameVerRelArch = '%s-%s-%s.%s' % (n, v, r, a)
+            nameVer = '%s-%s' % (n, v)
+            nameVerRel = '%s-%s-%s' % (n, v, r)
+            envra = '%s:%s-%s-%s.%s' % (e, n, v, r, a)
+            nevra = '%s-%s:%s-%s.%s' % (n, e, v, r, a)
+            for item in [name, nameArch, nameVerRelArch, nameVer, nameVerRel, envra, nevra]:
+                if not pkgdict.has_key(item):
+                    pkgdict[item] = []
+                pkgdict[item].append(pkgtup)
+        
+        # match it up
+        exactmatch = []
+        matched = []
+        unmatched = []
+        for input in matchlist:
+            if pkgdict.has_key(input):
+                for matchtup in pkgdict[input]:
+                    exactmatch.extend(self.searchPkgTuple(matchtup))
+                del pkgdict[input]
+            else:
+                # anything we couldn't find a match for
+                # could mean it's not there, could mean it's a wildcard
+                if re.match('.*[\*,\[,\],\{,\},\?].*', input):
+                    trylist = pkgdict.keys()
+                    restring = fnmatch.translate(input)
+                    if casematch:
+                        regex = re.compile(restring) # case sensitive
+                    else:
+                        regex = re.compile(restring, flags=re.I) # case insensitive
+                    foundit = 0
+                    for item in trylist:
+                        if regex.match(item):
+                            for matchtup in pkgdict[item]:
+                                matched.extend(self.searchPkgTuple(matchtup))
+                            del pkgdict[item]
+                            foundit = 1
+     
+                    if not foundit:    
+                        unmatched.append(input)
+                        
+                else:
+                    # we got nada
+                    unmatched.append(input)
+    
+        matched = misc.unique(matched)
+        unmatched = misc.unique(unmatched)
+        exactmatch = misc.unique(exactmatch)
+
+        return exactmatch, matched, unmatched
 
 
 class MetaSack(PackageSackBase):
@@ -227,12 +310,9 @@
            be compared to each other for highest version"""
         return self._computeAggregateListResult("returnNewestByName", name)
 
-    def simplePkgList(self, repoid=None):
-        """returns a list of pkg tuples (n, a, e, v, r) optionally from a
-           single repoid"""
-        if not repoid:
-            return self._computeAggregateListResult("simplePkgList")
-        return self.sacks[repoid].simplePkgList()
+    def simplePkgList(self):
+        """returns a list of pkg tuples (n, a, e, v, r)"""
+        return self._computeAggregateListResult("simplePkgList")
 
     def printPackages(self):
         for sack in self.sacks.values():
@@ -528,11 +608,17 @@
                 
         return highdict.values()
            
-    def simplePkgList(self, repoid=None):
+    def simplePkgList(self):
         """returns a list of pkg tuples (n, a, e, v, r) optionally from a single repoid"""
+        if hasattr(self, 'pkglist'):
+            if self.pkglist:
+                return self.pkglist
+        
         simplelist = []
-        for pkg in self.returnPackages(repoid):
+        for pkg in self.returnPackages():
             simplelist.append(pkg.returnPackageTuple())
+        
+        self.pkglist = simplelist
         return simplelist
                        
     def printPackages(self):

Index: rpmsack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/rpmsack.py,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- rpmsack.py	24 Aug 2006 20:08:16 -0000	1.20
+++ rpmsack.py	27 Aug 2006 20:07:25 -0000	1.21
@@ -144,7 +144,7 @@
     def searchConflicts(self, name):
         return self.searchPrco(name, 'conflicts')
 
-    def simplePkgList(self, repoid=None):
+    def simplePkgList(self):
         return self.pkglist
    
     def installed(self, name=None, arch=None, epoch=None, ver=None, rel=None, po=None):

Index: sqlitesack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/sqlitesack.py,v
retrieving revision 1.39
retrieving revision 1.40
diff -u -r1.39 -r1.40
--- sqlitesack.py	25 Aug 2006 15:57:05 -0000	1.39
+++ sqlitesack.py	27 Aug 2006 20:07:25 -0000	1.40
@@ -389,18 +389,23 @@
                 'url': db.url, 'vendor': db.rpm_vendor, 'license': db.rpm_license }
       return y
 
-    def simplePkgList(self, repoid=None):
-        """returns a list of pkg tuples (n, a, e, v, r) optionally from a single repoid"""
+    def simplePkgList(self):
+        """returns a list of pkg tuples (n, a, e, v, r) from the sack"""
+        
+        if hasattr(self, 'pkglist'):
+            if self.pkglist:
+                return self.pkglist
+            
         simplelist = []
         for (rep,cache) in self.primarydb.items():
-            if (repoid == None or repoid == rep):
-                cur = cache.cursor()
-                cur.execute("select pkgId,name,epoch,version,release,arch from packages")
-                for pkg in cur.fetchall():
-                    if (self.excludes[rep].has_key(pkg.pkgId)):
-                        continue                        
-                    simplelist.append((pkg.name, pkg.arch, pkg.epoch, pkg.version, pkg.release)) 
-                    
+            cur = cache.cursor()
+            cur.execute("select pkgId,name,epoch,version,release,arch from packages")
+            for pkg in cur.fetchall():
+                if (self.excludes[rep].has_key(pkg.pkgId)):
+                    continue                        
+                simplelist.append((pkg.name, pkg.arch, pkg.epoch, pkg.version, pkg.release)) 
+        
+        self.pkglist = simplelist
         return simplelist
 
     def returnNewestByNameArch(self, naTup=None):




More information about the Yum-cvs-commits mailing list