Moves the old check transaction obsoletes code here too.

 Fixes the (now pretty old) installed obsoletes testcases, and thus.
make check works again and can be turned on. BZ 907401.
---
 yum/depsolve.py |   95 ++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 66 insertions(+), 29 deletions(-)

diff --git a/yum/depsolve.py b/yum/depsolve.py
index 500a0b9..9230b72 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -900,35 +900,10 @@ class Depsolve(object):
                     if checkdep:
                         break # The next conflict might be the same pkg
 
-                # check Obsoletes
-                #  Atm. This is _just_ checking for transaction members which
-                # obsolete each other. Because rpm will now auto. obs. those
-                # anyway. We _don't_ check for installed pkgs. which might obs.
-                # something to be installed, even though rpm will also do that.
-                for txmbr in self.tsInfo.getMembersWithState(None, 
output_states=TS_INSTALL_STATES):
-                    for obs_n in txmbr.po.obsoletes_names:
-                        for otxmbr in self.tsInfo.matchNaevr(name=obs_n):
-                            if otxmbr.output_state not in TS_INSTALL_STATES:
-                                continue
-                            if otxmbr.po == txmbr.po:
-                                #  Not sure if we should just ignore this for
-                                # us, or for everyone...
-                                continue
-                            if otxmbr.po.obsoletedBy([txmbr.po]):
-                                if txmbr.po.obsoletedBy([otxmbr.po]):
-                                    # Have to deal with loops!
-                                    continue
-                                # No callback?
-                                msg = _('Removing %s due to obsoletes from %s')
-                                self.verbose_logger.log(logginglevels.DEBUG_1,
-                                                        msg, otxmbr, txmbr)
-                                self.tsInfo.remove(otxmbr.pkgtup)
-                                #  We need to remove an obsoleted entry that
-                                # was maybe used to resolve something ... ?
-                                CheckDeps = True
-                                self._last_req = None
-                                self.pkgSack.delPackage(otxmbr.po)
-                                self.up.delPackage(otxmbr.pkgtup)
+                if True: # Always have to check obsoletes...
+                    if self._checkObsoletes():
+                        CheckDeps = True
+                        self._last_req = None
 
                 if CheckDeps:
                     if self.dsCallback: self.dsCallback.restartLoop()
@@ -1328,6 +1303,68 @@ class Depsolve(object):
         self.rpmdb.transactionCacheConflictPackages(cpkgs)
         return ret
 
+    #  This is checking for installed / transaction members which
+    # obsolete each other. Because rpm will now auto. obs. those
+    # anyway (even if we have obsoletes turned off).
+    def _checkObsoletes(self):
+        opkgs = []
+
+        ret = False
+
+        def _do_obs(otxmbr):
+            self.tsInfo.remove(otxmbr.pkgtup)
+            #  We need to remove an obsoleted entry that
+            # was maybe used to resolve something ... ?
+            self.pkgSack.delPackage(otxmbr.po)
+            self.up.delPackage(otxmbr.pkgtup)
+
+        for po in self.rpmdb.returnObsoletePackages():
+            if self.tsInfo.getMembersWithState(po.pkgtup, 
output_states=TS_REMOVE_STATES):
+                continue
+            obsoletes = po.returnPrco('obsoletes')
+            if not obsoletes: # We broke this due to dbMatch() usage.
+                continue
+            opkgs.append(po)
+            for obs_name,f,v in obsoletes:
+                for otxmbr in self.tsInfo.matchNaevr(name=obs_name):
+                    if not otxmbr.po.obsoletedBy([po]):
+                        continue
+                    if po.obsoletedBy([otxmbr.po]): # Loops, hope for rpm.
+                        continue
+                    msg = _('Removing %s due to obsoletes from installed %s')
+                    self.verbose_logger.log(logginglevels.DEBUG_1,
+                                            msg, otxmbr, po)
+                    _do_obs(otxmbr)
+                    ret = True
+
+        for txmbr in self.tsInfo.getMembersWithState(None, 
output_states=TS_INSTALL_STATES):
+            done = False
+            for obs_n in txmbr.po.obsoletes_names:
+                if not done:
+                    opkgs.append(txmbr.po)
+                    done = True
+
+                for otxmbr in self.tsInfo.matchNaevr(name=obs_n):
+                    if otxmbr.output_state not in TS_INSTALL_STATES:
+                        continue
+                    if otxmbr.po == txmbr.po:
+                        #  Not sure if we should just ignore this for
+                        # us, or for everyone...
+                        continue
+                    if not otxmbr.po.obsoletedBy([txmbr.po]):
+                        continue
+                    if txmbr.po.obsoletedBy([otxmbr.po]):
+                        # Have to deal with loops! Hope rpm behaves too.
+                        continue
+                    msg = _('Removing %s due to obsoletes from %s')
+                    self.verbose_logger.log(logginglevels.DEBUG_1,
+                                            msg, otxmbr, txmbr)
+                    _do_obs(otxmbr)
+                    ret = True
+
+        self.rpmdb.transactionCacheObsoletePackages(opkgs)
+        return ret
+
     def isPackageInstalled(self, pkgname):
         """Return whether the given package in installed.
 
-- 
1.7.7.6

_______________________________________________
Yum-devel mailing list
[email protected]
http://lists.baseurl.org/mailman/listinfo/yum-devel

Reply via email to