##// END OF EJS Templates
bisect: avoid adding irrelevant revisions to bisect state...
bisect: avoid adding irrelevant revisions to bisect state When adding new revisions to the bisect state, it only makes sense to add information about revisions that are under consideration (i.e., those that are topologically between the known good and bad revisions). However, if the user passes in a revset (e.g., '!merge()' to exclude merge commits), hg will resolve the revset first and add all matching revisions to the bisect state (which in this case would likely be the majority of revisions in the repo). To avoid this, revisions should only be added to the bisect state if they are between the good and bad revisions (and therefore relevant to the bisection). -- Here are the results of some performance tests using the `mozilla-central` repo (since it is one of the largest freely-available hg repositories in the wild). These tests compare the performance of a locally-built `hg` before and after application of this series. Note that `--noupdate` is passed to avoid including update time (which should not vary across cases). Setup (run between each test): $ hg bisect --reset $ hg bisect --noupdate --bad 56c3ad4bde5c70714b784ccf15d099e0df0f5bde $ hg bisect --noupdate --good 57426696adaf08298af3027fa77486fee0633b13 Test using a revset that returns a very large number of revisions: $ time hg bisect --noupdate --skip '!merge()' > /dev/null Before: real 0m9.398s user 0m9.233s sys 0m0.120s After: real 0m1.513s user 0m1.425s sys 0m0.052s Test using a revset that is expensive to compute: $ time hg bisect --noupdate --skip 'desc("Bug")' > /dev/null Before: real 0m49.853s user 0m49.580s sys 0m0.243s After: real 0m4.120s user 0m4.036s sys 0m0.048s

File last commit:

