[yum-git] 2 commits - README.API_CHANGES yum/depsolve.py yum/__init__.py yum/packageSack.py yum/rpmsack.py yum/sqlitesack.py

Florian Festi ffesti at linux.duke.edu
Fri May 23 13:45:45 UTC 2008


 README.API_CHANGES |   11 ++++
 yum/__init__.py    |   12 ----
 yum/depsolve.py    |   42 -----------------
 yum/packageSack.py |   99 ++++++++++------------------------------
 yum/rpmsack.py     |  128 +++++++++++++++--------------------------------------
 yum/sqlitesack.py  |   27 +++--------
 6 files changed, 85 insertions(+), 234 deletions(-)

New commits:
commit e617465ff9769ef7e205c0fc6943b4c2b9d59793
Author: Florian Festi <ffesti at redhat.com>
Date:   Fri May 23 15:40:17 2008 +0200

    PackageSack API cleanup
    Removed
     PackagesSack.search(Provides|Requires|Conflicts|Obsoletes)
     RpmSack.what(Provides|Requires)
     SqliteSack.searchPrco
    Added
     PackagesSack.get(Conflicts|Obsoletes)

diff --git a/README.API_CHANGES b/README.API_CHANGES
new file mode 100644
index 0000000..ae451a8
--- /dev/null
+++ b/README.API_CHANGES
@@ -0,0 +1,11 @@
+
+4.0.0
+=====
+
+Removed:
+
+ * PackageSack.search(Provides|Requires|Conflicts|Obsoletes)
+  * use PackageSack.get* instead
+ * RpmSack(whatProvides|Requires)
+  * use PackageSack.get* instead
+ * SqliteSack.searchPrco
diff --git a/yum/packageSack.py b/yum/packageSack.py
index 975a39b..4aeccbb 100644
--- a/yum/packageSack.py
+++ b/yum/packageSack.py
@@ -88,20 +88,12 @@ class PackageSackBase(object):
         """return dict { packages -> list of matching requires }"""
         raise NotImplementedError()
 
-    def searchRequires(self, name):
-        """return list of package requiring the name (any evr and flag)"""
+    def getConflicts(self, name, flags=None, version=(None, None, None)):
+        """return dict { packages -> list of matching conflicts }"""
         raise NotImplementedError()
 
-    def searchProvides(self, name):
-        """return list of package providing the name (any evr and flag)"""
-        raise NotImplementedError()
-
-    def searchConflicts(self, name):
-        """return list of package conflicting with the name (any evr and flag)"""
-        raise NotImplementedError()
-
-    def searchObsoletes(self, name):
-        """return list of package obsoleting the name (any evr and flag)"""
+    def getObsoletes(self, name, flags=None, version=(None, None, None)):
+        """return dict { packages -> list of matching obsoletes }"""
         raise NotImplementedError()
 
     def returnObsoletes(self, newest=False):
@@ -298,21 +290,13 @@ class MetaSack(PackageSackBase):
         """return dict { packages -> list of matching requires }"""
         return self._computeAggregateDictResult("getRequires", name, flags, version)
 
-    def searchRequires(self, name):
-        """return list of package requiring the name (any evr and flag)"""
-        return self._computeAggregateListResult("searchRequires", name)
-
-    def searchProvides(self, name):
-        """return list of package providing the name (any evr and flag)"""
-        return self._computeAggregateListResult("searchProvides", name)
-
-    def searchConflicts(self, name):
-        """return list of package conflicting with the name (any evr and flag)"""
-        return self._computeAggregateListResult("searchConflicts", name)
+    def getConflicts(self, name, flags=None, version=(None, None, None)):
+        """return dict { packages -> list of matching provides }"""
+        return self._computeAggregateDictResult("getConflicts", name, flags, version)
 
-    def searchObsoletes(self, name):
-        """return list of package obsoleting the name (any evr and flag)"""
-        return self._computeAggregateListResult("searchObsoletes", name)
+    def getObsoletes(self, name, flags=None, version=(None, None, None)):
+        """return dict { packages -> list of matching requires }"""
+        return self._computeAggregateDictResult("getObsoletes", name, flags, version)
 
     def returnObsoletes(self, newest=False):
         """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]"""
@@ -520,14 +504,20 @@ class PackageSack(PackageSackBase):
             result.append(po)
         return result
         
-    def getProvides(self, name, flags=None, version=(None, None, None)):
-        """return dict { packages -> list of matching provides }"""
+    def _getPRCO(self, PRCO, name, flags=None, version=(None, None, None)):
+        """return dict { packages -> list of matching RCO }"""
         self._checkIndexes(failure='build')
         result = { }
-        for po in self.provides.get(name, []):
-            hits = po.matchingPrcos('provides', (name, flags, version))
+        for po in getattr(self, PRCO).get(name, []):
+            hits = po.matchingPrcos(PRCO, (name, flags, version))
             if hits:
                 result[po] = hits
