[PATCH 4 of 5] push: send highest changegroup format supported by both side
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Tue Nov 4 08:20:47 CST 2014
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1413573564 25200
# Fri Oct 17 12:19:24 2014 -0700
# Node ID 7407e3ea154921922956cbaf2e7ff0d89d48634c
# Parent 514f8b2f466377bca8eea987c67e33eb415586e9
push: send highest changegroup format supported by both side
When using bundle2, we find the common subset of supported changegroup-packers
and we pick the max of them. This allow to use generaldelta aware changegroups through
bundle2.
diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -443,13 +443,27 @@ def _pushb2ctx(pushop, bundler):
pushop.repo.prepushoutgoinghooks(pushop.repo,
pushop.remote,
pushop.outgoing)
if not pushop.force:
bundler.newpart('B2X:CHECK:HEADS', data=iter(pushop.remoteheads))
- cg = changegroup.getlocalchangegroupraw(pushop.repo, 'push',
- pushop.outgoing)
+ b2caps = bundle2.bundle2caps(pushop.remote)
+ version = None
+ cgversions = b2caps.get('b2x:changegroup')
+ if cgversions is None:
+ cg = changegroup.getlocalchangegroupraw(pushop.repo, 'push',
+ pushop.outgoing)
+ else:
+ cgversions = [v for v in cgversions if v in changegroup.packermap]
+ if not cgversions:
+ raise ValueError(_('no common changegroup version'))
+ version = max(cgversions)
+ cg = changegroup.getlocalchangegroupraw(pushop.repo, 'push',
+ pushop.outgoing,
+ version=version)
cgpart = bundler.newpart('B2X:CHANGEGROUP', data=cg)
+ if version is not None:
+ cgpart.addparam('version', version)
def handlereply(op):
"""extract addchangegroup returns from server reply"""
cgreplies = op.records.getreplies(cgpart.id)
assert len(cgreplies['changegroup']) == 1
pushop.cgresult = cgreplies['changegroup'][0]['return']
More information about the Mercurial-devel
mailing list