##// END OF EJS Templates
narrow: move the code to generate a widening bundle2 to core...
narrow: move the code to generate a widening bundle2 to core This is a part of moving more narrow related bits to core. Differential Revision: https://phab.mercurial-scm.org/D4888

File last commit:

r40108:1ea80ac1 default
r40108:1ea80ac1 default
Show More
narrowwirepeer.py
116 lines | 4.6 KiB | text/x-python | PythonLexer
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 # narrowwirepeer.py - passes narrow spec with unbundle command
#
# Copyright 2017 Google, Inc.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import
from mercurial import (
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 bundle2,
error,
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 extensions,
hg,
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 match as matchmod,
narrowspec,
pycompat,
Pulkit Goyal
narrow: move the wireprotocol narrow capability name to core...
r39969 wireprotoserver,
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 wireprototypes,
wireprotov1peer,
Pulkit Goyal
narrow: add narrow and ellipses as server capabilities...
r39559 wireprotov1server,
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 )
def uisetup():
Pulkit Goyal
narrow: add narrow and ellipses as server capabilities...
r39559 extensions.wrapfunction(wireprotov1server, '_capabilities', addnarrowcap)
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 wireprotov1peer.wirepeer.narrow_widen = peernarrowwiden
Pulkit Goyal
narrow: add narrow and ellipses as server capabilities...
r39559
def addnarrowcap(orig, repo, proto):
"""add the narrow capability to the server"""
caps = orig(repo, proto)
Pulkit Goyal
narrow: move the wireprotocol narrow capability name to core...
r39969 caps.append(wireprotoserver.NARROWCAP)
Pulkit Goyal
narrow: add narrow and ellipses as server capabilities...
r39559 if repo.ui.configbool('experimental', 'narrowservebrokenellipses'):
Pulkit Goyal
narrow: move the ellipses server capability to core...
r39970 caps.append(wireprotoserver.ELLIPSESCAP)
Pulkit Goyal
narrow: add narrow and ellipses as server capabilities...
r39559 return caps
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 def reposetup(repo):
def wirereposetup(ui, peer):
def wrapped(orig, cmd, *args, **kwargs):
if cmd == 'unbundle':
Augie Fackler
narrowwirepeer: add TODO about how we add wireproto args to unbundle :(...
r36119 # TODO: don't blindly add include/exclude wireproto
# arguments to unbundle.
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 include, exclude = repo.narrowpats
Augie Fackler
narrowwirepeer: add some strkwargs to fix a crash on py3...
r36369 kwargs[r"includepats"] = ','.join(include)
kwargs[r"excludepats"] = ','.join(exclude)
Augie Fackler
narrow: import experimental extension from narrowhg revision cb51d673e9c5...
r36096 return orig(cmd, *args, **kwargs)
extensions.wrapfunction(peer, '_calltwowaystream', wrapped)
hg.wirepeersetupfuncs.append(wirereposetup)
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106
@wireprotov1server.wireprotocommand('narrow_widen', 'oldincludes oldexcludes'
' newincludes newexcludes'
' commonheads cgversion'
' known ellipses',
permission='pull')
def narrow_widen(repo, proto, oldincludes, oldexcludes, newincludes,
newexcludes, commonheads, cgversion, known, ellipses):
"""wireprotocol command to send data when a narrow clone is widen. We will
be sending a changegroup here.
The current set of arguments which are required:
oldincludes: the old includes of the narrow copy
oldexcludes: the old excludes of the narrow copy
newincludes: the new includes of the narrow copy
newexcludes: the new excludes of the narrow copy
commonheads: list of heads which are common between the server and client
cgversion(maybe): the changegroup version to produce
known: list of nodes which are known on the client (used in ellipses cases)
ellipses: whether to send ellipses data or not
"""
try:
oldincludes = wireprototypes.decodelist(oldincludes)
newincludes = wireprototypes.decodelist(newincludes)
oldexcludes = wireprototypes.decodelist(oldexcludes)
newexcludes = wireprototypes.decodelist(newexcludes)
# validate the patterns
narrowspec.validatepatterns(set(oldincludes))
narrowspec.validatepatterns(set(newincludes))
narrowspec.validatepatterns(set(oldexcludes))
narrowspec.validatepatterns(set(newexcludes))
common = wireprototypes.decodelist(commonheads)
known = None
if known:
known = wireprototypes.decodelist(known)
if ellipses == '0':
ellipses = False
else:
ellipses = bool(ellipses)
cgversion = cgversion
newmatch = narrowspec.match(repo.root, include=newincludes,
exclude=newexcludes)
oldmatch = narrowspec.match(repo.root, include=oldincludes,
exclude=oldexcludes)
diffmatch = matchmod.differencematcher(newmatch, oldmatch)
Pulkit Goyal
narrow: move the code to generate a widening bundle2 to core...
r40108 bundler = bundle2.widen_bundle(repo, diffmatch, common, known,
Pulkit Goyal
narrow: start returning bundle2 from widen_bundle()...
r40107 cgversion, ellipses)
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 except error.Abort as exc:
Pulkit Goyal
narrow: start returning bundle2 from widen_bundle()...
r40107 bundler = bundle2.bundle20(repo.ui)
Pulkit Goyal
narrow: the first version of narrow_widen wireprotocol command...
r40106 manargs = [('message', pycompat.bytestr(exc))]
advargs = []
if exc.hint is not None:
advargs.append(('hint', exc.hint))
bundler.addpart(bundle2.bundlepart('error:abort', manargs, advargs))
chunks = bundler.getchunks()
return wireprototypes.streamres(gen=chunks)
def peernarrowwiden(remote, **kwargs):
for ch in ('oldincludes', 'newincludes', 'oldexcludes', 'newexcludes',
'commonheads', 'known'):
kwargs[ch] = wireprototypes.encodelist(kwargs[ch])
kwargs['ellipses'] = '%i' % bool(kwargs['ellipses'])
f = remote._callcompressable('narrow_widen', **kwargs)
return bundle2.getunbundler(remote.ui, f)