Hi!

I was wondering if _requiringFromInstalled couldn't be done easier if the REMOVE txmbr that is known in checkRemove is passed over. Attached is my first try to do this. The "if not remove_txmbr:" which more or less needs to do the same thing as the old code is probably a bit oversimplified (at least looping over all pkgs/txmbrs might be a good idea).

Anyone an idea of what might get wrong?

Florian
>From e616a45f0ee62cc9ef43932ee33c164800ed2f20 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Wed, 13 Feb 2008 12:33:38 +0100
Subject: [PATCH] Use already known txmbr when reloving installed pkgs problems

---
 yum/depsolve.py |  108 +++++++++++-------------------------------------------
 1 files changed, 22 insertions(+), 86 deletions(-)

diff --git a/yum/depsolve.py b/yum/depsolve.py
index 8c784eb..dcaa34f 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -242,7 +242,7 @@ class Depsolve(object):
                 self.verbose_logger.log(logginglevels.DEBUG_1,
                     _('Removing Package %s'), txmbr.po)
 
-    def _processReq(self, po, requirement):
+    def _processReq(self, po, requirement, remove_txmbr=None):
         """processes a Requires dep from the resolveDeps functions, returns a tuple
            of (CheckDeps, missingdep, conflicts, errors) the last item is an array
            of error messages"""
@@ -258,7 +258,7 @@ class Depsolve(object):
             if po.repo.id != "installed":
                 CheckDeps, missingdep = self._requiringFromTransaction(po, requirement, errormsgs)
             else:
-                CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, errormsgs)
+                CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, remove_txmbr, errormsgs)
     
             # Check packages with problems
             if missingdep:
@@ -277,7 +277,7 @@ class Depsolve(object):
 
         return (CheckDeps, missingdep, errormsgs)
             
-    def _requiringFromInstalled(self, requiringPo, requirement, errorlist):
+    def _requiringFromInstalled(self, requiringPo, requirement, remove_txmbr, errorlist):
         """processes the dependency resolution for a dep where the requiring 
            package is installed"""
 
@@ -292,71 +292,14 @@ class Depsolve(object):
         needname, needflags, needversion = requirement
         niceformatneed = rpmUtils.miscutils.formatRequire(needname, needversion, needflags)
 
-
-        # we must first find out why the requirement is no longer there
-        # we must find out what provides/provided it from the rpmdb (if anything)
-        # then check to see if that thing is being acted upon by the transaction set
-        # if it is then we need to find out what is being done to it and act accordingly
-        needmode = None # mode in the transaction of the needed pkg (if any)
-        needpo = None
-        providers = []
-        
-        if self.cheaterlookup.has_key((needname, needflags, needversion)):
-            self.verbose_logger.log(logginglevels.DEBUG_2, _('Needed Require has already been looked up, cheating'))
-            cheater_po = self.cheaterlookup[(needname, needflags, needversion)]
-            providers = [cheater_po]
-        
-        elif self.rpmdb.contains(name=needname):
-            txmbrs = self.tsInfo.matchNaevr(name=needname)
-            for txmbr in txmbrs:
-                providers.append(txmbr.po)
-
-        else:
-            self.verbose_logger.log(logginglevels.DEBUG_2, _('Needed Require is not a package name. Looking up: %s'), niceformatneed)
-            providers = self.rpmdb.getProvides(needname, needflags, needversion)
-
-        for inst_po in providers:
-            inst_str = '%s.%s %s:%s-%s' % inst_po.pkgtup
-            (i_n, i_a, i_e, i_v, i_r) = inst_po.pkgtup
-            self.verbose_logger.log(logginglevels.DEBUG_2,
-                _('Potential Provider: %s'), inst_str)
-            thismode = self.tsInfo.getMode(name=i_n, arch=i_a, 
-                            epoch=i_e, ver=i_v, rel=i_r)
-
-            if thismode is None and i_n in self.conf.exactarchlist:
-                # check for mode by the same name+arch
-                thismode = self.tsInfo.getMode(name=i_n, arch=i_a)
-            
-            if thismode is None and i_n not in self.conf.exactarchlist:
-                # check for mode by just the name
-                thismode = self.tsInfo.getMode(name=i_n)
-
-            # if this package is being obsoleted, it's just like if it's
-            # being upgraded as far as checking for other providers
-            if thismode is None:
-                if filter(lambda x: x.obsoleted_by,
-                          self.tsInfo.matchNaevr(i_n, i_a, i_e, i_v, i_r)):
-                    thismode = 'u'
-
-            if thismode is not None:
-                needmode = thismode
-
-                self.cheaterlookup[(needname, needflags, needversion)] = inst_po
-                self.verbose_logger.log(logginglevels.DEBUG_2, _('Mode is %s for provider of %s: %s'),
-                    needmode, niceformatneed, inst_str)
-                break
-                    
-        self.verbose_logger.log(logginglevels.DEBUG_2, _('Mode for pkg providing %s: %s'), 
-            niceformatneed, needmode)
-
-        if needmode in ['e']:
-            self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: %s package requiring %s marked as erase'),
-                requiringPo, needname)
-            txmbr = self.tsInfo.addErase(requiringPo)
-            txmbr.setAsDep(po=inst_po)
-            checkdeps = 1
+        if not remove_txmbr:
+            for po in self.rpmdb.getProvides(*requirement):
+                txmbrs = self.tsInfo.getMembersWithState(po.pkgtup, TS_REMOVE_STATES)
+                if txmbrs:
+                    remove_txmbr = txmbrs[0]
+                    break
         
