##// END OF EJS Templates
localrepo: make journal.dirstate contain in-memory changes before transaction...
localrepo: make journal.dirstate contain in-memory changes before transaction Before this patch, in-memory dirstate changes aren't written out at opening transaction, even though 'journal.dirstate' is created directly from '.hg/dirstate'. Therefore, subsequent 'hg rollback' uses incomplete 'undo.dirstate' to restore dirstate, if dirstate is changed and isn't written out before opening transaction. In cases below, the condition "dirstate is changed and isn't written out before opening transaction" isn't satisfied and this problem doesn't appear: - "wlock scope" and "transaction scope" are almost equivalent e.g. 'commit --amend', 'import' and so on - dirstate changes are written out before opening transaction e.g. 'rebase' (via 'dirstateguard') and 'commit -A' (by separated wlock scopes) On the other hand, 'backout' may satisfy the condition above. To make 'journal.dirstate' contain in-memory changes before opening transaction, this patch explicitly invokes 'dirstate.write()' in 'localrepository.transaction()'. 'dirstate.write()' is placed before not "writing journal files out" but "invoking pretxnopen hooks" for visibility of dirstate changes to external hook processes. BTW, in the test script, 'touch -t 200001010000' and 'hg status' are invoked to make file 'c' surely clean in dirstate, because "clean but unsure" files indirectly cause 'dirstate.write()' at 'repo.status()' in 'repo.commit()' (see fe03f522dda9 for detail) and prevents from certainly reproducing the issue.

File last commit:

r22046:7a9cbb31 default
r25878:800e090e stable
Show More
test-flags.t
154 lines | 3.8 KiB | text/troff | Tads3Lexer
#require execbit
$ umask 027
$ hg init test1
$ cd test1
$ touch a b
$ hg add a b
$ hg ci -m "added a b"
$ cd ..
$ hg clone test1 test3
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg init test2
$ cd test2
$ hg pull ../test1
pulling from ../test1
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 2 changes to 2 files
(run 'hg update' to get a working copy)
$ hg co
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ chmod +x a
$ hg ci -m "chmod +x a"
the changelog should mention file a:
$ hg tip --template '{files}\n'
a
$ cd ../test1
$ echo 123 >>a
$ hg ci -m "a updated"
$ hg pull ../test2
pulling from ../test2
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 0 changes to 0 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)
$ hg heads
changeset: 2:7f4313b42a34
tag: tip
parent: 0:22a449e20da5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: chmod +x a
changeset: 1:c6ecefc45368
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: a updated
$ hg history
changeset: 2:7f4313b42a34
tag: tip
parent: 0:22a449e20da5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: chmod +x a
changeset: 1:c6ecefc45368
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: a updated
changeset: 0:22a449e20da5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: added a b
$ hg -v merge
resolving manifests
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ cat a
123
$ [ -x a ]
$ cd ../test3
$ echo 123 >>b
$ hg ci -m "b updated"
$ hg pull ../test2
pulling from ../test2
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 0 changes to 0 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)
$ hg heads
changeset: 2:7f4313b42a34
tag: tip
parent: 0:22a449e20da5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: chmod +x a
changeset: 1:dc57ead75f79
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: b updated
$ hg history
changeset: 2:7f4313b42a34
tag: tip
parent: 0:22a449e20da5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: chmod +x a
changeset: 1:dc57ead75f79
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: b updated
changeset: 0:22a449e20da5
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: added a b
$ hg -v merge
resolving manifests
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ ls -l ../test[123]/a > foo
$ cut -b 1-10 < foo
-rwxr-x---
-rwxr-x---
-rwxr-x---
$ hg debugindex a
rev offset length ..... linkrev nodeid p1 p2 (re)
0 0 0 ..... 0 b80de5d13875 000000000000 000000000000 (re)
$ hg debugindex -R ../test2 a
rev offset length ..... linkrev nodeid p1 p2 (re)
0 0 0 ..... 0 b80de5d13875 000000000000 000000000000 (re)
$ hg debugindex -R ../test1 a
rev offset length ..... linkrev nodeid p1 p2 (re)
0 0 0 ..... 0 b80de5d13875 000000000000 000000000000 (re)
1 0 5 ..... 1 7fe919cc0336 b80de5d13875 000000000000 (re)
$ cd ..