[PATCH 4 of 4] status: change + back out == clean (API)

Martin von Zweigbergk martinvonz at google.com
Sun Jan 10 23:47:20 CST 2016


# HG changeset patch
# User Martin von Zweigbergk <martinvonz at google.com>
# Date 1451931209 28800
#      Mon Jan 04 10:13:29 2016 -0800
# Node ID ab1516b36e44bfb32ed6f354a9dae2f2f6300add
# Parent  4ea59d0f00be7bc44f1968c073a44274d67fa4f3
status: change + back out == clean (API)

After backing out a change, so the file contents is equal to a
previous revision of itself, we currently report the status between
the two equal revisions as modified. This is because
context._buildstatus() reports any file whose new nodeid is not equal
to _newnode as modified. That magic nodeid is given only to files
added or modified in the working directory, so any file whose nodeid
has changed between two revisions will be reported as modified.

Fix by simply comparing the file contents for all cases where the
nodeid changed, whether they are in the working copy or committed.

Marking with (API) as it subtly changes the semantics of the method.

diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -140,15 +140,9 @@
                 added.append(fn)
             elif node2 is None:
                 removed.append(fn)
-            elif node2 != _newnode:
-                # The file was not a new file in mf2, so an entry
-                # from diff is really a difference.
-                modified.append(fn)
             elif flag1 != flag2:
                 modified.append(fn)
             elif self[fn].cmp(other[fn]):
-                # node2 was newnode, but the working file doesn't
-                # match the one in mf1.
                 modified.append(fn)
             else:
                 clean.append(fn)
diff --git a/tests/test-status.t b/tests/test-status.t
--- a/tests/test-status.t
+++ b/tests/test-status.t
@@ -388,6 +388,14 @@
 
 #endif
 
+reverted and commit change should appear clean
+
+  $ hg revert -r 0 .
+  reverting file
+  $ hg ci -m a
+  $ hg status -A --rev 0 --rev 2
+  C file
+
   $ cd ..
 
 hg status of binary file starting with '\1\n', a separator for metadata:


More information about the Mercurial-devel mailing list