win32text: drop associated dirstate cache information on revert
authorPierre-Yves David <pierre-yves.david@octobus.net>
Tue, 23 Nov 2021 03:22:30 +0100
changeset 48388 f5dea753fe4e
parent 48387 f838f5bca038
child 48389 03644a929d6e
win32text: drop associated dirstate cache information on revert Otherwise the could get size from one version of the file while the on-disk version is still clean but with another size. This fix the previously introduced error. Differential Revision: https://phab.mercurial-scm.org/D11792
hgext/narrow/narrowdirstate.py
hgext/win32text.py
tests/test-win32text.t
--- a/hgext/narrow/narrowdirstate.py	Wed Nov 17 20:27:27 2021 +0100
+++ b/hgext/narrow/narrowdirstate.py	Tue Nov 23 03:22:30 2021 +0100
@@ -38,8 +38,8 @@
             return super(narrowdirstate, self).normal(*args, **kwargs)
 
         @_editfunc
-        def set_tracked(self, *args):
-            return super(narrowdirstate, self).set_tracked(*args)
+        def set_tracked(self, *args, **kwargs):
+            return super(narrowdirstate, self).set_tracked(*args, **kwargs)
 
         @_editfunc
         def set_untracked(self, *args):
--- a/hgext/win32text.py	Wed Nov 17 20:27:27 2021 +0100
+++ b/hgext/win32text.py	Tue Nov 23 03:22:30 2021 +0100
@@ -47,6 +47,8 @@
 from mercurial.i18n import _
 from mercurial.node import short
 from mercurial import (
+    cmdutil,
+    extensions,
     pycompat,
     registrar,
 )
@@ -215,6 +217,23 @@
         repo.adddatafilter(name, fn)
 
 
+def wrap_revert(orig, repo, ctx, names, uipathfn, actions, *args, **kwargs):
+    # reset dirstate cache for file we touch
+    ds = repo.dirstate
+    with ds.parentchange():
+        for filename in actions[b'revert'][0]:
+            entry = ds.get_entry(filename)
+            if entry is not None:
+                if entry.p1_tracked:
+                    ds.update_file(
+                        filename,
+                        entry.tracked,
+                        p1_tracked=True,
+                        p2_info=entry.p2_info,
+                    )
+    return orig(repo, ctx, names, uipathfn, actions, *args, **kwargs)
+
+
 def extsetup(ui):
     # deprecated config: win32text.warn
     if ui.configbool(b'win32text', b'warn'):
@@ -224,3 +243,4 @@
                 b"https://mercurial-scm.org/wiki/Win32TextExtension\n"
             )
         )
+    extensions.wrapfunction(cmdutil, '_performrevert', wrap_revert)
--- a/tests/test-win32text.t	Wed Nov 17 20:27:27 2021 +0100
+++ b/tests/test-win32text.t	Tue Nov 23 03:22:30 2021 +0100
@@ -418,7 +418,6 @@
   $ hg revert -a
   reverting linefeed
   $ hg st -q
-  M linefeed (known-bad-output !)
   $ cat linefeed
   % just linefeed\r (esc)