r48733:0c92cd92 default
r50337:81623652 default
Show More
test-fastannotate-protocol.t
207 lines | 5.4 KiB | text/troff | Tads3Lexer
/ tests / test-fastannotate-protocol.t
$ cat >> $HGRCPATH << EOF
> [extensions]
> fastannotate=
> [fastannotate]
> mainbranch=@
> EOF
setup the server repo
$ hg init repo-server
$ cd repo-server
$ cat >> .hg/hgrc << EOF
> [fastannotate]
> server=1
> EOF
$ for i in 1 2 3 4; do
> echo $i >> a
> hg commit -A -m $i a
> done
$ [ -d .hg/fastannotate ]
[1]
$ hg bookmark @
$ cd ..
setup the local repo
$ hg clone 'ssh://user@dummy/repo-server' repo-local -q
$ cd repo-local
$ cat >> .hg/hgrc << EOF
> [fastannotate]
> client=1
> clientfetchthreshold=0
> EOF
$ [ -d .hg/fastannotate ]
[1]
$ hg fastannotate a --debug
running * (glob)
sending hello command
sending between command
remote: * (glob) (?)
remote: capabilities: * (glob)
remote: * (glob) (?)
sending protocaps command
fastannotate: requesting 1 files
sending getannotate command
fastannotate: writing 112 bytes to fastannotate/default/a.l
fastannotate: writing 94 bytes to fastannotate/default/a.m
fastannotate: a: using fast path (resolved fctx: True)
0: 1
1: 2
2: 3
3: 4
the cache could be reused and no download is necessary
$ hg fastannotate a --debug
fastannotate: a: using fast path (resolved fctx: True)
0: 1
1: 2
2: 3
3: 4
if the client agrees where the head of the master branch is, no re-download
happens even if the client has more commits
$ echo 5 >> a
$ hg commit -m 5
$ hg bookmark -r 3 @ -f
$ hg fastannotate a --debug
0: 1
1: 2
2: 3
3: 4
4: 5
if the client has a different "@" (head of the master branch) and "@" is ahead
of the server, the server can detect things are unchanged and does not return
full contents (not that there is no "writing ... to fastannotate"), but the
client can also build things up on its own (causing diverge)
$ hg bookmark -r 4 @ -f
$ hg fastannotate a --debug
running * (glob)
sending hello command
sending between command
remote: * (glob) (?)
remote: capabilities: * (glob)
remote: * (glob) (?)
sending protocaps command
fastannotate: requesting 1 files
sending getannotate command
fastannotate: a: 1 new changesets in the main branch
0: 1
1: 2
2: 3
3: 4
4: 5
if the client has a different "@" which is behind the server. no download is
necessary
$ hg fastannotate a --debug --config fastannotate.mainbranch=2
fastannotate: a: using fast path (resolved fctx: True)
0: 1
1: 2
2: 3
3: 4
4: 5
define fastannotate on-disk paths
$ p1=.hg/fastannotate/default
$ p2=../repo-server/.hg/fastannotate/default
revert bookmark change so the client is behind the server
$ hg bookmark -r 2 @ -f
in the "fctx" mode with the "annotate" command, the client also downloads the
cache. but not in the (default) "fastannotate" mode.
$ rm $p1/a.l $p1/a.m
$ hg annotate a --debug | grep 'fastannotate: writing'
[1]
$ hg annotate a --config fastannotate.modes=fctx --debug | grep 'fastannotate: writing' | sort
fastannotate: writing 112 bytes to fastannotate/default/a.l
fastannotate: writing 94 bytes to fastannotate/default/a.m
the fastannotate cache (built server-side, downloaded client-side) in two repos
have the same content (because the client downloads from the server)
$ diff $p1/a.l $p2/a.l
$ diff $p1/a.m $p2/a.m
in the "fctx" mode, the client could also build the cache locally
$ hg annotate a --config fastannotate.modes=fctx --debug --config fastannotate.mainbranch=4 | grep fastannotate
fastannotate: requesting 1 files
fastannotate: a: 1 new changesets in the main branch
the server would rebuild broken cache automatically
$ cp $p2/a.m $p2/a.m.bak
$ echo BROKEN1 > $p1/a.m
$ echo BROKEN2 > $p2/a.m
$ hg fastannotate a --debug | grep 'fastannotate: writing' | sort
fastannotate: writing 112 bytes to fastannotate/default/a.l
fastannotate: writing 94 bytes to fastannotate/default/a.m
$ diff $p1/a.m $p2/a.m
$ diff $p2/a.m $p2/a.m.bak
use the "debugbuildannotatecache" command to build annotate cache
$ rm -rf $p1 $p2
$ hg --cwd ../repo-server debugbuildannotatecache a --debug
fastannotate: a: 4 new changesets in the main branch
$ hg --cwd ../repo-local debugbuildannotatecache a --debug
running * (glob)
sending hello command
sending between command
remote: * (glob) (?)
remote: capabilities: * (glob)
remote: * (glob) (?)
sending protocaps command
fastannotate: requesting 1 files
sending getannotate command
fastannotate: writing * (glob)
fastannotate: writing * (glob)
$ diff $p1/a.l $p2/a.l
$ diff $p1/a.m $p2/a.m
with the clientfetchthreshold config option, the client can build up the cache
without downloading from the server
$ rm -rf $p1
$ hg fastannotate a --debug --config fastannotate.clientfetchthreshold=10
fastannotate: a: 3 new changesets in the main branch
0: 1
1: 2
2: 3
3: 4
4: 5
if the fastannotate directory is not writable, the fctx mode still works
$ rm -rf $p1
$ touch $p1
$ hg annotate a --debug --traceback --config fastannotate.modes=fctx
fastannotate: a: cache broken and deleted
fastannotate: prefetch failed: * (glob)
fastannotate: a: cache broken and deleted
fastannotate: falling back to the vanilla annotate: * (glob)
0: 1
1: 2
2: 3
3: 4
4: 5
with serverbuildondemand=False, the server will not build anything
$ cat >> ../repo-server/.hg/hgrc <<EOF
> [fastannotate]
> serverbuildondemand=False
> EOF
$ rm -rf $p1 $p2
$ hg fastannotate a --debug | grep 'fastannotate: writing'
[1]