bundle2: support for push over the wire
We use the new method defined in the past changeset to send a bundle2 stream and
receive one in reply. The http version is missing remote output support. This
will be done later using a bundle part.
--- a/mercurial/wireproto.py Tue Apr 15 17:53:52 2014 -0400
+++ b/mercurial/wireproto.py Tue Apr 15 11:53:10 2014 -0400
@@ -343,8 +343,12 @@
def unbundle(self, cg, heads, source):
'''Send cg (a readable file-like object representing the
changegroup to push, typically a chunkbuffer object) to the
- remote server as a bundle. Return an integer indicating the
- result of the push (see localrepository.addchangegroup()).'''
+ remote server as a bundle.
+
+ When pushing a bundle10 stream, return an integer indicating the
+ result of the push (see localrepository.addchangegroup()).
+
+ When pushing a bundle20 stream, return a bundle20 stream.'''
if heads != ['force'] and self.capable('unbundlehash'):
heads = encodelist(['hashed',
@@ -352,18 +356,24 @@
else:
heads = encodelist(heads)
- ret, output = self._callpush("unbundle", cg, heads=heads)
- if ret == "":
- raise error.ResponseError(
- _('push failed:'), output)
- try:
- ret = int(ret)
- except ValueError:
- raise error.ResponseError(
- _('push failed (unexpected response):'), ret)
+ if util.safehasattr(cg, 'deltaheader'):
+ # this a bundle10, do the old style call sequence
+ ret, output = self._callpush("unbundle", cg, heads=heads)
+ if ret == "":
+ raise error.ResponseError(
+ _('push failed:'), output)
+ try:
+ ret = int(ret)
+ except ValueError:
+ raise error.ResponseError(
+ _('push failed (unexpected response):'), ret)
- for l in output.splitlines(True):
- self.ui.status(_('remote: '), l)
+ for l in output.splitlines(True):
+ self.ui.status(_('remote: '), l)
+ else:
+ # bundle2 push. Send a stream, fetch a stream.
+ stream = self._calltwowaystream('unbundle', cg, heads=heads)
+ ret = bundle2.unbundle20(self.ui, stream)
return ret
def debugwireargs(self, one, two, three=None, four=None, five=None):
@@ -781,6 +791,10 @@
gen = exchange.readbundle(repo.ui, fp, None)
r = exchange.unbundle(repo, gen, their_heads, 'serve',
proto._client())
+ if util.safehasattr(r, 'addpart'):
+ # The return looks streameable, we are in the bundle2 case and
+ # should return a stream.
+ return streamres(r.getchunks())
return pushres(r)
finally:
--- a/tests/test-bundle2.t Tue Apr 15 17:53:52 2014 -0400
+++ b/tests/test-bundle2.t Tue Apr 15 11:53:10 2014 -0400
@@ -158,6 +158,9 @@
> bundle2=True
> [ui]
> ssh=python "$TESTDIR/dummyssh"
+ > [web]
+ > push_ssl = false
+ > allow_push = *
> EOF
The extension requires a repo (currently unused)
@@ -711,4 +714,72 @@
(run 'hg heads .' to see heads, 'hg merge' to merge)
$ cat main-error.log
+push over ssh
+ $ hg -R main push ssh://user@dummy/other -r 5fddd98957c8
+ pushing to ssh://user@dummy/other
+ searching for changes
+ remote: adding changesets
+ remote: adding manifests
+ remote: adding file changes
+ remote: added 1 changesets with 1 changes to 1 files
+
+push over http
+
+ $ hg -R other serve -p $HGPORT2 -d --pid-file=other.pid -E other-error.log
+ $ cat other.pid >> $DAEMON_PIDS
+
+ $ hg -R main push http://localhost:$HGPORT2/ -r 32af7686d403
+ pushing to http://localhost:$HGPORT2/
+ searching for changes
+ $ cat other-error.log
+
+Check final content.
+
+ $ hg -R other log -G
+ o changeset: 7:32af7686d403
+ | tag: tip
+ | user: Nicolas Dumazet <nicdumz.commits@gmail.com>
+ | date: Sat Apr 30 15:24:48 2011 +0200
+ | summary: D
+ |
+ o changeset: 6:5fddd98957c8
+ | user: Nicolas Dumazet <nicdumz.commits@gmail.com>
+ | date: Sat Apr 30 15:24:48 2011 +0200
+ | summary: C
+ |
+ o changeset: 5:42ccdea3bb16
+ | parent: 0:cd010b8cd998
+ | user: Nicolas Dumazet <nicdumz.commits@gmail.com>
+ | date: Sat Apr 30 15:24:48 2011 +0200
+ | summary: B
+ |
+ | o changeset: 4:02de42196ebe
+ | | parent: 2:24b6387c8c8c
+ | | user: Nicolas Dumazet <nicdumz.commits@gmail.com>
+ | | date: Sat Apr 30 15:24:48 2011 +0200
+ | | summary: H
+ | |
+ | | o changeset: 3:eea13746799a
+ | |/| parent: 2:24b6387c8c8c
+ | | | parent: 1:9520eea781bc
+ | | | user: Nicolas Dumazet <nicdumz.commits@gmail.com>
+ | | | date: Sat Apr 30 15:24:48 2011 +0200
+ | | | summary: G
+ | | |
+ | o | changeset: 2:24b6387c8c8c
+ |/ / parent: 0:cd010b8cd998
+ | | user: Nicolas Dumazet <nicdumz.commits@gmail.com>
+ | | date: Sat Apr 30 15:24:48 2011 +0200
+ | | summary: F
+ | |
+ | @ changeset: 1:9520eea781bc
+ |/ user: Nicolas Dumazet <nicdumz.commits@gmail.com>
+ | date: Sat Apr 30 15:24:48 2011 +0200
+ | summary: E
+ |
+ o changeset: 0:cd010b8cd998
+ user: Nicolas Dumazet <nicdumz.commits@gmail.com>
+ date: Sat Apr 30 15:24:48 2011 +0200
+ summary: A
+