[yum-cvs] yum/yum rpmsack.py,1.5,1.6

Seth Vidal skvidal at linux.duke.edu
Thu Aug 17 05:51:52 UTC 2006


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

Modified Files:
	rpmsack.py 
Log Message:

- fix up rpmsack to be able to be have more like RpmDBHolder.
- make rpmsack.whatProvides() mostly work.

a little more and we should be able to swap out then start cleaning up.


Index: rpmsack.py
===================================================================
RCS file: /home/groups/yum/cvs/yum/yum/rpmsack.py,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- rpmsack.py	5 Jul 2006 13:31:53 -0000	1.5
+++ rpmsack.py	17 Aug 2006 05:51:50 -0000	1.6
@@ -19,16 +19,21 @@
 # pkglist and tuples point to match iterator indexes for quick access
 
 import rpm
+import types
+
 from Errors import PackageSackError
 from rpmUtils import miscutils
 import misc
 from packages import YumInstalledPackage
+from packageSack import ListPackageSack
+
 
 class RPMDBPackageSack:
 
     def __init__(self, ts):
         self.excludes = {}
         self.ts = ts
+        self.pkglist = []
         self.dep_table = { 'requires'  : (rpm.RPMTAG_REQUIRENAME,
                                           rpm.RPMTAG_REQUIREVERSION,
                                           rpm.RPMTAG_REQUIREFLAGS),
@@ -68,6 +73,9 @@
             self.header_indexes[pkgtuple].append(mi.instance())
         
         self.pkglist = self.header_indexes.keys()
+        #FIXME compatibility only - remove once all of rpmUtils/__init__ is no longer used
+        self.pkglists = self.pkglist
+        
         del mi
 
     def _checkIndexes(self, failure='error'):
@@ -84,68 +92,36 @@
         mi = self.ts.dbMatch()
         mi.pattern(table[0], rpm.RPMMIRE_GLOB, name)
         for hdr in mi:
-            pkg = hdr2class(hdr)
-            if not result.has_key(pkg.pkgId):
-                result[pkg.pkgId] = pkg
+            pkg = YumInstalledPackage(hdr)
+            if not result.has_key(pkg.pkgid):
+                result[pkg.pkgid] = pkg
 
         # FIXME
         # check filelists/dirlists
         
         return result.values()
 
-    def returnObsoletes(self):
-        obsoletes = {}
-
-        tags = self.dep_table['obsoletes']
-        mi = self.ts.dbMatch()
-        for hdr in mi:
-            if not len(hdr[rpm.RPMTAG_OBSOLETENAMES]):
-                continue
-
-            key = (hdr[rpm.RPMTAG_NAME],
-                   hdr[rpm.RPMTAG_ARCH],
-                   hdr[rpm.RPMTAG_EPOCH],
-                   hdr[rpm.RPMTAG_VERSION],
-                   hdr[rpm.RPMTAG_RELEASE])
-
-            obsoletes[key] = self._getDependencies(hdr, tags)
-
-        return obsoletes
-
 
     def searchPrco(self, name, prcotype):
-        result = []
+        result = {}
         table = self.dep_table[prcotype]
-        mi = self.ts.dbMatch()
-        mi.pattern(table[0], rpm.RPMMIRE_STRCMP, name)
+        mi = self.ts.dbMatch(table[0], name)
+        #mi.pattern(table[0], rpm.RPMMIRE_STRCMP, name)
         for hdr in mi:
-            pkg = self.hdr2class(hdr, True)
-            names = hdr[table[0]]
-            vers = hdr[table[1]]
-            flags = hdr[table[2]]
-
-            for i in range(0, len(names)):
-                n = names[i]
-                if n != name:
-                    continue
-
-                (e, v, r) = miscutils.stringToVersion(vers[i])
-                pkg.prco = {prcotype: [{'name' : name,
-                                        'flags' : self._parseFlags (flags[i]),
-                                        'epoch' : e,
-                                        'ver' : v,
-                                        'rel' : r}
-                                       ]
-                            }
-                result.append(pkg)
-
+            po = YumInstalledPackage(hdr)
+            prcotup = (name, None, (None, None, None))
+            if po.checkPrco(prcotype, prcotup):
+                if not result.has_key(po.pkgid):
+                    result[po.pkgid] = po
+            
             # If it's not a provides or filename, we are done
             if prcotype != 'provides' or name[0] != '/':
-                return result
+                if not result.has_key(po.pkgid):
+                    result[po.pkgid] = po
 
             # FIXME: Search package files
 
-        return result
+        return result.values()
 
     def searchProvides(self, name):
         return self.searchPrco(name, 'provides')
@@ -161,7 +137,8 @@
 
     def simplePkgList(self, repoid=None):
         return self.pkglist
-
+    
+        
     def returnNewestByNameArch(self, naTup=None):
         if not naTup:
             return
@@ -172,7 +149,7 @@
         arch = naTup[1]
         for hdr in mi:
             if hdr[rpm.RPMTAG_ARCH] == arch:
-                allpkg.append(self.hdr2tuple (hdr))
+                allpkg.append(self._hdr2pkgTuple(hdr))
 
         if not allpkg:
             # FIXME: raise  ...
@@ -251,47 +228,12 @@
 
     # Helper functions
 
-    def _parseFlags(self, flags):
-        flagstr = ''
-        if flags & rpm.RPMSENSE_LESS:
-            flagstr += '<'
-        if flags & rpm.RPMSENSE_GREATER:
-            flagstr += '>'
-        if flags & rpm.RPMSENSE_EQUAL:
-            flagstr += '='
-        return flagstr
-
-    def _getDependencies(self, hdr, tags):
-        # tags is a tuple containing 3 rpm tags:
-        # first one to get dep names, the 2nd to get dep versions,
-        # and the 3rd to get dep flags
-        deps = []
-
-        names = hdr[tags[0]]
-        vers  = hdr[tags[1]]
-        flags = hdr[tags[2]]
-
-        for i in range(0, len(names)):
-            deps.append(names[i],
-                        self._parseFlags(flags[i]),
-                        miscutils.stringToVersion(vers[i]))
-
-        return deps
-
     def mi2list(self, mi):
         returnList = []
         for hdr in mi:
             returnList.append(YumInstalledPackage(hdr))
         return returnList
 
-    def hdr2tuple(self, hdr):
-        return (hdr[rpm.RPMTAG_SHA1HEADER],
-                hdr[rpm.RPMTAG_NAME],
-                hdr[rpm.RPMTAG_EPOCH],
-                hdr[rpm.RPMTAG_VERSION],
-                hdr[rpm.RPMTAG_RELEASE],
-                hdr[rpm.RPMTAG_ARCH])
-
     def hdrByindex(self, index):
         mi = self.ts.dbMatch(0, index)
         hdr = mi.next()
@@ -320,6 +262,107 @@
     
         return (name, arch, epoch, ver, rel)
 
+    # deprecated options for compat only - remove once rpmdb is converted:
+    def getPkgList(self):
+        #FIXME - emit deprecation notice
+        return self.pkglist
+
+    def getHdrList(self):
+        #FIXME - emit deprecation notice
+        hdrlist = []
+        for pkg in self.header_indexes.keys():
+            for idx in self.header_indexes[pkg]:
+                hdr = self.hdrByindex(idx)
+                hdrlist.append(hdr)
+        return hdrlist
+
+    def getNameArchPkgList(self):
+        #FIXME - emit deprecation notice    
+        lst = []
+        for (name, arch, epoch, ver, rel) in self.pkglists:
+            lst.append((name, arch))
+        
+        return miscutils.unique(lst)
+        
+        
+    def getNamePkgList(self):
+        #FIXME - emit deprecation notice
+        lst = []
+        for (name, arch, epoch, ver, rel) in self.pkglists:
+            lst.append(name)
+            
+        return miscutils.unique(lst)
+
+    def installed(self, name=None, arch=None, epoch=None, ver=None, rel=None):
+        #FIXME - emit deprecation notice    
+        if len(self.searchNevra(name=name, arch=arch, epoch=epoch, ver=ver, rel=rel)) > 0:
+            return 1
+        return 0
+    
+    def returnTupleByKeyword(self, name=None, arch=None, epoch=None, ver=None, rel=None):
+        #FIXME - emit deprecation notice        
+        lst = self.searchNevra(name=name, arch=arch, epoch=epoch, ver=ver, rel=rel)
+        returnlist = []
+        for po in lst:
+            returnlist.append(po.pkgtup)
+        
+        return returnlist
+
+    def returnHeaderByTuple(self, pkgtuple):
+        #FIXME - emit deprecation notice        
+        """returns a list of header(s) based on the pkgtuple provided"""
+        
+        (n, a, e, v, r) = pkgtuple
+        
+        lst = self.searchNevra(name=n, arch=a, epoch=e, ver=v, rel=r)
+        if len(lst) > 0:
+            item = lst[0]
+            return [item.hdr]
+            
+        else:
+            return []
+
+    
+    def addDB(self, ts):
+        self.ts = ts
+        self.buildIndexes()
+
+    def whatProvides(self, name, flags, version):
+        """searches the rpmdb for what provides the arguments
+           returns a list of pkgtuples of providing packages, possibly empty"""
+
+        # we need to check the name - if it doesn't match:
+        # /etc/* bin/* or /usr/lib/sendmail then we should fetch the 
+        # filelists.xml for all repos to make the searchProvides more complete.
+        pkgs = self.searchProvides(name)
+        
+        
+        if flags == 0:
+            flags = None
+        if type(version) is types.StringType:
+            (r_e, r_v, r_r) = miscutils.stringToVersion(version)
+        elif type(version) in (types.TupleType, types.ListType): # would this ever be a ListType?
+            (r_e, r_v, r_r) = version
+        elif type(version) is types.NoneType:
+            r_e = r_v = r_r = None
+        
+        defSack = ListPackageSack() # holder for items definitely providing this dep
+        
+        for po in pkgs:
+            if name[0] == '/' and r_v is None:
+                # file dep add all matches to the defSack
+                defSack.addPackage(po)
+                continue
+
+            if po.checkPrco('provides', (name, flags, (r_e, r_v, r_r))):
+                defSack.addPackage(po)
+        
+        returnlist = []
+        for pkg in defSack.returnPackages():
+            returnlist.append(pkg.pkgtup)
+        
+        return returnlist
+            
 
 def main():
     ts = rpm.TransactionSet('/')




More information about the Yum-cvs-commits mailing list