[yum-git] yum/depsolve.py yum/__init__.py
Tim Lauridsen
timlau at linux.duke.edu
Fri Feb 1 13:58:10 UTC 2008
yum/__init__.py | 28 +++++++++++++++-------------
yum/depsolve.py | 30 +++++++++++++++++++++---------
2 files changed, 36 insertions(+), 22 deletions(-)
New commits:
commit 251b9111e07eda83178be42a8c9032236a3b7f5b
Author: Tim Lauridsen <tla at rasmil.dk>
Date: Fri Feb 1 14:53:09 2008 +0100
* fix problem with skip-broken (rhbz #430936)
* Make the skipped packages show only once and sorted.
* cleanup some leftovers
diff --git a/yum/__init__.py b/yum/__init__.py
index 3cd2429..fd96d75 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -626,7 +626,7 @@ class YumBase(depsolve.Depsolve):
# Keep removing packages & Depsolve until all errors is gone
# or the transaction is empty
count = 0
- skip_messages = []
+ skipped_po = set()
orig_restring = restring # Keep the old error messages
while len(self.po_with_problems) > 0 and rescode == 1:
count += 1
@@ -646,8 +646,9 @@ class YumBase(depsolve.Depsolve):
if not po.repoid == 'installed': # Only remove non installed packages from pkgSack
self.pkgSack.delPackage(po)
for po in toRemove:
- msgs = self._skipFromTransaction(po)
- skip_messages.extend(msgs)
+ skipped = self._skipFromTransaction(po)
+ for skip in skipped:
+ skipped_po.add(skip)
if not toRemove: # Nothing was removed, so we still got a problem
break # Bail out
rescode, restring = self.resolveDeps()
@@ -659,8 +660,10 @@ class YumBase(depsolve.Depsolve):
if rescode != 1:
self.verbose_logger.debug(_("Skip-broken took %i rounds "), count)
self.verbose_logger.info(_('\nPackages skipped because of dependency problems:'))
- skip_messages.sort()
- for msg in skip_messages:
+ skipped_list = [p for p in skipped_po]
+ skipped_list.sort()
+ for po in skipped_list:
+ msg = _(" %s from %s") % (str(po),po.repo.id)
self.verbose_logger.info(msg)
else:
# If we cant solve the problems the show the original error messages.
@@ -670,7 +673,7 @@ class YumBase(depsolve.Depsolve):
return rescode, restring
def _skipFromTransaction(self,po):
- messages = []
+ skipped = []
if rpmUtils.arch.isMultiLibArch():
archs = rpmUtils.arch.getArchList()
n,a,e,v,r = po.pkgtup
@@ -680,21 +683,20 @@ class YumBase(depsolve.Depsolve):
if self.tsInfo.exists(pkgtup):
for txmbr in self.tsInfo.getMembers(pkgtup):
pkg = txmbr.po
- msgs = self._removePoFromTransaction(pkg)
- messages.extend(msgs)
+ skip = self._removePoFromTransaction(pkg)
+ skipped.extend(skip)
else:
msgs = self._removePoFromTransaction(po)
messages.extend(msgs)
- return messages
+ return skipped
def _removePoFromTransaction(self,po):
- messages = []
+ skip = []
if self.tsInfo.exists(po.pkgtup):
self.tsInfo.remove(po.pkgtup)
if not po.repoid == 'installed':
- self.skipped_po.add(po)
- messages.append(" %s from %s" % (str(po),po.repoid))
- return messages
+ skip.append(po)
+ return skip
def _buildDepTree(self):
''' create a dictionary with po and deps '''
diff --git a/yum/depsolve.py b/yum/depsolve.py
index f5bcce7..bf2e703 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -254,17 +254,29 @@ class Depsolve(object):
self.verbose_logger.log(logginglevels.DEBUG_1, _('%s requires: %s'), po, niceformatneed)
if self.dsCallback: self.dsCallback.procReq(po.name, niceformatneed)
- if po.repo.id != "installed":
- CheckDeps, missingdep = self._requiringFromTransaction(po, requirement, errormsgs)
- else:
- CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, errormsgs)
-
- # Check packages with problems
- if missingdep:
- self.po_with_problems.add((po,self._working_po,errormsgs[-1]))
+ try:
+ if po.repo.id != "installed":
+ CheckDeps, missingdep = self._requiringFromTransaction(po, requirement, errormsgs)
+ else:
+ CheckDeps, missingdep = self._requiringFromInstalled(po, requirement, errormsgs)
+
+ # Check packages with problems
+ if missingdep:
+ self.po_with_problems.add((po,self._working_po,errormsgs[-1]))
+
+
+ except Errors.DepError,e:
+ # FIXME: This is a hack, it don't solve the problem
+ # of tries to update to a package the have been removed from the
+ # pkgSack because of dep problems.
+ # The real solution is to remove the package from the updates, when
+ # it is remove from the pkgSack
+ self.po_with_problems.add((po,self._working_po,str(e)))
+ CheckDeps = 1
+ missingdep = 0
return (CheckDeps, missingdep, errormsgs)
-
+
def _requiringFromInstalled(self, requiringPo, requirement, errorlist):
"""processes the dependency resolution for a dep where the requiring
package is installed"""
More information about the Yum-cvs-commits
mailing list