dirstate-v2: Add `hg debugupgraderepo` command support
This command changes changes the file formats used inside an existing
repository to what they would be in a new repository with the current config.
For example:
hg debugupgraderepo --config format.exp-dirstate-v2=1 --run
hg debugupgraderepo --config format.exp-dirstate-v2=0 --run
If a repository has a dirstate in v1 format, the first command would upgrade it
to dirstate-v2. Conversely, if a repository has a dirstate in v2 format, the
second command would downgrade it to v1. (Both may also run some unrelated
upgrades.)
Since `format.exp-dirstate-v2` is currently disabled by default, not specifying
it in `--config` or any configuration file would result in the second command.
Differential Revision: https://phab.mercurial-scm.org/D10769
$ cat >> $HGRCPATH << EOF
> [extensions]
> fastannotate=
> EOF
$ hg init repo
$ cd repo
$ for i in 0 1 2 3 4; do
> echo $i >> a
> echo $i >> b
> hg commit -A -m $i a b
> done
use the "debugbuildannotatecache" command to build annotate cache at rev 0
$ hg debugbuildannotatecache --debug --config fastannotate.mainbranch=0
fastannotate: a: 1 new changesets in the main branch
fastannotate: b: 1 new changesets in the main branch
"debugbuildannotatecache" should work with broken cache (and other files would
be built without being affected). note: linelog being broken is only noticed
when we try to append to it.
$ echo 'CORRUPT!' >> .hg/fastannotate/default/a.m
$ hg debugbuildannotatecache --debug --config fastannotate.mainbranch=1
fastannotate: a: rebuilding broken cache
fastannotate: a: 2 new changesets in the main branch
fastannotate: b: 1 new changesets in the main branch
$ echo 'CANNOT REUSE!' > .hg/fastannotate/default/a.l
$ hg debugbuildannotatecache --debug --config fastannotate.mainbranch=2
fastannotate: a: rebuilding broken cache
fastannotate: a: 3 new changesets in the main branch
fastannotate: b: 1 new changesets in the main branch
$ rm .hg/fastannotate/default/a.m
$ hg debugbuildannotatecache --debug --config fastannotate.mainbranch=3
fastannotate: a: rebuilding broken cache
fastannotate: a: 4 new changesets in the main branch
fastannotate: b: 1 new changesets in the main branch
$ rm .hg/fastannotate/default/a.l
$ hg debugbuildannotatecache --debug --config fastannotate.mainbranch=3
$ hg debugbuildannotatecache --debug --config fastannotate.mainbranch=4
fastannotate: a: rebuilding broken cache
fastannotate: a: 5 new changesets in the main branch
fastannotate: b: 1 new changesets in the main branch
"fastannotate" should deal with file corruption as well
$ rm -rf .hg/fastannotate
$ hg fastannotate --debug -r 0 a
fastannotate: a: 1 new changesets in the main branch
0: 0
$ echo 'CORRUPT!' >> .hg/fastannotate/default/a.m
$ hg fastannotate --debug -r 0 a
fastannotate: a: cache broken and deleted
fastannotate: a: 1 new changesets in the main branch
0: 0
$ echo 'CORRUPT!' > .hg/fastannotate/default/a.l
$ hg fastannotate --debug -r 1 a
fastannotate: a: cache broken and deleted
fastannotate: a: 2 new changesets in the main branch
0: 0
1: 1
$ rm .hg/fastannotate/default/a.l
$ hg fastannotate --debug -r 1 a
fastannotate: a: using fast path (resolved fctx: True)
fastannotate: a: cache broken and deleted
fastannotate: a: 2 new changesets in the main branch
0: 0
1: 1
$ rm .hg/fastannotate/default/a.m
$ hg fastannotate --debug -r 2 a
fastannotate: a: cache broken and deleted
fastannotate: a: 3 new changesets in the main branch
0: 0
1: 1
2: 2