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

login
register
mail settings
Submitter phabricator
Date June 13, 2019, 2:03 p.m.
Message ID <2258948a41736f67aeb1a732c605d5fe@localhost.localdomain>
Download mbox | patch
Permalink /patch/40489/
State Not Applicable
Headers show

Comments

phabricator - June 13, 2019, 2:03 p.m.
Closed by commit rHGd9a50456ea3d: tests: show how the dirstate can end up containing wrong information (authored by valentin.gatienbaron).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs Review".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6474?vs=15461&id=15488

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6474/new/

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