[Yum-devel] [PATCH] add 'ud' and 'od' modes to transaction members: updated and obsoleted - change the outputs a bit to correspond to this. - add depsolve cases to handle this better

Seth Vidal skvidal at fedoraproject.org
Mon Oct 18 18:37:29 UTC 2010


---
 output.py              |   12 +++++++-----
 test/testbase.py       |    6 ++++--
 yum/depsolve.py        |   24 ++++++++++++++++++------
 yum/transactioninfo.py |    4 ++--
 4 files changed, 31 insertions(+), 15 deletions(-)

diff --git a/output.py b/output.py
index cfca45f..5e2f073 100755
--- a/output.py
+++ b/output.py
@@ -1988,15 +1988,17 @@ class DepSolveProgressCallBack:
 
     def pkgAdded(self, pkgtup, mode):
         modedict = { 'i': _('installed'),
-                     'u': _('updated'),
-                     'o': _('obsoleted'),
+                     'u': _('an update'),
                      'e': _('erased'),
                      'r': _('reinstalled'),
-                     'd': _('downgraded')}
+                     'd': _('a downgrade'),
+                     'o': _('obsoleting'),
+                     'ud': _('updated'),
+                     'od': _('obsoleted'),}
         (n, a, e, v, r) = pkgtup
         modeterm = modedict[mode]
         self.verbose_logger.log(logginglevels.INFO_2,
-            _('---> Package %s.%s %s:%s-%s set to be %s'), n, a, e, v, r,
+            _('---> Package %s.%s %s:%s-%s will be %s'), n, a, e, v, r,
             modeterm)
         
     def start(self):
@@ -2172,7 +2174,7 @@ def _pkgname_ui(ayum, pkgname, ts_states=None):
     if ts_states is None:
         #  Note 'd' is a placeholder for downgrade, and
         # 'r' is a placeholder for reinstall. Neither exist atm.
-        ts_states = ('d', 'e', 'i', 'r', 'u')
+        ts_states = ('d', 'e', 'i', 'r', 'u', 'od', 'ud')
 
     matches = []
     def _cond_add(po):
diff --git a/test/testbase.py b/test/testbase.py
index f91fbf1..e6744c1 100644
--- a/test/testbase.py
+++ b/test/testbase.py
@@ -128,8 +128,10 @@ class DepSolveProgressCallBack:
     def pkgAdded(self, pkgtup, mode):
         modedict = { 'i': _('installed'),
                      'u': _('updated'),
-                     'o': _('obsoleted'),
-                     'e': _('erased')}
+                     'od': _('obsoleted'),
+                     'o': _('obsoleting'),
+                     'e': _('erased'),
+                     'ud':_('update'),}
         (n, a, e, v, r) = pkgtup
         modeterm = modedict[mode]
         self.verbose_logger.log(logginglevels.INFO_2,
diff --git a/yum/depsolve.py b/yum/depsolve.py
index 886cca8..b3d014f 100644
--- a/yum/depsolve.py
+++ b/yum/depsolve.py
@@ -376,6 +376,16 @@ class Depsolve(object):
         self.verbose_logger.log(logginglevels.DEBUG_2, _('Mode for pkg providing %s: %s'), 
             niceformatneed, needmode)
 
+        if needmode in ['ud', 'od']: # the thing it needs is being updated or obsoleted away 
+            # try to update the requiring package in hopes that all this problem goes away :(
+            self.verbose_logger.log(logginglevels.DEBUG_2, _('Trying to update %s to resolve dep'), requiringPo)
+            txmbrs = self.update(po=requiringPo, requiringPo=requiringPo)
+            if not txmbrs:
+                msg = self._err_missing_requires(requiringPo, requirement)
+                self.verbose_logger.log(logginglevels.DEBUG_2, _('No update paths found for %s. Failure!'), requiringPo)
+                return self._requiringFromTransaction(requiringPo, requirement, errorlist)
+            checkdeps = 1
+            
         if needmode in ['e']:
             self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: %s package requiring %s marked as erase'),
                 requiringPo, needname)
@@ -384,11 +394,10 @@ class Depsolve(object):
             checkdeps = 1
         
         if needmode in ['i', 'u']:
-            length = len(self.tsInfo)
-            self.update(name=name, epoch=epoch, version=ver, release=rel,
-                        requiringPo=requiringPo)
+            newupdates = self.update(name=name, epoch=epoch, version=ver, release=rel,
+                                     requiringPo=requiringPo)
             txmbrs = self.tsInfo.getMembersWithState(requiringPo.pkgtup, TS_REMOVE_STATES)
-            if len(self.tsInfo) != length and txmbrs:
+            if newupdates and txmbrs:
                 if txmbrs[0].output_state == TS_OBSOLETED:
                     self.verbose_logger.log(logginglevels.DEBUG_2, _('TSINFO: Obsoleting %s with %s to resolve dep.'),
                                             requiringPo, txmbrs[0].obsoleted_by[0])
@@ -795,8 +804,11 @@ class Depsolve(object):
                     dscb_ts_state = 'd'
                 if dscb_ts_state == 'u' and txmbr.reinstall:
                     dscb_ts_state = 'r'
-                if dscb_ts_state == 'u' and not txmbr.updates:
-                    dscb_ts_state = 'i'
+                if dscb_ts_state == 'u':
+                    if txmbr.output_state == TS_OBSOLETING:
+                        dscb_ts_state = 'o'
+                    elif not txmbr.updates:
+                        dscb_ts_state = 'i'
                 self.dsCallback.pkgAdded(txmbr.pkgtup, dscb_ts_state)
             self.verbose_logger.log(logginglevels.DEBUG_2,
                                     _("Checking deps for %s") %(txmbr,))
diff --git a/yum/transactioninfo.py b/yum/transactioninfo.py
index f34a45e..91bcbcb 100644
--- a/yum/transactioninfo.py
+++ b/yum/transactioninfo.py
@@ -497,7 +497,7 @@ class TransactionData:
         txmbr.current_state = TS_INSTALL
         txmbr.output_state =  TS_UPDATED
         txmbr.po.state = TS_UPDATED
-        txmbr.ts_state = None # FIXME: should use a real state here.
+        txmbr.ts_state = 'ud'
         txmbr.relatedto.append((updating_po, 'updatedby'))
         txmbr.updated_by.append(updating_po)
         self.add(txmbr)
@@ -529,7 +529,7 @@ class TransactionData:
         txmbr.current_state = TS_INSTALL
         txmbr.output_state =  TS_OBSOLETED
         txmbr.po.state = TS_OBSOLETED
-        txmbr.ts_state = None # FIXME: should use a real state here.
+        txmbr.ts_state = 'od'
         txmbr.relatedto.append((obsoleting_po, 'obsoletedby'))
         txmbr.obsoleted_by.append(obsoleting_po)
         self.add(txmbr)
-- 
1.7.2.1



More information about the Yum-devel mailing list