[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