+        return result
+
+    def getProvides(self, name, flags=None, version=(None, None, None)):
+        """return dict { packages -> list of matching provides }"""
+        self._checkIndexes(failure='build')
+        result = self._getPRCO('provides', name, flags, version)
         if name[0] == '/':
             hit = (name, None, (None, None, None))
             for po in self.searchFiles(name):
@@ -535,50 +525,11 @@ class PackageSack(PackageSackBase):
         return result
 
     def getRequires(self, name, flags=None, version=(None, None, None)):
-        """return dict { packages -> list of matching requires }"""
-        self._checkIndexes(failure='build')
-        result = { }
-        for po in self.requires.get(name, []):
-            hits = po.matchingPrcos('requires', (name, flags, version))
-            if hits:
-                result[po] = hits
-        return result
-
-    def searchRequires(self, name):
-        """return list of package requiring the name (any evr and flag)"""
-        self._checkIndexes(failure='build')        
-        if self.requires.has_key(name):
-            return self.requires[name]
-        else:
-            return []
-
-    def searchProvides(self, name):
-        """return list of package providing the name (any evr and flag)"""
-        # FIXME - should this do a pkgobj.checkPrco((name, flag, (e,v,r,))??
-        # has to do a searchFiles and a searchProvides for things starting with /
-        self._checkIndexes(failure='build')        
-        returnList = []
-        if name[0] == '/':
-             returnList.extend(self.searchFiles(name))
-        if self.provides.has_key(name):
-            returnList.extend(self.provides[name])
-        return returnList
-
-    def searchConflicts(self, name):
-        """return list of package conflicting with the name (any evr and flag)"""
-        self._checkIndexes(failure='build')        
-        if self.conflicts.has_key(name):
-            return self.conflicts[name]
-        else:
-            return []
-
-    def searchObsoletes(self, name):
-        """return list of package obsoleting the name (any evr and flag)"""
-        self._checkIndexes(failure='build')        
-        if self.obsoletes.has_key(name):
-            return self.obsoletes[name]
-        else:
-            return []
+        return self._getPRCO('requires', name, flags, version)
+    def getConflicts(self, name, flags=None, version=(None, None, None)):
+        return self._getPRCO('conflicts', name, flags, version)
+    def getObsoletes(self, name, flags=None, version=(None, None, None)):
+        return self._getPRCO('obsoletes', name, flags, version)
 
     def returnObsoletes(self, newest=False):
         """returns a dict of obsoletes dict[obsoleting pkgtuple] = [list of obs]"""
diff --git a/yum/rpmsack.py b/yum/rpmsack.py
index 7b08ab0..5a82e27 100644
--- a/yum/rpmsack.py
+++ b/yum/rpmsack.py
@@ -93,16 +93,11 @@ class RPMDBPackageSack(PackageSackBase):
         self._tup2pkg = {}
         self._completely_loaded = False
         self._simple_pkgtup_list = []
-        self._get_pro_cache = {}
-        self._get_req_cache  = {}
+        self._get_prco_cache = {'provides' : {},
+                                'requires' : {},
+                                'conflicts' : {},
+                                'obsoletes' : {}}
         self.ts = None