-        if needmode in ['i', 'u']:
+        if remove_txmbr and (remove_txmbr.obsoleted_by or remove_txmbr.updated_by):
             length = len(self.tsInfo)
             self.update(name=name, epoch=epoch, version=ver, release=rel)
             txmbrs = self.tsInfo.getMembersWithState(requiringPo.pkgtup, TS_REMOVE_STATES)
@@ -370,23 +313,16 @@ class Depsolve(object):
                 return checkdeps, missingdep
             self.verbose_logger.log(logginglevels.DEBUG_2, _('Cannot find an update path for dep for: %s'), niceformatneed)
             return self._requiringFromTransaction(requiringPo, requirement, errorlist)
-            
 
-        if needmode is None:
-            reqpkg = (name, ver, rel, None)
-            if self.pkgSack is None:
-                return self._requiringFromTransaction(requiringPo, requirement, errorlist)
-            else:
-                prob_pkg = "%s (%s)" % (requiringPo,requiringPo.repoid)
-                msg = _('Unresolvable requirement %s for %s') % (niceformatneed,
-                                                               prob_pkg)
-                self.verbose_logger.log(logginglevels.DEBUG_2, msg)
-                checkdeps = 0
-                missingdep = 1
-                errorlist.append(msg)
+        if remove_txmbr and remove_txmbr.ts_state=='e' and not (remove_txmbr.obsoleted_by or remove_txmbr.updated_by):
+            self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: %s package requiring %s marked as erase'),
+                requiringPo, needname)
+            txmbr = self.tsInfo.addErase(requiringPo)
+            txmbr.setAsDep(po=remove_txmbr.po)
+            checkdeps = 1
+            return checkdeps, missingdep
 
-        return checkdeps, missingdep
-        
+        return self._requiringFromTransaction(requiringPo, requirement, errorlist)
 
     def _requiringFromTransaction(self, requiringPo, requirement, errorlist):
         """processes the dependency resolution for a dep where requiring 
@@ -801,8 +737,8 @@ class Depsolve(object):
                 CheckRemoves = True
 
             missing_in_pkg = False
-            for po, dep in thisneeds:
-                (checkdep, missing, errormsgs) = self._processReq(po, dep)
+            for po, dep, removed_txmbr in thisneeds:
+                (checkdep, missing, errormsgs) = self._processReq(po, dep, removed_txmbr)
                 CheckDeps |= checkdep
                 errors += errormsgs
                 missing_in_pkg |= missing
@@ -843,7 +779,7 @@ class Depsolve(object):
             if not provs:
                 reqtuple = (req[0], version_tuple_to_string(req[2]), flags[req[1]])
                 self._dcobj.addRequires(txmbr.po, [reqtuple])
-                ret.append( (txmbr.po, (req[0], flags[req[1]], version_tuple_to_string(req[2]))) )
+                ret.append( (txmbr.po, (req[0], flags[req[1]], version_tuple_to_string(req[2])), None) )
                 continue
 
             #Add relationship
@@ -880,7 +816,7 @@ class Depsolve(object):
                     if not self.tsInfo.getProvides(rn, rf, rv):
                         reqtuple = (rn, version_tuple_to_string(rv), flags[rf])
                         self._dcobj.addRequires(pkg, [reqtuple])
-                        ret.append( (pkg, (rn, flags[rf], version_tuple_to_string(rv))) )
+                        ret.append( (pkg, (rn, flags[rf], version_tuple_to_string(rv)), txmbr) )
         return ret
 
     def _checkFileRequires(self):
-- 
1.5.3.8

_______________________________________________
Yum-devel mailing list
[email protected]
https://lists.dulug.duke.edu/mailman/listinfo/yum-devel

Reply via email to