test-dirstate-race2.t
89 lines
| 2.7 KiB
| text/troff
|
Tads3Lexer
/ tests / test-dirstate-race2.t
Simon Sapin
|
r48882 | #testcases dirstate-v1 dirstate-v2 | ||
Simon Sapin
|
r47900 | |||
Simon Sapin
|
r48056 | #if dirstate-v2 | ||
r49049 | $ cat >> $HGRCPATH << EOF | |||
> [format] | ||||
r49116 | > exp-rc-dirstate-v2=1 | |||
r49049 | > [storage] | |||
> dirstate-v2.slow-path=allow | ||||
> EOF | ||||
Simon Sapin
|
r48056 | #endif | ||
Valentin Gatien-Baron
|
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 _ | ||||
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
|
r42654 | |||
$ hg debugdirstate --no-dates | ||||
n 644 3 (set |unset) a (re) | ||||
$ cat >> $TESTTMP/dirstaterace.py << EOF | ||||
Valentin Gatien-Baron
|
r49290 | > import time | ||
Valentin Gatien-Baron
|
r42654 | > from mercurial import ( | ||
Valentin Gatien-Baron
|
r49290 | > commit, | ||
Valentin Gatien-Baron
|
r42654 | > extensions, | ||
> merge, | ||||
> ) | ||||
> def extsetup(ui): | ||||
Valentin Gatien-Baron
|
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
|
r42654 | > EOF | ||
Do an update where file 'a' is changed between hg writing it to disk | ||||
Valentin Gatien-Baron
|
r42656 | and hg writing the dirstate. The dirstate is correct nonetheless, and | ||
so hg status correctly shows a as clean. | ||||
Valentin Gatien-Baron
|
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
|
r42656 | n 644 2 (set |unset) a (re) | ||
Valentin Gatien-Baron
|
r42654 | $ echo a > a; hg status; hg diff | ||
Valentin Gatien-Baron
|
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(-) | ||||