changeset 21069:0a9cae236738

bundle2: allow bundle2 for pulling over the wire This changeset makes `wireprotocol` peers advertise bundle2 capability and comply with bundle2 `getbundle` requests. Note that advertising bundle2 could make a client try to use it for push. Such pushes would fail. However, I do not expect any human being to have enabled bundle2 on their server yet.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Tue, 15 Apr 2014 15:20:33 -0400
parents c15b66a6bbb4
children 408877d491fb
files mercurial/wireproto.py tests/test-bundle2.t
diffstat 2 files changed, 38 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/wireproto.py	Tue Apr 15 11:27:55 2014 -0400
+++ b/mercurial/wireproto.py	Tue Apr 15 15:20:33 2014 -0400
@@ -8,7 +8,7 @@
 import urllib, tempfile, os, sys
 from i18n import _
 from node import bin, hex
-import changegroup as changegroupmod
+import changegroup as changegroupmod, bundle2
 import peer, error, encoding, util, store, exchange
 
 
@@ -335,7 +335,10 @@
         if bundlecaps is not None:
             opts['bundlecaps'] = ','.join(bundlecaps)
         f = self._callcompressable("getbundle", **opts)
-        return changegroupmod.unbundle10(f, 'UN')
+        if bundlecaps is not None and 'HG20' in bundlecaps:
+            return bundle2.unbundle20(self.ui, f)
+        else:
+            return changegroupmod.unbundle10(f, 'UN')
 
     def unbundle(self, cg, heads, source):
         '''Send cg (a readable file-like object representing the
@@ -565,6 +568,8 @@
         # otherwise, add 'streamreqs' detailing our local revlog format
         else:
             caps.append('streamreqs=%s' % ','.join(requiredformats))
+    if repo.ui.configbool('server', 'bundle2', False):
+        caps.append('bundle2')
     caps.append('unbundle=%s' % ','.join(changegroupmod.bundlepriority))
     caps.append('httpheader=1024')
     return caps
@@ -602,7 +607,7 @@
             opts[k] = decodelist(v)
         elif k == 'bundlecaps':
             opts[k] = set(v.split(','))
-    cg = changegroupmod.getbundle(repo, 'serve', **opts)
+    cg = exchange.getbundle(repo, 'serve', **opts)
     return streamres(proto.groupchunks(cg))
 
 @wireprotocommand('heads')
--- a/tests/test-bundle2.t	Tue Apr 15 11:27:55 2014 -0400
+++ b/tests/test-bundle2.t	Tue Apr 15 15:20:33 2014 -0400
@@ -156,6 +156,8 @@
   > bundle2=$TESTTMP/bundle2.py
   > [server]
   > bundle2=True
+  > [ui]
+  > ssh=python "$TESTDIR/dummyssh"
   > EOF
 
 The extension requires a repo (currently unused)
@@ -682,3 +684,31 @@
   adding manifests
   adding file changes
   added 1 changesets with 0 changes to 0 files (-1 heads)
+
+pull over ssh
+
+  $ hg -R other pull ssh://user@dummy/main -r 02de42196ebe --traceback
+  pulling from ssh://user@dummy/main
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  (run 'hg heads' to see heads, 'hg merge' to merge)
+
+pull over http
+
+  $ hg -R main serve -p $HGPORT -d --pid-file=main.pid -E main-error.log
+  $ cat main.pid >> $DAEMON_PIDS
+
+  $ hg -R other pull http://localhost:$HGPORT/ -r 42ccdea3bb16
+  pulling from http://localhost:$HGPORT/
+  searching for changes
+  adding changesets
+  adding manifests
+  adding file changes
+  added 1 changesets with 1 changes to 1 files (+1 heads)
+  (run 'hg heads .' to see heads, 'hg merge' to merge)
+  $ cat main-error.log
+
+