branchcache: skip entries that are topological heads in the on disk file
In the majority of cases, topological heads are also branch heads. We have
efficient way to get the topological heads and efficient way to retrieve
their branch information. So there is little value in putting them in the branch
cache file explicitly. On the contrary, writing them explicitly tend to create
very large cache file that are inefficient to read and update.
So the branch cache v3 format is no longer including them. This changeset focus
on the format aspect and have no focus on the performance aspect. We will cover
that later.
https://bz.mercurial-scm.org/672
# 0-2-4
# \ \ \
# 1-3-5
#
# rename in #1, content change in #4.
$ hg init repo
$ cd repo
$ touch 1
$ touch 2
$ hg commit -Am init # 0
adding 1
adding 2
$ hg rename 1 1a
$ hg commit -m rename # 1
$ hg co -C 0
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo unrelated >> 2
$ hg ci -m unrelated1 # 2
created new head
$ hg merge --debug 1
unmatched files in other:
1a
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on remote side:
src: '1' -> dst: '1a'
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
ancestor: 81f4b099af3d, local: c64f439569a9+, remote: c12dcd37c90a
1: other deleted -> r
removing 1
1a: remote created -> g
getting 1a
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg ci -m merge1 # 3
$ hg co -C 2
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ echo hello >> 1
$ hg ci -m unrelated2 # 4
created new head
$ hg co -C 3
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge -y --debug 4
unmatched files in local:
1a
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on local side:
src: '1' -> dst: '1a' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
ancestor: c64f439569a9, local: f4a9cff3cd0b+, remote: 746e9549ea96
starting 4 threads for background file closing (?)
preserving 1a for resolve of 1a
1a: local copied/moved from 1 -> m
picked tool ':merge' for 1a (binary False symlink False changedelete False)
merging 1a and 1 to 1a
my 1a@f4a9cff3cd0b+ other 1@746e9549ea96 ancestor 1@c64f439569a9
premerge successful
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
$ hg co -C 4
1 files updated, 0 files merged, 1 files removed, 0 files unresolved
$ hg merge -y --debug 3
unmatched files in other:
1a
all copies found (* = to merge, ! = divergent, % = renamed and deleted):
on remote side:
src: '1' -> dst: '1a' *
checking for directory renames
resolving manifests
branchmerge: True, force: False, partial: False
ancestor: c64f439569a9, local: 746e9549ea96+, remote: f4a9cff3cd0b
starting 4 threads for background file closing (?)
preserving 1 for resolve of 1a
removing 1
1a: remote moved from 1 -> m
picked tool ':merge' for 1a (binary False symlink False changedelete False)
merging 1 and 1a to 1a
my 1a@746e9549ea96+ other 1a@f4a9cff3cd0b ancestor 1@c64f439569a9
premerge successful
0 files updated, 1 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)