changeset 33617:5ac845ca059a stable

commit: don't let failed commit with --addremove update dirstate (issue5645) Differential Revision: https://phab.mercurial-scm.org/D204
author Martin von Zweigbergk <martinvonz@google.com>
date Mon, 31 Jul 2017 14:54:57 -0700
parents d84da82764e3
children 76b171209151
files mercurial/cmdutil.py tests/test-commit.t tests/test-flagprocessor.t tests/test-username-newline.t
diffstat 4 files changed, 19 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/cmdutil.py	Mon Jul 31 14:54:08 2017 -0700
+++ b/mercurial/cmdutil.py	Mon Jul 31 14:54:57 2017 -0700
@@ -26,6 +26,7 @@
     changelog,
     copies,
     crecord as crecordmod,
+    dirstateguard,
     encoding,
     error,
     formatter,
@@ -2888,14 +2889,23 @@
     message = logmessage(ui, opts)
     matcher = scmutil.match(repo[None], pats, opts)
 
+    dsguard = None
     # extract addremove carefully -- this function can be called from a command
     # that doesn't support addremove
-    if opts.get('addremove'):
-        if scmutil.addremove(repo, matcher, "", opts) != 0:
-            raise error.Abort(
-                _("failed to mark all new/missing files as added/removed"))
-
-    return commitfunc(ui, repo, message, matcher, opts)
+    try:
+        if opts.get('addremove'):
+            dsguard = dirstateguard.dirstateguard(repo, 'commit')
+            if scmutil.addremove(repo, matcher, "", opts) != 0:
+                raise error.Abort(
+                    _("failed to mark all new/missing files as added/removed"))
+
+        r = commitfunc(ui, repo, message, matcher, opts)
+        if dsguard:
+            dsguard.close()
+        return r
+    finally:
+        if dsguard:
+            dsguard.release()
 
 def samefile(f, ctx1, ctx2):
     if f in ctx1.manifest():
--- a/tests/test-commit.t	Mon Jul 31 14:54:08 2017 -0700
+++ b/tests/test-commit.t	Mon Jul 31 14:54:57 2017 -0700
@@ -157,7 +157,7 @@
   abort: edit failed: false exited with status 1
   [255]
   $ hg status
-  A newfile
+  ? newfile
 
 Make sure we do not obscure unknown requires file entries (issue2649)
 
--- a/tests/test-flagprocessor.t	Mon Jul 31 14:54:08 2017 -0700
+++ b/tests/test-flagprocessor.t	Mon Jul 31 14:54:57 2017 -0700
@@ -152,7 +152,6 @@
   $ hg commit -Aqm 'fail+base64+gzip+noop'
   abort: missing processor for flag '0x1'!
   [255]
-  $ hg forget fail-base64-gzip-noop
   $ rm fail-base64-gzip-noop
 
 # TEST: ensure we cannot register several flag processors on the same flag
--- a/tests/test-username-newline.t	Mon Jul 31 14:54:08 2017 -0700
+++ b/tests/test-username-newline.t	Mon Jul 31 14:54:57 2017 -0700
@@ -14,10 +14,12 @@
   $ rm .hg/hgrc
 
   $ HGUSER=`(echo foo; echo bar2)` hg ci -Am m
+  adding a
   abort: username 'foo\nbar2' contains a newline
   
   [255]
   $ hg ci -Am m -u "`(echo foo; echo bar3)`"
+  adding a
   transaction abort!
   rollback completed
   abort: username 'foo\nbar3' contains a newline!