Patchwork D6474: tests: show how the dirstate can end up containing wrong information

login
register
mail settings
Submitter phabricator
Date June 3, 2019, 1 p.m.
Message ID <differential-rev-PHID-DREV-cz4hdzqko44osmkbuhcz-req@phab.mercurial-scm.org>
Download mbox | patch
Permalink /patch/40302/
State Superseded
Headers show

Comments

phabricator - June 3, 2019, 1 p.m.
valentin.gatienbaron created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  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.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6474

AFFECTED FILES
  tests/test-dirstate-race2.t

CHANGE DETAILS




To: valentin.gatienbaron, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/tests/test-dirstate-race2.t b/tests/test-dirstate-race2.t
new file mode 100644
--- /dev/null
+++ b/tests/test-dirstate-race2.t
@@ -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