--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-fastannotate-protocol.t Mon Jul 30 22:50:00 2018 -0400
@@ -0,0 +1,216 @@
+ $ cat >> $HGRCPATH << EOF
+ > [ui]
+ > ssh = $PYTHON "$TESTDIR/dummyssh"
+ > [extensions]
+ > fastannotate=
+ > [fastannotate]
+ > mainbranch=@
+ > EOF
+
+ $ HGMERGE=true; export HGMERGE
+
+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: server returned
+ 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: server returned
+ 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: server returned
+ 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: server returned
+ 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]