D6474: tests: show how the dirstate can end up containing wrong information
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 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 To: valentin.gatienbaron, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6474: tests: show how the dirstate can end up containing wrong information
valentin.gatienbaron updated this revision to Diff 15461. REPOSITORY rHG Mercurial CHANGES SINCE LAST UPDATE https://phab.mercurial-scm.org/D6474?vs=15326&id=15461 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 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 To: valentin.gatienbaron, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
D6474: tests: show how the dirstate can end up containing wrong information
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 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 To: valentin.gatienbaron, #hg-reviewers Cc: mercurial-devel ___ Mercurial-devel mailing list Mercurial-devel@mercurial-scm.org https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel