# HG changeset patch # User Valentin Gatien-Baron # Date 1636320342 18000 # Node ID bc6547f6131008a44577c92cabde6f5adf646063 # Parent 96ea4db4741b85db6db515ffbd78bf39fa4d6855 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 diff -r 96ea4db4741b -r bc6547f61310 tests/test-dirstate-race2.t --- 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(-)