Hi!

I found another piece of code that does updates - and does it a bit different. The attached patch replaces it by a call to YumBase.update().

It also fixes a problem when processing "problems" of packages that got already removed.

This patch fixes the failing UpdateForDependency2 test cases just added. (May be it would make sense to review them first)

Comments? Ideas why it will fail?

Florian

BTW: I am still unhappy with the result of .update() and friends. It is still quite complicated the find out what they actually did. Reason for this is the IMHO insane API of TransactionInfo that returns just arbitrary transaction member objects in its .add* methods.
>From aa50898c0ffbbb9d5f857d10ae552b187a4e94c2 Mon Sep 17 00:00:00 2001
From: Florian Festi <[EMAIL PROTECTED]>
Date: Tue, 12 Feb 2008 13:23:11 +0100
Subject: [PATCH] Use update() in _requiringFromInstalled() instead of specialized code
 Ignore packages that already got removed

---
 yum/depsolve.py |   69 +++++++++---------------------------------------------
 1 files changed, 12 insertions(+), 57 deletions(-)

diff --git a/yum/depsolve.py b/yum/depsolve.py
index bf2e703..9acbc25 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -256,8 +256,12 @@ class Depsolve(object):
 
         try:    
             if po.repo.id != "installed":
+                if not self.tsInfo.getMembersWithState(po.pkgtup, TS_INSTALL_STATES):
+                    return False, False, errormsgs
                 CheckDeps, missingdep = self._requiringFromTransaction(po, requirement, errormsgs)
             else:
+                if self.tsInfo.getMembersWithState(po.pkgtup, TS_REMOVE_STATES):
+                    return False, False, errormsgs
                 CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, errormsgs)
     
             # Check packages with problems
@@ -352,63 +356,14 @@ class Depsolve(object):
             checkdeps = 1
         
         if needmode in ['i', 'u']:
-            obslist = []
-            # check obsoletes first
-            if self.conf.obsoletes:
-                if self.up.obsoleted_dict.has_key(requiringPo.pkgtup):
-                    obslist = self.up.obsoleted_dict[requiringPo.pkgtup]
-                    self.verbose_logger.log(logginglevels.DEBUG_1,
-                        _('Looking for Obsoletes for %s'), requiringPo)
-                
-            if len(obslist) > 0:
-                po = None
-                for pkgtup in obslist:
-                    po = self.getPackageObject(pkgtup)
-                if po:
-                    for (new, old) in self.up.getObsoletesTuples(): # FIXME query the obsoleting_list now?
-                        if po.pkgtup == new:
-                            txmbr = self.tsInfo.addObsoleting(po, requiringPo)
-                            self.tsInfo.addObsoleted(requiringPo, po)
-                            txmbr.setAsDep(po=needpo)
-                            self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: Obsoleting %s with %s to resolve dep.'), 
-                                requiringPo, po)
-                            checkdeps = 1
-                            return checkdeps, missingdep 
-                
-            
-            # check updates second
-            uplist = []                
-            uplist = self.up.getUpdatesList(name=name)
-            # if there's an update for the reqpkg, then update it
-            
-            po = None
-            if len(uplist) > 0:
-                if name not in self.conf.exactarchlist:
-                    pkgs = self.pkgSack.returnNewestByName(name)
-                    archs = {}
-                    for pkg in pkgs:
-                        archs[pkg.arch] = pkg
-                    a = rpmUtils.arch.getBestArchFromList(archs.keys())
-                    po = archs[a]
-                else:
-                    po = self.pkgSack.returnNewestByNameArch((name,arch))[0]
-                if po.pkgtup not in uplist:
-                    po = None
-
-            if po:
-                for (new, old) in self.up.getUpdatesTuples():
-                    if po.pkgtup == new:
-                        txmbr = self.tsInfo.addUpdate(po, requiringPo)
-                        txmbr.setAsDep(po=needpo)
-                        txmbr.reason = "dep"
-                        self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: Updating %s to resolve dep.'), po)
-                checkdeps = 1
-                
-            else: # if there's no update then pass this over to requringFromTransaction()
-                self.verbose_logger.log(logginglevels.DEBUG_2, _('Cannot find an update path for dep for: %s'), niceformatneed)
-                
-                reqpkg = (name, ver, rel, None)
-                return self._requiringFromTransaction(requiringPo, requirement, errorlist)
+            length = len(self.tsInfo)
+            txmbrs = self.update(name=name, epoch=epoch, version=ver, release=rel)
+            if len(self.tsInfo) != length and \
+                    self.tsInfo.getMembersWithState(requiringPo.pkgtup, TS_REMOVE_STATES):
+                checkdeps = True
+                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:
-- 
1.5.3.8

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

Reply via email to