test: add test for a former race resulting in bad dirstate
In 6.0 this used to result in the size being stored in the dirstate is wrong.
This was fixed by other change to the mtime gathering logic.
Differential Revision: https://phab.mercurial-scm.org/D11749
--- 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(-)