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
--- 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)