--- a/tests/test-dirstate-race2.t Tue Dec 07 18:57:43 2021 +0000
+++ b/tests/test-dirstate-race2.t Sun Nov 07 16:25:42 2021 -0500
@@ -30,17 +30,23 @@
n 644 3 (set |unset) a (re)
$ cat >> $TESTTMP/dirstaterace.py << EOF
+ > import time
> from mercurial import (
+ > commit,
> extensions,
> merge,
> )
> def extsetup(ui):
- > extensions.wrapfunction(merge, 'applyupdates', wrap)
- > def wrap(orig, *args, **kwargs):
- > res = orig(*args, **kwargs)
- > with open("a", "w"):
- > pass # just truncate the file
- > return res
+ > extensions.wrapfunction(merge, 'applyupdates', wrap(0))
+ > extensions.wrapfunction(commit, 'commitctx', wrap(1))
+ > def wrap(duration):
+ > def new(orig, *args, **kwargs):
+ > res = orig(*args, **kwargs)
+ > with open("a", "w"):
+ > pass # just truncate the file
+ > time.sleep(duration)
+ > return res
+ > return new
> EOF
Do an update where file 'a' is changed between hg writing it to disk
@@ -52,3 +58,32 @@
$ hg debugdirstate --no-dates
n 644 2 (set |unset) a (re)
$ echo a > a; hg status; hg diff
+
+Do a commit where file 'a' is changed between hg committing its new
+revision into the repository, and the writing of the dirstate.
+
+This used to results in a corrupted dirstate (size did not match committed size).
+
+ $ echo aaa > a; hg commit -qm _
+ $ hg merge -qr 1; hg resolve -m; rm a.orig
+ warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
+ (no more unresolved files)
+ $ cat a
+ <<<<<<< working copy: be46f74ce38d - test: _
+ aaa
+ =======
+ aa
+ >>>>>>> merge rev: eb3fc6c17aa3 - test: _
+ $ hg debugdirstate --no-dates
+ m 0 -2 (set |unset) a (re)
+ $ hg commit -m _ --config extensions.race=$TESTTMP/dirstaterace.py
+ $ hg debugdirstate --no-dates
+ n 0 -1 unset a
+ $ cat a | wc -c
+ *0 (re)
+ $ hg cat -r . a | wc -c
+ *105 (re)
+ $ hg status; hg diff --stat
+ M a
+ a | 5 -----
+ 1 files changed, 0 insertions(+), 5 deletions(-)