[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