[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