--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-clonebundles.t Fri Oct 09 11:22:01 2015 -0700
@@ -0,0 +1,143 @@
+Set up a server
+
+ $ hg init server
+ $ cd server
+ $ cat >> .hg/hgrc << EOF
+ > [extensions]
+ > clonebundles =
+ > EOF
+
+ $ touch foo
+ $ hg -q commit -A -m 'add foo'
+ $ touch bar
+ $ hg -q commit -A -m 'add bar'
+
+ $ hg serve -d -p $HGPORT --pid-file hg.pid --accesslog access.log
+ $ cat hg.pid >> $DAEMON_PIDS
+ $ cd ..
+
+Feature disabled by default
+(client should not request manifest)
+
+ $ hg clone -U http://localhost:$HGPORT feature-disabled
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+
+ $ cat server/access.log
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob)
+ * - - [*] "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:bundlecaps=HG20%2Cbundle2%3DHG20%250Achangegroup%253D01%252C02%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps&cg=1&common=0000000000000000000000000000000000000000&heads=aaff8d2ffbbf07a46dd1f05d8ae7877e3f56e2a2&listkeys=phase%2Cbookmarks (glob)
+ * - - [*] "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases (glob)
+
+ $ cat >> $HGRCPATH << EOF
+ > [experimental]
+ > clonebundles = true
+ > EOF
+
+Missing manifest should not result in server lookup
+
+ $ hg --verbose clone -U http://localhost:$HGPORT no-manifest
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+
+ $ tail -4 server/access.log
+ * - - [*] "GET /?cmd=capabilities HTTP/1.1" 200 - (glob)
+ * - - [*] "GET /?cmd=batch HTTP/1.1" 200 - x-hgarg-1:cmds=heads+%3Bknown+nodes%3D (glob)
+ * - - [*] "GET /?cmd=getbundle HTTP/1.1" 200 - x-hgarg-1:bundlecaps=HG20%2Cbundle2%3DHG20%250Achangegroup%253D01%252C02%250Adigests%253Dmd5%252Csha1%252Csha512%250Aerror%253Dabort%252Cunsupportedcontent%252Cpushraced%252Cpushkey%250Ahgtagsfnodes%250Alistkeys%250Apushkey%250Aremote-changegroup%253Dhttp%252Chttps&cg=1&common=0000000000000000000000000000000000000000&heads=aaff8d2ffbbf07a46dd1f05d8ae7877e3f56e2a2&listkeys=phase%2Cbookmarks (glob)
+ * - - [*] "GET /?cmd=listkeys HTTP/1.1" 200 - x-hgarg-1:namespace=phases (glob)
+
+Empty manifest file results in retrieval
+(the extension only checks if the manifest file exists)
+
+ $ touch server/.hg/clonebundles.manifest
+ $ hg --verbose clone -U http://localhost:$HGPORT empty-manifest
+ no clone bundles available on remote; falling back to regular clone
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+
+Manifest file with invalid URL aborts
+
+ $ echo 'http://does.not.exist/bundle.hg' > server/.hg/clonebundles.manifest
+ $ hg clone http://localhost:$HGPORT 404-url
+ applying clone bundle from http://does.not.exist/bundle.hg
+ error fetching bundle: [Errno -2] Name or service not known
+ abort: error applying bundle
+ (consider contacting the server operator if this error persists)
+ [255]
+
+Server is not running aborts
+
+ $ echo "http://localhost:$HGPORT1/bundle.hg" > server/.hg/clonebundles.manifest
+ $ hg clone http://localhost:$HGPORT server-not-runner
+ applying clone bundle from http://localhost:$HGPORT1/bundle.hg
+ error fetching bundle: [Errno 111] Connection refused
+ abort: error applying bundle
+ (consider contacting the server operator if this error persists)
+ [255]
+
+Server returns 404
+
+ $ python $TESTDIR/dumbhttp.py -p $HGPORT1 --pid http.pid
+ $ cat http.pid >> $DAEMON_PIDS
+ $ hg clone http://localhost:$HGPORT running-404
+ applying clone bundle from http://localhost:$HGPORT1/bundle.hg
+ HTTP error fetching bundle: HTTP Error 404: File not found
+ abort: error applying bundle
+ (consider contacting the server operator if this error persists)
+ [255]
+
+We can override failure to fall back to regular clone
+
+ $ hg --config ui.clonebundlefallback=true clone -U http://localhost:$HGPORT 404-fallback
+ applying clone bundle from http://localhost:$HGPORT1/bundle.hg
+ HTTP error fetching bundle: HTTP Error 404: File not found
+ falling back to normal clone
+ requesting all changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+
+Bundle with partial content works
+
+ $ hg -R server bundle --type gzip --base null -r 53245c60e682 partial.hg
+ 1 changesets found
+
+ $ echo "http://localhost:$HGPORT1/partial.hg" > server/.hg/clonebundles.manifest
+ $ hg clone -U http://localhost:$HGPORT partial-bundle
+ applying clone bundle from http://localhost:$HGPORT1/partial.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+ finished applying clone bundle
+ searching for changes
+ adding changesets
+ adding manifests
+ adding file changes
+ added 1 changesets with 1 changes to 1 files
+
+Bundle with full content works
+
+ $ hg -R server bundle --type gzip --base null -r tip full.hg
+ 2 changesets found
+
+ $ echo "http://localhost:$HGPORT1/full.hg" > server/.hg/clonebundles.manifest
+ $ hg clone -U http://localhost:$HGPORT full-bundle
+ applying clone bundle from http://localhost:$HGPORT1/full.hg
+ adding changesets
+ adding manifests
+ adding file changes
+ added 2 changesets with 2 changes to 2 files
+ finished applying clone bundle
+ searching for changes
+ no changes found