dirstate-v2: add check of parent/child nodes being related when writing
This stems from a corruption seen in a private repository. We're not sure
of the source of the corruption, and it's very possible that we're seeing
compounded effects of multiple writes on a corrupted dirstate.
Adding this check is not expensive in itself and large writes of the dirstate
are not common.
This change does not catch this problem at the root node, the next one will.
Testing narrow clones when changesets modifying a matching file exist on
multiple branches
$ . "$TESTDIR/narrow-library.sh"
$ hg init master
$ cd master
$ cat >> .hg/hgrc <<EOF
> [narrow]
> serveellipses=True
> EOF
$ hg branch default
marked working directory as branch default
(branches are permanent and global, did you want a bookmark?)
$ for x in `$TESTDIR/seq.py 10`; do
> echo $x > "f$x"
> hg add "f$x"
> hg commit -m "Add $x"
> done
$ hg branch release-v1
marked working directory as branch release-v1
(branches are permanent and global, did you want a bookmark?)
$ hg commit -m "Start release for v1"
$ hg update default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ for x in `$TESTDIR/seq.py 10`; do
> echo "$x v2" > "f$x"
> hg commit -m "Update $x to v2"
> done
$ hg update release-v1
10 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch release-v1
marked working directory as branch release-v1
$ for x in `$TESTDIR/seq.py 1 5`; do
> echo "$x v1 hotfix" > "f$x"
> hg commit -m "Hotfix $x in v1"
> done
$ hg update default
10 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch release-v2
marked working directory as branch release-v2
$ hg commit -m "Start release for v2"
$ hg update default
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch default
marked working directory as branch default
$ for x in `$TESTDIR/seq.py 10`; do
> echo "$x v3" > "f$x"
> hg commit -m "Update $x to v3"
> done
$ hg update release-v2
10 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg branch release-v2
marked working directory as branch release-v2
$ for x in `$TESTDIR/seq.py 4 9`; do
> echo "$x v2 hotfix" > "f$x"
> hg commit -m "Hotfix $x in v2"
> done
$ hg heads -T '{rev} <- {p1rev} ({branch}): {desc}\n'
42 <- 41 (release-v2): Hotfix 9 in v2
36 <- 35 (default): Update 10 to v3
25 <- 24 (release-v1): Hotfix 5 in v1
$ cd ..
We now have 3 branches: default, which has v3 of all files, release-v1 which
has v1 of all files, and release-v2 with v2 of all files.
Narrow clone which should get all branches
$ hg clone --narrow ssh://user@dummy/master narrow --include "f5"
requesting all changes
adding changesets
adding manifests
adding file changes
added 12 changesets with 5 changes to 1 files (+2 heads)
new changesets *:* (glob)
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd narrow
$ hg log -G -T "{if(ellipsis, '...')}{node|short} ({branch}): {desc}\n"
o ...031f516143fe (release-v2): Hotfix 9 in v2
|
o 9cd7f7bb9ca1 (release-v2): Hotfix 5 in v2
|
o ...37bbc88f3ef0 (release-v2): Hotfix 4 in v2
|
| @ ...dae2f368ca07 (default): Update 10 to v3
| |
| o 9c224e89cb31 (default): Update 5 to v3
| |
| o ...04fb59c7c9dc (default): Update 4 to v3
|/
| o b2253e82401f (release-v1): Hotfix 5 in v1
| |
| o ...960ac37d74fd (release-v1): Hotfix 4 in v1
| |
o | 986298e3f347 (default): Update 5 to v2
| |
o | ...75d539c667ec (default): Update 4 to v2
|/
o 04c71bd5707f (default): Add 5
|
o ...881b3891d041 (default): Add 4
Narrow clone the first file, hitting edge condition where unaligned
changeset and manifest revnums cross branches.
$ hg clone --narrow ssh://user@dummy/master narrow --include "f1"
requesting all changes
adding changesets
adding manifests
adding file changes
added 10 changesets with 4 changes to 1 files (+2 heads)
new changesets *:* (glob)
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cd narrow
$ hg log -G -T "{if(ellipsis, '...')}{node|short} ({branch}): {desc}\n"
o ...031f516143fe (release-v2): Hotfix 9 in v2
|
| @ ...dae2f368ca07 (default): Update 10 to v3
| |
| o 1f5d184b8e96 (default): Update 1 to v3
|/
| o ...b2253e82401f (release-v1): Hotfix 5 in v1
| |
| o 133502f6b7e5 (release-v1): Hotfix 1 in v1
| |
o | ...79165c83d644 (default): Update 10 to v2
| |
o | c7b7a5f2f088 (default): Update 1 to v2
| |
| o ...f0531a3db7a9 (release-v1): Start release for v1
|/
o ...6a3f0f0abef3 (default): Add 10
|
o e012ac15eaaa (default): Add 1