Mercurial > hg
view tests/test-merge-closedheads.t @ 29917:f32f8bf5dc4c
streamclone: force @filecache properties to be reloaded from file
Before this patch, consumev1() invokes repo.invalidate() after closing
transaction, to force @filecache properties to be reloaded from files
at next access, because streamclone writes data into files directly.
But this doesn't work as expected in the case below:
1. at closing transaction, repo._refreshfilecachestats() refreshes
file stat of each @filecache properties with streamclone-ed files
This means that in-memory properties are treated as valid.
2. but streamclone doesn't changes in-memory properties
This means that in-memory properties are actually invalid.
3. repo.invalidate() just forces to examine file stat of @filecache
properties at the first access after it
Such examination should concludes that reloading from file isn't
needed, because file stat was already refreshed at (1).
Therefore, invalid in-memory cached properties (2) are
unintentionally treated as valid (1).
This patch invokes repo.invalidate() with clearfilecache=True, to
force @filecache properties to be reloaded from file at next access.
BTW, it is accidental that repo.invalidate() without
clearfilecache=True in streamclone case seems to work as expected
before this patch.
If transaction is started via "filtered repo" object,
repo._refreshfilecachestats() tries to refresh file stat of each
@filecache properties on "filtered repo" object, even though all of
them are stored into "unfiltered repo" object.
In this case, repo._refreshfilecachestats() does nothing
unintentionally, but this unexpected behavior causes reloading
@filecache properties after repo.invalidate().
This is reason why this patch should be applied before making
_refreshfilecachestats() correctly refresh file stat of @filecache
properties.
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Mon, 12 Sep 2016 03:06:28 +0900 |
parents | f2719b387380 |
children | 8197b395710e |
line wrap: on
line source
$ hgcommit() { > hg commit -u user "$@" > } $ hg init clhead $ cd clhead $ touch foo && hg add && hgcommit -m 'foo' adding foo $ touch bar && hg add && hgcommit -m 'bar' adding bar $ touch baz && hg add && hgcommit -m 'baz' adding baz $ echo "flub" > foo $ hgcommit -m "flub" $ echo "nub" > foo $ hgcommit -m "nub" $ hg up -C 2 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ echo "c1" > c1 $ hg add c1 $ hgcommit -m "c1" created new head $ echo "c2" > c1 $ hgcommit -m "c2" $ hg up -C 2 0 files updated, 0 files merged, 1 files removed, 0 files unresolved $ echo "d1" > d1 $ hg add d1 $ hgcommit -m "d1" created new head $ echo "d2" > d1 $ hgcommit -m "d2" $ hg tag -l good fail with three heads $ hg up -C good 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge abort: branch 'default' has 3 heads - please merge with an explicit rev (run 'hg heads .' to see heads) [255] close one of the heads $ hg up -C 6 1 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hgcommit -m 'close this head' --close-branch succeed with two open heads $ hg up -C good 1 files updated, 0 files merged, 1 files removed, 0 files unresolved $ hg up -C good 0 files updated, 0 files merged, 0 files removed, 0 files unresolved $ hg merge 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) $ hgcommit -m 'merged heads' hg update -C 8 $ hg update -C 8 1 files updated, 0 files merged, 0 files removed, 0 files unresolved hg branch some-branch $ hg branch some-branch marked working directory as branch some-branch (branches are permanent and global, did you want a bookmark?) hg commit $ hgcommit -m 'started some-branch' hg commit --close-branch $ hgcommit --close-branch -m 'closed some-branch' hg update default $ hg update default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved hg merge some-branch $ hg merge some-branch 0 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) hg commit (no reopening of some-branch) $ hgcommit -m 'merge with closed branch' $ cd ..