[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