##// END OF EJS Templates
test: add test for a former race resulting in bad dirstate...
test: add test for a former race resulting in bad dirstate In 6.0 this used to result in the size being stored in the dirstate is wrong. This was fixed by other change to the mtime gathering logic. Differential Revision: https://phab.mercurial-scm.org/D11749

File last commit:

r49290:bc6547f6 default
r49290:bc6547f6 default
Show More
test-dirstate-race2.t
89 lines | 2.7 KiB | text/troff | Tads3Lexer
/ tests / test-dirstate-race2.t
Simon Sapin
dirstate: Remove the flat Rust DirstateMap implementation...
r48882 #testcases dirstate-v1 dirstate-v2
Simon Sapin
dirstate-tree: Add a dirstate-v1-tree variant of some tests...
r47900
Simon Sapin
dirstate-v2: Add a variant of some tests, that uses the new format...
r48056 #if dirstate-v2
dirstate-v2: add an option to prevent unintentional slow dirstate-v2...
r49049 $ cat >> $HGRCPATH << EOF
> [format]
dirstate-v2: freeze the on-disk format...
r49116 > exp-rc-dirstate-v2=1
dirstate-v2: add an option to prevent unintentional slow dirstate-v2...
r49049 > [storage]
> dirstate-v2.slow-path=allow
> EOF
Simon Sapin
dirstate-v2: Add a variant of some tests, that uses the new format...
r48056 #endif
Valentin Gatien-Baron
tests: show how the dirstate can end up containing wrong information...
r42654 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 _
tests: make sure no ambiguities remains after the commit...
r49197 # this sleep is there to ensure current time has -at-least- one second away
# from the current time. It ensure the mtime is not ambiguous. If the test
# "sleep" longer this will be fine.
# It is not used to synchronise parallele operation so it is "fine" to use it.
$ sleep 1
$ hg status
Valentin Gatien-Baron
tests: show how the dirstate can end up containing wrong information...
r42654
$ hg debugdirstate --no-dates
n 644 3 (set |unset) a (re)
$ cat >> $TESTTMP/dirstaterace.py << EOF
Valentin Gatien-Baron
test: add test for a former race resulting in bad dirstate...
r49290 > import time
Valentin Gatien-Baron
tests: show how the dirstate can end up containing wrong information...
r42654 > from mercurial import (
Valentin Gatien-Baron
test: add test for a former race resulting in bad dirstate...
r49290 > commit,
Valentin Gatien-Baron
tests: show how the dirstate can end up containing wrong information...
r42654 > extensions,
> merge,
> )
> def extsetup(ui):
Valentin Gatien-Baron
test: add test for a former race resulting in bad dirstate...
r49290 > extensions.wrapfunction(merge, 'applyupdates', wrap(0))
> extensions.wrapfunction(commit, 'commitctx', wrap(1))
> def wrap(duration):
> def new(orig, *args, **kwargs):
> res = orig(*args, **kwargs)
> with open("a", "w"):
> pass # just truncate the file
> time.sleep(duration)
> return res
> return new
Valentin Gatien-Baron
tests: show how the dirstate can end up containing wrong information...
r42654 > EOF
Do an update where file 'a' is changed between hg writing it to disk
Valentin Gatien-Baron
merge: fix race that could cause wrong size in dirstate...
r42656 and hg writing the dirstate. The dirstate is correct nonetheless, and
so hg status correctly shows a as clean.
Valentin Gatien-Baron
tests: show how the dirstate can end up containing wrong information...
r42654
$ 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
Valentin Gatien-Baron
merge: fix race that could cause wrong size in dirstate...
r42656 n 644 2 (set |unset) a (re)
Valentin Gatien-Baron
tests: show how the dirstate can end up containing wrong information...
r42654 $ echo a > a; hg status; hg diff
Valentin Gatien-Baron
test: add test for a former race resulting in bad dirstate...
r49290
Do a commit where file 'a' is changed between hg committing its new
revision into the repository, and the writing of the dirstate.
This used to results in a corrupted dirstate (size did not match committed size).
$ echo aaa > a; hg commit -qm _
$ hg merge -qr 1; hg resolve -m; rm a.orig
warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
(no more unresolved files)
$ cat a
<<<<<<< working copy: be46f74ce38d - test: _
aaa
=======
aa
>>>>>>> merge rev: eb3fc6c17aa3 - test: _
$ hg debugdirstate --no-dates
m 0 -2 (set |unset) a (re)
$ hg commit -m _ --config extensions.race=$TESTTMP/dirstaterace.py
$ hg debugdirstate --no-dates
n 0 -1 unset a
$ cat a | wc -c
*0 (re)
$ hg cat -r . a | wc -c
*105 (re)
$ hg status; hg diff --stat
M a
a | 5 -----
1 files changed, 0 insertions(+), 5 deletions(-)