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

James Antill james at and.org
Fri Sep 18 15:30:38 UTC 2009


---
 yum/__init__.py |   15 ++++++++++++---
 1 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/yum/__init__.py b/yum/__init__.py
index d13f7a9..c5ca780 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -2592,12 +2592,21 @@ class YumBase(depsolve.Depsolve):
             pkgnames.update(thisgroup.packages)
         return self.pkgSack.searchNames(pkgnames)
 
+    def _safeInstPkgObj(self, pkgtup):
+        """ This gets the first package object for a pkgtup which should be
+            installed. We just don't blow up if it's not there (usually
+            because someone as screwed their rpmdb). """
+        ret = self.rpmdb.searchPkgTuple(pkgtup)
+        if not ret:
+            raise Errors.InstallError, _('No match for pkgtup %s in rpmdb') % str(pkgtup)
+        return ret[0]
+
     def _find_obsoletees(self, po):
         """ Return the pkgs. that are obsoleted by the po we pass in. """
         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._safeInstPkgObj(inst_tup)
                     yield installed_pkg
         else:
             for (obs_n, obs_f, (obs_e, obs_v, obs_r)) in po.obsoletes:
@@ -2901,7 +2910,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._safeInstPkgObj(installed)
                 txmbr = self.tsInfo.addObsoleting(obsoleting_pkg, installed_pkg)
                 self.tsInfo.addObsoleted(installed_pkg, obsoleting_pkg)
                 if requiringPo:
@@ -3062,7 +3071,7 @@ class YumBase(depsolve.Depsolve):
                                             updated)
                 
                 else:
-                    updated_pkg =  self.rpmdb.searchPkgTuple(updated)[0]
+                    updated_pkg =  self._safeInstPkgObj(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