[Yum-devel] [PATCH] Be nice and don't traceback when people screw their rpmdb, BZ 522259

James Antill james at and.org
Mon Sep 21 06:16:16 UTC 2009


---
 yum/Errors.py   |    3 +++
 yum/__init__.py |   20 ++++++++++++--------
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/yum/Errors.py b/yum/Errors.py
index 6f0ffe4..3a5aca9 100644
--- a/yum/Errors.py
+++ b/yum/Errors.py
@@ -101,6 +101,9 @@ class RepoMDError(YumBaseError):
 class PackageSackError(YumBaseError):
     pass
 
+class RpmDBError(YumBaseError):
+    pass
+
 class CompsException(YumBaseError):
     pass
 
diff --git a/yum/__init__.py b/yum/__init__.py
index d13f7a9..e5a3898 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -1071,7 +1071,7 @@ class YumBase(depsolve.Depsolve):
                     self.logger.critical(_('%s was supposed to be installed' \
                                            ' but is not!' % txmbr.po))
                     continue
-                po = self.rpmdb.searchPkgTuple(txmbr.pkgtup)[0]
+                po = self.getInstalledPackageObject(txmbr.pkgtup)
                 rpo = txmbr.po
                 po.yumdb_info.from_repo = rpo.repoid
                 po.yumdb_info.reason = txmbr.reason
@@ -1786,7 +1786,7 @@ class YumBase(depsolve.Depsolve):
             for (pkgtup, instTup) in self.up.getObsoletesTuples():
                 (n,a,e,v,r) = pkgtup
                 pkgs = self.pkgSack.searchNevra(name=n, arch=a, ver=v, rel=r, epoch=e)
-                instpo = self.rpmdb.searchPkgTuple(instTup)[0] # the first one
+                instpo = self.getInstalledPackageObject(instTup)
                 for po in pkgs:
                     obsoletes.append(po)
                     obsoletesTuples.append((po, instpo))
@@ -2329,10 +2329,14 @@ class YumBase(depsolve.Depsolve):
         return result
 
     def getInstalledPackageObject(self, pkgtup):
-        """returns a YumInstallPackage object for the pkgtup specified"""
-        warnings.warn(_('getInstalledPackageObject() will go away, use self.rpmdb.searchPkgTuple().\n'),
-                Errors.YumFutureDeprecationWarning, stacklevel=2)
+        """ Returns a YumInstallPackage object for the pkgtup specified, or
+            raises an exception. You should use this instead of
+            searchPkgTuple() if you are assuming there is a value. """
         
+        if len(pkgs) == 0:
+            raise Errors.RpmDBError, _('Package tuple %s could not be found in rpmdb') % str(pkgtup)
+
+        # Dito. FIXME from getPackageObject() for len() > 1 ... :)
         po = self.rpmdb.searchPkgTuple(pkgtup)[0] # take the first one
         return po
         
@@ -2597,7 +2601,7 @@ class YumBase(depsolve.Depsolve):
         if not isinstance(po, YumLocalPackage):
             for (obstup, inst_tup) in self.up.getObsoletersTuples(name=po.name):
                 if po.pkgtup == obstup:
-                    installed_pkg =  self.rpmdb.searchPkgTuple(inst_tup)[0]
+                    installed_pkg =  self.getInstalledPackageObject(inst_tup)
                     yield installed_pkg
         else:
             for (obs_n, obs_f, (obs_e, obs_v, obs_r)) in po.obsoletes:
@@ -2901,7 +2905,7 @@ class YumBase(depsolve.Depsolve):
                 topkg = self._test_loop(obsoleting_pkg, self._pkg2obspkg)
                 if topkg is not None:
                     obsoleting_pkg = topkg
-                installed_pkg =  self.rpmdb.searchPkgTuple(installed)[0]
+                installed_pkg =  self.getInstalledPackageObject(installed)
                 txmbr = self.tsInfo.addObsoleting(obsoleting_pkg, installed_pkg)
                 self.tsInfo.addObsoleted(installed_pkg, obsoleting_pkg)
                 if requiringPo:
@@ -3062,7 +3066,7 @@ class YumBase(depsolve.Depsolve):
                                             updated)
                 
                 else:
-                    updated_pkg =  self.rpmdb.searchPkgTuple(updated)[0]
+                    updated_pkg =  self.getInstalledPackageObject(updated)
                     txmbr = self.tsInfo.addUpdate(available_pkg, updated_pkg)
                     if requiringPo:
                         txmbr.setAsDep(requiringPo)
-- 
1.6.2.5



More information about the Yum-devel mailing list