[yum-commits] Branch 'yum-3_2_X' - 2 commits - docs/yum.8 yumcommands.py yum/__init__.py

James Antill james at osuosl.org
Mon Oct 3 14:15:09 UTC 2011


 docs/yum.8      |    5 +++++
 yum/__init__.py |   35 ++++++++++++++++++++++++++++++++++-
 yumcommands.py  |   24 +++++++++++++++++++++++-
 3 files changed, 62 insertions(+), 2 deletions(-)

New commits:
commit 9f310e05bbbd56003f6fdb5f407be81f8681c9cd
Merge: c80458d 5e23d83
Author: James Antill <james at and.org>
Date:   Mon Oct 3 10:14:46 2011 -0400

    Merge branch 'yum-3_2_X' of ssh://yum.baseurl.org/srv/projects/yum/git/yum into yum-3_2_X
    
    * 'yum-3_2_X' of ssh://yum.baseurl.org/srv/projects/yum/git/yum:
      Remove resolvedep from suggested completions now that it's hidden.

commit c80458d4cfe9fb312a22fd9e8b2d3a86ad176d8c
Author: James Antill <james at and.org>
Date:   Fri Sep 30 15:25:31 2011 -0400

    Allow reinstall and remove arguments to history redo command.

diff --git a/docs/yum.8 b/docs/yum.8
index 48d2465..5d6e3d4 100644
--- a/docs/yum.8
+++ b/docs/yum.8
@@ -341,6 +341,11 @@ The undo/redo/rollback commands take either a single transaction id or the
 keyword last and an offset from the last transaction (Eg. if you've done 250
 transactions, "last" refers to transaction 250, and "last-4" refers to
 transaction 246).
+The redo command can also take some optional arguments before you specify the
+transaction. "force-reinstall" tells it reinstall any packages that were
+installed in that transaction (via. install, upgrade or downgrade).
+"force-remove" tells it to forcibly remove any packages that were updated or
+downgraded.
 
 The undo/redo commands act on the specified transaction, undo'ing or repeating
 the work of that transaction. While the rollback command will undo all
diff --git a/yum/__init__.py b/yum/__init__.py
index cc968fd..1807d61 100644
--- a/yum/__init__.py
+++ b/yum/__init__.py
@@ -4874,18 +4874,24 @@ class YumBase(depsolve.Depsolve):
 
         return returndict
 
-    def history_redo(self, transaction):
+    def history_redo(self, transaction,
+                     force_reinstall=False, force_changed_removal=False):
         """Repeat the transaction represented by the given
         :class:`yum.history.YumHistoryTransaction` object.
 
         :param transaction: a
            :class:`yum.history.YumHistoryTransaction` object
            representing the transaction to be repeated
+        :param force_reinstall: bool - do we want to reinstall anything that was
+           installed/updated/downgraded/etc.
+        :param force_changed_removal: bool - do we want to force remove anything
+           that was downgraded or upgraded.
         :return: whether the transaction was repeated successfully
         """
         # NOTE: This is somewhat basic atm. ... see comment in undo.
         #  Also note that redo doesn't force install Dep-Install packages,
         # which is probably what is wanted the majority of the time.
+
         old_conf_obs = self.conf.obsoletes
         self.conf.obsoletes = False
         done = False
@@ -4895,19 +4901,46 @@ class YumBase(depsolve.Depsolve):
                     done = True
         for pkg in transaction.trans_data:
             if pkg.state == 'Downgrade':
+                if force_reinstall and self.rpmdb.searchPkgTuple(pkg.pkgtup):
+                    if self.reinstall(pkgtup=pkg.pkgtup):
+                        done = True
+                    continue
+
                 try:
                     if self.downgrade(pkgtup=pkg.pkgtup):
                         done = True
                 except yum.Errors.DowngradeError:
                     self.logger.critical(_('Failed to downgrade: %s'), pkg)
         for pkg in transaction.trans_data:
+            if force_changed_removal and pkg.state == 'Downgraded':
+                if self.tsInfo.getMembers(pkg.pkgtup):
+                    continue
+                if self.remove(pkgtup=pkg.pkgtup, silence_warnings=True):
+                    done = True
+        for pkg in transaction.trans_data:
             if pkg.state == 'Update':
+                if force_reinstall and self.rpmdb.searchPkgTuple(pkg.pkgtup):
+                    if self.reinstall(pkgtup=pkg.pkgtup):
+                        done = True
+                    continue
+
                 if self.update(pkgtup=pkg.pkgtup):
                     done = True
                 else:
                     self.logger.critical(_('Failed to upgrade: %s'), pkg)
         for pkg in transaction.trans_data:
+            if force_changed_removal and pkg.state == 'Updated':
+                if self.tsInfo.getMembers(pkg.pkgtup):
+                    continue
+                if self.remove(pkgtup=pkg.pkgtup, silence_warnings=True):
+                    done = True
+        for pkg in transaction.trans_data:
             if pkg.state in ('Install', 'True-Install', 'Obsoleting'):
+                if force_reinstall and self.rpmdb.searchPkgTuple(pkg.pkgtup):
+                    if self.reinstall(pkgtup=pkg.pkgtup):
+                        done = True
+                    continue
+
                 if self.install(pkgtup=pkg.pkgtup):
                     done = True
         for pkg in transaction.trans_data:
diff --git a/yumcommands.py b/yumcommands.py
index 0f0d29c..a862064 100644
--- a/yumcommands.py
+++ b/yumcommands.py
@@ -2367,13 +2367,35 @@ class HistoryCommand(YumCommand):
         return _("Display, or use, the transaction history")
 
     def _hcmd_redo(self, base, extcmds):
+        kwargs = {'force_reinstall' : False,
+                  'force_changed_removal' : False,
+                  }
+        kwargs_map = {'reinstall' : 'force_reinstall',
+                      'force-reinstall' : 'force_reinstall',
+                      'remove' : 'force_changed_removal',
+                      'force-remove' : 'force_changed_removal',
+                      }
+        while len(extcmds) > 1:
+            done = False
+            for arg in extcmds[1].replace(' ', ',').split(','):
+                if arg not in kwargs_map:
+                    continue
+
+                done = True
+                key = kwargs_map[extcmds[1]]
+                kwargs[key] = not kwargs[key]
+
+            if not done:
+                break
+            extcmds = [extcmds[0]] + extcmds[2:]
+
         old = base._history_get_transaction(extcmds)
         if old is None:
             return 1, ['Failed history redo']
         tm = time.ctime(old.beg_timestamp)
         print "Repeating transaction %u, from %s" % (old.tid, tm)
         base.historyInfoCmdPkgsAltered(old)
-        if base.history_redo(old):
+        if base.history_redo(old, **kwargs):
             return 2, ["Repeating transaction %u" % (old.tid,)]
 
     def _hcmd_undo(self, base, extcmds):


More information about the Yum-commits mailing list