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.
=========================================================
Test features and behaviors related to the archived phase
=========================================================
$ cat << EOF >> $HGRCPATH
> [format]
> exp-archived-phase=yes
> [extensions]
> strip=
> [experimental]
> EOF
$ hg init repo
$ cd repo
$ echo root > a
$ hg add a
$ hg ci -m 'root'
Test that bundle can unarchive a changeset
------------------------------------------
$ echo foo >> a
$ hg st
M a
$ hg ci -m 'unbundletesting'
$ hg log -G
@ changeset: 1:883aadbbf309
| tag: tip
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unbundletesting
|
o changeset: 0:c1863a3840c6
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
$ hg strip --soft --rev '.'
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/repo/.hg/strip-backup/883aadbbf309-efc55adc-backup.hg
$ hg log -G
@ changeset: 0:c1863a3840c6
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
$ hg log -G --hidden
o changeset: 1:883aadbbf309
| tag: tip
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unbundletesting
|
@ changeset: 0:c1863a3840c6
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
$ hg unbundle .hg/strip-backup/883aadbbf309-efc55adc-backup.hg
adding changesets
adding manifests
adding file changes
added 0 changesets with 0 changes to 1 files
(run 'hg update' to get a working copy)
$ hg log -G
o changeset: 1:883aadbbf309
| tag: tip
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unbundletesting
|
@ changeset: 0:c1863a3840c6
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
Test that history rewriting command can use the archived phase when allowed to
------------------------------------------------------------------------------
$ hg up 'desc(unbundletesting)'
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ echo bar >> a
$ hg commit --amend --config experimental.cleanup-as-archived=yes
$ hg log -G
@ changeset: 2:d1e73e428f29
| tag: tip
| parent: 0:c1863a3840c6
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unbundletesting
|
o changeset: 0:c1863a3840c6
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
$ hg log -G --hidden
@ changeset: 2:d1e73e428f29
| tag: tip
| parent: 0:c1863a3840c6
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unbundletesting
|
| o changeset: 1:883aadbbf309
|/ user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unbundletesting
|
o changeset: 0:c1863a3840c6
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
$ ls -1 .hg/strip-backup/
883aadbbf309-efc55adc-amend.hg
883aadbbf309-efc55adc-backup.hg
$ hg unbundle .hg/strip-backup/883aadbbf309*amend.hg
adding changesets
adding manifests
adding file changes
added 0 changesets with 0 changes to 1 files
(run 'hg update' to get a working copy)
$ hg log -G
@ changeset: 2:d1e73e428f29
| tag: tip
| parent: 0:c1863a3840c6
| user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unbundletesting
|
| o changeset: 1:883aadbbf309
|/ user: test
| date: Thu Jan 01 00:00:00 1970 +0000
| summary: unbundletesting
|
o changeset: 0:c1863a3840c6
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: root
Test that a strip will preserve unrelated changeset archived
------------------------------------------------------------
prepare a suitable tree
$ echo foo > bar
$ hg add bar
$ hg commit -m 'some more commit'
$ hg log -G --hidden -T '{rev} {node|short} [{phase}] {desc|firstline}\n'
@ 3 f90bf4e57854 [draft] some more commit
|
o 2 d1e73e428f29 [draft] unbundletesting
|
| o 1 883aadbbf309 [draft] unbundletesting
|/
o 0 c1863a3840c6 [draft] root
$ hg strip --soft --rev '.'
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
saved backup bundle to $TESTTMP/repo/.hg/strip-backup/f90bf4e57854-56b37ff2-backup.hg
$ hg log -G --hidden -T '{rev} {node|short} [{phase}] {desc|firstline}\n'
o 3 f90bf4e57854 [archived] some more commit
|
@ 2 d1e73e428f29 [draft] unbundletesting
|
| o 1 883aadbbf309 [draft] unbundletesting
|/
o 0 c1863a3840c6 [draft] root
Strips the other (lower rev-num) head
$ hg strip --rev 'min(head() and not .)'
saved backup bundle to $TESTTMP/repo/.hg/strip-backup/883aadbbf309-efc55adc-backup.hg
The archived changeset should still be hidden
$ hg log -G -T '{rev} {node|short} [{phase}] {desc|firstline}\n'
@ 1 d1e73e428f29 [draft] unbundletesting
|
o 0 c1863a3840c6 [draft] root
It may still be around:
$ hg log --hidden -G -T '{rev} {node|short} [{phase}] {desc|firstline}\n'
o 2 f90bf4e57854 [archived] some more commit
|
@ 1 d1e73e428f29 [draft] unbundletesting
|
o 0 c1863a3840c6 [draft] root