[PATCH RFC] revert: add --force option
Adrian Buehlmann
adrian at cadifra.com
Mon Jun 6 14:22:39 CDT 2011
# HG changeset patch
# User Adrian Buehlmann <adrian at cadifra.com>
# Date 1307360197 -7200
# Node ID b05c07a481984fd50e5e29fd6cea614dbecc5434
# Parent e597ef52a7c21ffe862339225bd915438f2dddcc
revert: add --force option
With this change, 'revert --all -r REV' aborts if REV is not a parent and
'--force' was not set.
Catches newbies trying to use this pattern where they should use update.
'hg revert --all -r REV' is rarely needed, so it should be acceptable that
people who know what they do have to specify -f if REV is not a parent.
OLD:
$ hg par -q
4:8765e19eea07
$ hg revert --all -r 2
reverting foo
reverting x.txt
NEW:
$ hg revert --all -r 2
abort: revision 946c41063461 is not a parent revision!
(use update to sync with that revision or use revert -f to force)
$ hg revert -f --all -r 2
reverting foo
reverting x.txt
diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -421,6 +421,7 @@
revert_opts = opts.copy()
revert_opts['date'] = None
revert_opts['all'] = True
+ revert_opts['force'] = True
revert_opts['rev'] = hex(parent)
revert_opts['no_backup'] = None
revert(ui, repo, **revert_opts)
@@ -4083,6 +4084,7 @@
('d', 'date', '', _('tipmost revision matching date'), _('DATE')),
('r', 'rev', '', _('revert to the specified revision'), _('REV')),
('', 'no-backup', None, _('do not save backup copies of files')),
+ ('f', 'force', None, _('force revert'))
] + walkopts + dryrunopts,
_('[OPTION]... [-r REV] [NAME]...'))
def revert(ui, repo, *pats, **opts):
@@ -4143,6 +4145,14 @@
ctx = scmutil.revsingle(repo, opts.get('rev'))
node = ctx.node()
+
+ if (opts.get('all') and opts.get('rev') and node != parent and node != p2
+ and not opts.get('force')):
+ hint = _("use update to sync with that revision "
+ "or use revert -f to force")
+ raise util.Abort(_('revision %s is not a parent revision!')
+ % short(node), hint=hint)
+
mf = ctx.manifest()
if node == parent:
pmf = mf
diff --git a/tests/test-debugcomplete.t b/tests/test-debugcomplete.t
--- a/tests/test-debugcomplete.t
+++ b/tests/test-debugcomplete.t
@@ -255,7 +255,7 @@
recover:
rename: after, force, include, exclude, dry-run
resolve: all, list, mark, unmark, tool, no-status, include, exclude
- revert: all, date, rev, no-backup, include, exclude, dry-run
+ revert: all, date, rev, no-backup, force, include, exclude, dry-run
rollback: dry-run
root:
showconfig: untrusted
diff --git a/tests/test-revert-flags.t b/tests/test-revert-flags.t
--- a/tests/test-revert-flags.t
+++ b/tests/test-revert-flags.t
@@ -11,7 +11,7 @@
reverting to rev 0
- $ hg revert -a -r 0
+ $ hg revert -fa -r 0
reverting foo
$ hg st
M foo
diff --git a/tests/test-revert-unknown.t b/tests/test-revert-unknown.t
--- a/tests/test-revert-unknown.t
+++ b/tests/test-revert-unknown.t
@@ -13,7 +13,7 @@
$ hg status
? unknown
- $ hg revert -r 0 --all
+ $ hg revert -f -r 0 --all
removing b
Should show unknown and b removed
diff --git a/tests/test-revert.t b/tests/test-revert.t
--- a/tests/test-revert.t
+++ b/tests/test-revert.t
@@ -116,6 +116,10 @@
should add a, remove d, forget z
$ hg revert --all -r0
+ abort: revision 334a9e57682c is not a parent revision!
+ (use update to sync with that revision or use revert -f to force)
+ [255]
+ $ hg revert -f --all -r0
adding a
removing d
forgetting z
@@ -190,7 +194,7 @@
should succeed
- $ hg revert --all -rtip
+ $ hg revert -f --all -rtip
reverting a
diff --git a/tests/test-symlinks.t b/tests/test-symlinks.t
--- a/tests/test-symlinks.t
+++ b/tests/test-symlinks.t
@@ -214,7 +214,7 @@
reverting to rev 0:
- $ hg revert -r 0 -a
+ $ hg revert -r 0 -fa
reverting dangling
$ $TESTDIR/readlink.py dangling
dangling -> nothing
More information about the Mercurial-devel
mailing list