-
-        self._cache = {
-            'provides' : { },
-            'requires' : { },
-            'conflicts' : { },
-            'obsoletes' : { },
-            }
         
     def _get_pkglist(self):
         '''Getter for the pkglist property. 
@@ -122,15 +117,9 @@ class RPMDBPackageSack(PackageSackBase):
         self._tup2pkg = {}
         self._completely_loaded = False
         self._simple_pkgtup_list = []
-        self._get_pro_cache = {}
-        self._get_req_cache = {}
+        for cache in self._get_prco_cache.values():
+            cache.clear()
         misc.unshare_data()
-        self._cache = {
-            'provides' : { },
-            'requires' : { },
-            'conflicts' : { },
-            'obsoletes' : { },
-            }
 
     def readOnlyTS(self):
         if not self.ts:
@@ -186,43 +175,6 @@ class RPMDBPackageSack(PackageSackBase):
         result = result.values()
         return result
         
-    def searchPrco(self, name, prcotype):
-
-        result = self._cache[prcotype].get(name)
-        if result is not None:
-            return result
-
-        ts = self.readOnlyTS()
-        result = {}
-        tag = self.DEP_TABLE[prcotype][0]
-        mi = ts.dbMatch(tag, name)
-        for hdr in mi:
-            po = self._makePackageObject(hdr, mi.instance())
-            result[po.pkgid] = po
-        del mi
-
-        # If it's not a provides or filename, we are done
-        if prcotype == 'provides' and name[0] == '/':
-            fileresults = self.searchFiles(name)
-            for pkg in fileresults:
-                result[pkg.pkgid] = pkg
-        
-        result = result.values()
-        self._cache[prcotype][name] = result
-        return result
-
-    def searchProvides(self, name):
-        return self.searchPrco(name, 'provides')
-
-    def searchRequires(self, name):
-        return self.searchPrco(name, 'requires')
-
-    def searchObsoletes(self, name):
-        return self.searchPrco(name, 'obsoletes')
-
-    def searchConflicts(self, name):
-        return self.searchPrco(name, 'conflicts')
-
     def simplePkgList(self):
         return self.pkglist
 
@@ -525,63 +477,57 @@ class RPMDBPackageSack(PackageSackBase):
                    misc.share_data(r_r)))
         return misc.share_data(deptup)
 
-    def getProvides(self, name, flags=None, version=(None, None, None)):
+    def _getPRCO(self, PRCO, name, flags=None, version=(None, None, None)):
         """searches the rpmdb for what provides the arguments
            returns a list of pkgtuples of providing packages, possibly empty"""
 
         name = misc.share_data(name)
         deptup = self._genDeptup(name, flags, version)
-        if deptup in self._get_pro_cache:
-            return self._get_pro_cache[deptup]
+        if deptup in self._get_prco_cache[PRCO]:
+            return self._get_prco_cache[PRCO][deptup]
         r_v = deptup[2][1]
+
+        ts = self.readOnlyTS()
+        result = {}
+        tag = self.DEP_TABLE[prcotype][0]
+        mi = ts.dbMatch(tag, name)
+        for hdr in mi:
+            po = self._makePackageObject(hdr, mi.instance())
+            result[po.pkgid] = po
+        del mi
+
+        # If it's not a provides or filename, we are done
+        if PRCO == 'provides' and name[0] == '/':
+            fileresults = self.searchFiles(name)
+            for pkg in fileresults:
+                result[pkg.pkgid] = pkg
         
-        pkgs = self.searchProvides(name)
-        
-        result = { }
-        
+        pkgs = result.values()
+        result = {}
+
         for po in pkgs:
             if name[0] == '/' and r_v is None:
+                # file dep add all matches to the defSack
                 result[po] = [(name, None, (None, None, None))]
                 continue
-            hits = po.matchingPrcos('provides', deptup)
+            hits = po.matchingPrcos(PRCO, deptup)
             if hits:
                 result[po] = hits
-        self._get_pro_cache[deptup] = result
+        self._get_prco_cache[PRCO][deptup] = result
         return result
 
-    def whatProvides(self, name, flags, version):
-        # XXX deprecate?
-        return [po.pkgtup for po in self.getProvides(name, flags, version)]
+    def getProvides(self, name, flags=None, version=(None, None, None)):
+        return self._getPRCO('provides', name, flags, version)
 
     def getRequires(self, name, flags=None, version=(None, None, None)):
-        """searches the rpmdb for what provides the arguments
-           returns a list of pkgtuples of providing packages, possibly empty"""
-
-        name = misc.share_data(name)
-        deptup = self._genDeptup(name, flags, version)
-        if deptup in self._get_req_cache:
-            return self._get_req_cache[deptup]
-        r_v = deptup[2][1]
+        return self._getPRCO('requires', name, flags, version)
 
-        pkgs = self.searchRequires(name)
+    def getConflicts(self, name, flags=None, version=(None, None, None)):
+        return self._getPRCO('conflicts', name, flags, version)
 
-        result = { }
+    def getObsoletes(self, name, flags=None, version=(None, None, None)):
+        return self._getPRCO('obsoletes', name, flags, version)
 
-        for po in pkgs:
-            if name[0] == '/' and r_v is None:
-                # file dep add all matches to the defSack
-                result[po] = [(name, None, (None, None, None))]
-                continue
-            hits = po.matchingPrcos('requires', deptup)
-            if hits:
-                result[po] = hits
-        self._get_req_cache[deptup] = result
-        return result
-
-    def whatRequires(self, name, flags, version):
-        # XXX deprecate?
-        return [po.pkgtup for po in self.getRequires(name, flags, version)]
-            
 def main():
     sack = RPMDBPackageSack('/')
     for p in sack.simplePkgList():
diff --git a/yum/sqlitesack.py b/yum/sqlitesack.py
index 0b5d3e1..786f06a 100644
--- a/yum/sqlitesack.py
+++ b/yum/sqlitesack.py
@@ -414,7 +414,7 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
     # or provide a file containing name 
     def searchAll(self,name, query_type='like'):
         # this function is just silly and it reduces down to just this
-        return self.searchPrco(name, 'provides')
+        return self._searchPrco(name, 'provides')
 
     def _sql_pkgKey2po(self, repo, cur, pkgs=None):
         """ Takes a cursor and maps the pkgKey rows into a list of packages. """
@@ -747,9 +747,15 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
     def getRequires(self, name, flags=None, version=(None, None, None)):
         return self._search("requires", name, flags, version)
 
+    def getConflicts(self, name, flags=None, version=(None, None, None)):
+        return self._search("conflicts", name, flags, version)
+
+    def getObsoletes(self, name, flags=None, version=(None, None, None)):
+        return self._search("obsoletes", name, flags, version)
+
     
     @catchSqliteException
-    def searchPrco(self, name, prcotype):
+    def _searchPrco(self, name, prcotype):
         """return list of packages having prcotype name (any evr and flag)"""
         glob = True
         querytype = 'glob'
@@ -830,23 +836,6 @@ class YumSqlitePackageSack(yumRepo.YumPackageSack):
         
         #~ return results
 
-    def searchProvides(self, name):
-        """return list of packages providing name (any evr and flag)"""
-        return self.searchPrco(name, "provides")
-                
-    def searchRequires(self, name):
-        """return list of packages requiring name (any evr and flag)"""
-        return self.searchPrco(name, "requires")
-
-    def searchObsoletes(self, name):
-        """return list of packages obsoleting name (any evr and flag)"""
-        return self.searchPrco(name, "obsoletes")
-
-    def searchConflicts(self, name):
-        """return list of packages conflicting with name (any evr and flag)"""
-        return self.searchPrco(name, "conflicts")
-
-
     def db2class(self, db, nevra_only=False):
         print 'die die die die die db2class'
         pass
commit 8ac246a33310a9f516b04a9b7c81631d54fe003f
Author: Florian Festi <ffesti at redhat.com>
Date:   Fri Nov 30 15:02:39 2007 +0100

    Remove Depsolve.whatProvides

diff --git a/yum/__init__.py b/yum/__init__.py
index cd75ced..1be6237 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1485,12 +1485,7 @@ class YumBase(depsolve.Depsolve):
                 if r.startswith('rpmlib('):
                     continue
                 
-                satisfiers = []
-
-                for po in self.whatProvides(r, f, v):
-                    satisfiers.append(po)
-
-                pkgresults[req] = satisfiers
+                pkgresults[req] = self.pkgs.getProvides(r, f, v).keys()
         
         return results
     
@@ -1961,10 +1956,7 @@ class YumBase(depsolve.Depsolve):
                     raise Errors.YumBaseError, _('Invalid version flag')
                 depflags = SYMBOLFLAGS[flagsymbol]
                 
-        sack = self.whatProvides(depname, depflags, depver)
-        results = sack.returnPackages()
-        return results
-        
+        return self.pkgSack.getProvides(depname, depflags, depver).keys()
 
     def returnPackageByDep(self, depstring):
         """Pass in a generic [build]require string and this function will 
diff --git a/yum/depsolve.py b/yum/depsolve.py
index a08f481..5bc3c7f 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -141,45 +141,6 @@ class Depsolve(object):
         for flag in self.tsInfo.probFilterFlags:
             probfilter |= flag
         self._ts.setProbFilter(probfilter)
-
-    def whatProvides(self, name, flags, version):
-        """searches the packageSacks for what provides the arguments
-           returns a ListPackageSack of providing packages, possibly empty"""
-
-        self.verbose_logger.log(logginglevels.DEBUG_1, _('Searching pkgSack for dep: %s'),
-            name)
-        # 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.
-        if name[0] == '/':
-            if not misc.re_primary_filename(name):
-                self.doSackFilelistPopulate()
-            
-        pkgs = self.pkgSack.searchProvides(name)
-        
-        
-        if flags == 0:
-            flags = None
-        if type(version) in (types.StringType, types.NoneType, types.UnicodeType):
-            (r_e, r_v, r_r) = rpmUtils.miscutils.stringToVersion(version)
-        elif type(version) in (types.TupleType, types.ListType): # would this ever be a ListType?
-            (r_e, r_v, r_r) = version
-        
-        defSack = ListPackageSack() # holder for items definitely providing this dep
-        
-        for po in pkgs:
-            self.verbose_logger.log(logginglevels.DEBUG_2,
-                _('Potential match for %s from %s'), name, po)
-            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)
-                self.verbose_logger.debug(_('Matched %s to require for %s'), po, name)
-        
-        return defSack
         
     def allowedMultipleInstalls(self, po):
         """takes a packageObject, returns 1 or 0 depending on if the package 
@@ -427,7 +388,8 @@ class Depsolve(object):
         #                   - if they are the same
         #                       - be confused but continue
 
-        provSack = self.whatProvides(needname, needflags, needversion)
+        provSack = ListPackageSack(self.pkgSack.getProvides(
+                needname, needflags or None, rpmUtils.miscutils.stringToVersion(needversion)))
 
         # get rid of things that are already in the rpmdb - b/c it's pointless to use them here
 



More information about the Yum-cvs-commits mailing list