changeset 42454:0eb8c61c306b

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
author Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
date Sun, 19 May 2019 16:06:06 -0400
parents 94167e701e12
children 5ca136bbd3f6
files tests/test-dirstate-race2.t
diffstat 1 files changed, 39 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /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