Mercurial > hg-stable
view tests/test-fastannotate-renames.t @ 39238:1ddb296e0dee
fastannotate: initial import from Facebook's hg-experimental
I made as few changes as I could to get the tests to pass, but this
was a bit involved due to some churn in the blame code since someone
last gave fastannotate any TLC.
There's still follow-up work here to rip out support for old versions
of hg and to integrate the protocol with modern standards.
Some performance numbers (all on my 2016 MacBook Pro with a 2.6Ghz i7):
Mercurial mercurial/manifest.py
traditional blame
time: real 1.050 secs (user 0.990+0.000 sys 0.060+0.000)
build cache
time: real 5.900 secs (user 5.720+0.000 sys 0.110+0.000)
fastannotate
time: real 0.120 secs (user 0.100+0.000 sys 0.020+0.000)
Mercurial mercurial/localrepo.py
traditional blame
time: real 3.330 secs (user 3.220+0.000 sys 0.070+0.000)
build cache
time: real 30.610 secs (user 30.190+0.000 sys 0.230+0.000)
fastannotate
time: real 0.180 secs (user 0.160+0.000 sys 0.020+0.000)
mozilla-central dom/ipc/ContentParent.cpp
traditional blame
time: real 7.640 secs (user 7.210+0.000 sys 0.380+0.000)
build cache
time: real 98.650 secs (user 97.000+0.000 sys 0.950+0.000)
fastannotate
time: real 1.580 secs (user 1.340+0.000 sys 0.240+0.000)
mozilla-central dom/base/nsDocument.cpp
traditional blame
time: real 17.110 secs (user 16.490+0.000 sys 0.500+0.000)
build cache
time: real 399.750 secs (user 394.520+0.000 sys 2.610+0.000)
fastannotate
time: real 1.780 secs (user 1.530+0.000 sys 0.240+0.000)
So building the cache is expensive (but might be faster with xdiff
enabled), but the blame results are *way* faster.
Differential Revision: https://phab.mercurial-scm.org/D3994
author | Augie Fackler <augie@google.com> |
---|---|
date | Mon, 30 Jul 2018 22:50:00 -0400 |
parents | |
children |
line wrap: on
line source
$ cat >> $HGRCPATH << EOF > [extensions] > fastannotate= > [fastannotate] > mainbranch=main > EOF $ hg init repo $ cd repo add or rename files on top of the master branch $ echo a1 > a $ echo b1 > b $ hg commit -qAm 1 $ hg bookmark -i main $ hg fastannotate --debug -nf b fastannotate: b: 1 new changesets in the main branch 0 b: b1 $ hg fastannotate --debug -nf a fastannotate: a: 1 new changesets in the main branch 0 a: a1 $ echo a2 >> a $ cat > b << EOF > b0 > b1 > EOF $ hg mv a t $ hg mv b a $ hg mv t b $ hg commit -m 'swap names' existing linelogs are not helpful with such renames in side branches $ hg fastannotate --debug -nf a fastannotate: a: linelog cannot help in annotating this revision 1 a: b0 0 b: b1 $ hg fastannotate --debug -nf b fastannotate: b: linelog cannot help in annotating this revision 0 a: a1 1 b: a2 move main branch forward, rebuild should happen $ hg bookmark -i main -r . -q $ hg fastannotate --debug -nf b fastannotate: b: cache broken and deleted fastannotate: b: 2 new changesets in the main branch 0 a: a1 1 b: a2 $ hg fastannotate --debug -nf b fastannotate: b: using fast path (resolved fctx: True) 0 a: a1 1 b: a2 for rev 0, the existing linelog is still useful for a, but not for b $ hg fastannotate --debug -nf a -r 0 fastannotate: a: using fast path (resolved fctx: True) 0 a: a1 $ hg fastannotate --debug -nf b -r 0 fastannotate: b: linelog cannot help in annotating this revision 0 b: b1 a rebuild can also be triggered if "the main branch last time" mismatches $ echo a3 >> a $ hg commit -m a3 $ cat >> b << EOF > b3 > b4 > EOF $ hg commit -m b4 $ hg bookmark -i main -q $ hg fastannotate --debug -nf a fastannotate: a: cache broken and deleted fastannotate: a: 3 new changesets in the main branch 1 a: b0 0 b: b1 2 a: a3 $ hg fastannotate --debug -nf a fastannotate: a: using fast path (resolved fctx: True) 1 a: b0 0 b: b1 2 a: a3 linelog can be updated without being helpful $ hg mv a t $ hg mv b a $ hg mv t b $ hg commit -m 'swap names again' $ hg fastannotate --debug -nf b fastannotate: b: 1 new changesets in the main branch 1 a: b0 0 b: b1 2 a: a3 $ hg fastannotate --debug -nf b fastannotate: b: linelog cannot help in annotating this revision 1 a: b0 0 b: b1 2 a: a3 move main branch forward again, rebuilds are one-time $ hg bookmark -i main -q $ hg fastannotate --debug -nf a fastannotate: a: cache broken and deleted fastannotate: a: 4 new changesets in the main branch 0 a: a1 1 b: a2 3 b: b3 3 b: b4 $ hg fastannotate --debug -nf b fastannotate: b: cache broken and deleted fastannotate: b: 4 new changesets in the main branch 1 a: b0 0 b: b1 2 a: a3 $ hg fastannotate --debug -nf a fastannotate: a: using fast path (resolved fctx: True) 0 a: a1 1 b: a2 3 b: b3 3 b: b4 $ hg fastannotate --debug -nf b fastannotate: b: using fast path (resolved fctx: True) 1 a: b0 0 b: b1 2 a: a3 list changeset hashes to improve readability $ hg log -T '{rev}:{node}\n' 4:980e1ab8c516350172928fba95b49ede3b643dca 3:14e123fedad9f491f5dde0beca2a767625a0a93a 2:96495c41e4c12218766f78cdf244e768d7718b0f 1:35c2b781234c994896aba36bd3245d3104e023df 0:653e95416ebb5dbcc25bbc7f75568c9e01f7bd2f annotate a revision not in the linelog. linelog cannot be used, but does not get rebuilt either $ hg fastannotate --debug -nf a -r 96495c41e4c12218766f78cdf244e768d7718b0f fastannotate: a: linelog cannot help in annotating this revision 1 a: b0 0 b: b1 2 a: a3 $ hg fastannotate --debug -nf a -r 2 fastannotate: a: linelog cannot help in annotating this revision 1 a: b0 0 b: b1 2 a: a3 $ hg fastannotate --debug -nf a -r . fastannotate: a: using fast path (resolved fctx: True) 0 a: a1 1 b: a2 3 b: b3 3 b: b4 annotate an ancient revision where the path matches. linelog can be used $ hg fastannotate --debug -nf a -r 0 fastannotate: a: using fast path (resolved fctx: True) 0 a: a1 $ hg fastannotate --debug -nf a -r 653e95416ebb5dbcc25bbc7f75568c9e01f7bd2f fastannotate: a: using fast path (resolved fctx: False) 0 a: a1