[yum-git] test/skipbroken-tests.py yum/__init__.py

Florian Festi ffesti at linux.duke.edu
Fri Jan 11 09:22:43 UTC 2008


 test/skipbroken-tests.py |    4 +-
 yum/__init__.py          |   73 ++++++++++++++++++++++++-----------------------
 2 files changed, 40 insertions(+), 37 deletions(-)

New commits:
commit 823449ca756734270b6d98ba974aba840da91358
Author: Florian Festi <ffesti at redhat.com>
Date:   Fri Jan 11 10:22:09 2008 +0100

    skip-broken: next iteration

diff --git a/test/skipbroken-tests.py b/test/skipbroken-tests.py
index b1ddd40..b8bf268 100644
--- a/test/skipbroken-tests.py
+++ b/test/skipbroken-tests.py
@@ -239,8 +239,8 @@ class SkipBrokenTests(DepsolveTests):
 
         self.tsInfo.addInstall(ipo)
 
-        self.assertEquals('empty', *self.resolveCode(skip=True))
-        self.assertResult([])
+        self.assertEquals('ok', *self.resolveCode(skip=True))
+        self.assertResult([ipo, provides2])
 
     def testOnlyOneRequirementAvailable(self):
         ipo = self.repoPackage('foo')
diff --git a/yum/__init__.py b/yum/__init__.py
index 8489562..7f61736 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -593,29 +593,30 @@ class YumBase(depsolve.Depsolve):
         ''' Remove the packages with depsolve errors and depsolve again '''
         # Keep removing packages & Depsolve until all errors is gone
         # or the transaction is empty
-        depTree = self._buildDepTree()
         count = 0
         while len(self.po_with_problems) > 0 and rescode == 1:
             count += 1
+            self.verbose_logger.debug("Skip-broken round %i", count)
+            depTree = self._buildDepTree()
             startTs = set(self.tsInfo)
             toRemove = set()
             for po,wpo in self.po_with_problems:
                 # check if the problem is caused by a package in the transaction
                 if not self.tsInfo.exists(po.pkgtup):
                     if wpo:
-                        toRemove = self._getPackagesToRemove(wpo, depTree, toRemove)
-                    else:
-                        continue
+                        self._getPackagesToRemove(wpo, depTree, toRemove)
+                        if not wpo.repoid == 'installed': # Only remove non installed packages from pkgSack
+                            self.pkgSack.delPackage(wpo)
                 else:
-                    toRemove = self._getPackagesToRemove(po, depTree, toRemove)
-            if toRemove:
-                for po in toRemove:
-                    if self.tsInfo.exists(po.pkgtup):
-                        self.tsInfo.remove(po.pkgtup)
-                        if not po.repoid == 'installed': # Only remove non installed packages from pkgSack
-                            self.verbose_logger.info("skipping %s from %s because of depsolving problems" % (str(po),po.repoid))
-                            self.pkgSack.delPackage(po)
-            else: # Nothing was removed, so we still got a problem
+                    self._getPackagesToRemove(po, depTree, toRemove)
+                    if not po.repoid == 'installed': # Only remove non installed packages from pkgSack
+                        self.pkgSack.delPackage(po)
+            for po in toRemove:
+                if self.tsInfo.exists(po.pkgtup):
+                    self.tsInfo.remove(po.pkgtup)
+                    self.verbose_logger.info("skipping %s from %s because of depsolving problems" % (str(po),po.repoid))
+
+            if not toRemove: # Nothing was removed, so we still got a problem
                 break # Bail out
             rescode, restring = self.resolveDeps()
             endTs = set(self.tsInfo)
@@ -627,33 +628,35 @@ class YumBase(depsolve.Depsolve):
         return rescode, restring
 
     def _buildDepTree(self):
-        ''' create a dictionary with po -> deps and dep -> pos references '''
-        depTree = {}
+        ''' create a dictionary with po and deps '''
+        depTree = { }
         for txmbr in self.tsInfo:
-            if not txmbr.po in depTree:
-                depTree[txmbr.po] = set()
-            for po in (txmbr.updates + txmbr.obsoletes): # + txmbr.depends_on):
-                # Add po -> dep reference
-                depTree[txmbr.po].add(po)
-                if not po in depTree:
-                    depTree[po] = set()
-                # Add dep -> reference
-                depTree[po].add(txmbr.po)
-                                 
+            for dep in txmbr.depends_on:
+                depTree.setdefault(dep, []).append(txmbr.po)
+        # self._printDepTree(depTree)
         return depTree
-    
+
+    def _printDepTree(self, tree):
+        for pkg, l in tree.iteritems():
+            print pkg
+            for p in l:
+                print "\t", p
+
     def _getPackagesToRemove(self,po,deptree,toRemove):
         '''
-        walk trough the po->deps, dep->po's reference tree too get
-        the related po to remove.
+        get the (related) pos to remove.
         '''
-        stack = [ po ]
-        while stack:
-            po  = stack.pop()
-            if po not in toRemove:
-                toRemove.add(po)
-                stack.extend(deptree.get(po, []))
-        return toRemove
+        toRemove.add(po)
+        for txmbr in self.tsInfo.getMembers(po.pkgtup):
+            for pkg in (txmbr.updates + txmbr.obsoletes):
+                toRemove.add(pkg)
+                self._getDepsToRemove(pkg, deptree, toRemove)
+        self._getDepsToRemove(po, deptree, toRemove)
+
+    def _getDepsToRemove(self,po, deptree, toRemove):
+        for dep in deptree.get(po, []): # Loop trough all deps of po
+            toRemove.add(dep)
+            self._getDepsToRemove(dep, deptree, toRemove)
 
     def runTransaction(self, cb):
         """takes an rpm callback object, performs the transaction"""



More information about the Yum-cvs-commits mailing list