[yum-cvs] yum/depsolve.py yum/__init__.py

Florian Festi ffesti at linux.duke.edu
Tue Jan 8 10:15:33 UTC 2008


 yum/__init__.py |   17 +++++++++++------
 yum/depsolve.py |    1 +
 2 files changed, 12 insertions(+), 6 deletions(-)

New commits:
commit 1681bc2f3c35dca73eccfc544db3c1d76374b4f9
Author: Florian Festi <ffesti at redhat.com>
Date:   Tue Jan 8 11:14:51 2008 +0100

    Fix skip-broken
    
    Just remove the problematic packages but also remove them from .pkgSack
    Use a stack in ._getPackagesToRemove() to avoid stack overflow
    Add counter for skip-broken loop
    Reset tsInfo.removedmembers before each depsolving call

diff --git a/yum/__init__.py b/yum/__init__.py
index 5bd6fa0..135666f 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -594,7 +594,9 @@ class YumBase(depsolve.Depsolve):
         # 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
             startTs = set(self.tsInfo)
             toRemove = set()
             for po,wpo in self.po_with_problems:
@@ -611,6 +613,7 @@ class YumBase(depsolve.Depsolve):
                     if self.tsInfo.exists(po.pkgtup):
                         self.verbose_logger.info("skipping %s because of depsolving problems" % str(po))
                         self.tsInfo.remove(po.pkgtup)
+                        self.pkgSack.delPackage(po)
             else: # Nothing was removed, so we still got a problem
                 break # Bail out
             rescode, restring = self.resolveDeps()
@@ -619,6 +622,7 @@ class YumBase(depsolve.Depsolve):
              # if there is no changes then we got a loop.
             if startTs-endTs == set():
                 break    # bail out
+        self.verbose_logger.debug("Skip-broken took %i rounds ", count)
         return rescode, restring
 
     def _buildDepTree(self):
@@ -627,7 +631,7 @@ class YumBase(depsolve.Depsolve):
         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):
+            for po in (txmbr.updates + txmbr.obsoletes): # + txmbr.depends_on):
                 # Add po -> dep reference
                 depTree[txmbr.po].add(po)
                 if not po in depTree:
@@ -642,11 +646,12 @@ class YumBase(depsolve.Depsolve):
         walk trough the po->deps, dep->po's reference tree too get
         the related po to remove.
         '''
-        if po not in toRemove:
-            toRemove.add(po)       
-        for child in deptree[po]:
-            if child not in toRemove:
-                toRemove = self._getPackagesToRemove(child, deptree, toRemove)
+        stack = [ po ]
+        while stack:
+            po  = stack.pop()
+            if po not in toRemove:
+                toRemove.add(po)
+                stack.extend(deptree.get(po, []))
         return toRemove
 
     def runTransaction(self, cb):
diff --git a/yum/depsolve.py b/yum/depsolve.py
index f6ad39a..3e8f403 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -713,6 +713,7 @@ class Depsolve(object):
             self._dcobj.reset()
         self.po_with_problems = set()
         self._working_po = None
+        self.tsInfo.removedmembers.clear()
 
         CheckDeps = True
         CheckRemoves = False



More information about the Yum-cvs-commits mailing list