# HG changeset patch # User Valentin Gatien-Baron # Date 1558296366 14400 # Node ID 0eb8c61c306b851ee29eb1937cb5a2883ebc793e # Parent 94167e701e125dce1788e19b1e1489958235e40c tests: show how the dirstate can end up containing wrong information which can result in bad status output. Concretely, this seems to be easily triggered by having a build system watching the filesystem for changes, and rebuilding files that are both tracked and generated while an update is happening. Differential Revision: https://phab.mercurial-scm.org/D6474 diff -r 94167e701e12 -r 0eb8c61c306b tests/test-dirstate-race2.t --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/test-dirstate-race2.t Sun May 19 16:06:06 2019 -0400 @@ -0,0 +1,39 @@ +Checking the size/permissions/file-type of files stored in the +dirstate after an update where the files are changed concurrently +outside of hg's control. + + $ hg init repo + $ cd repo + $ echo a > a + $ hg commit -qAm _ + $ echo aa > a + $ hg commit -m _ + + $ hg debugdirstate --no-dates + n 644 3 (set |unset) a (re) + + $ cat >> $TESTTMP/dirstaterace.py << EOF + > from mercurial import ( + > 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 + > EOF + +Do an update where file 'a' is changed between hg writing it to disk +and hg writing the dirstate. It results in a corrupted dirstate, which +stores the wrong size, and thus hg status shows spuriously modified +files. + + $ hg up -r 0 --config extensions.race=$TESTTMP/dirstaterace.py + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg debugdirstate --no-dates + n 644 0 (set |unset) a (re) + $ echo a > a; hg status; hg diff + M a