narrowwirepeer.py
107 lines
| 4.3 KiB
| text/x-python
|
PythonLexer
Augie Fackler
|
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
|
r40106 | bundle2, | ||
error, | ||||
Augie Fackler
|
r36096 | extensions, | ||
hg, | ||||
Pulkit Goyal
|
r40106 | narrowspec, | ||
pycompat, | ||||
wireprototypes, | ||||
wireprotov1peer, | ||||
Pulkit Goyal
|
r39559 | wireprotov1server, | ||
Augie Fackler
|
r36096 | ) | ||
def uisetup(): | ||||
Pulkit Goyal
|
r40106 | wireprotov1peer.wirepeer.narrow_widen = peernarrowwiden | ||
Pulkit Goyal
|
r39559 | |||
Augie Fackler
|
r36096 | def reposetup(repo): | ||
def wirereposetup(ui, peer): | ||||
def wrapped(orig, cmd, *args, **kwargs): | ||||
if cmd == 'unbundle': | ||||
Augie Fackler
|
r36119 | # TODO: don't blindly add include/exclude wireproto | ||
# arguments to unbundle. | ||||
Augie Fackler
|
r36096 | include, exclude = repo.narrowpats | ||
Augie Fackler
|
r36369 | kwargs[r"includepats"] = ','.join(include) | ||
kwargs[r"excludepats"] = ','.join(exclude) | ||||
Augie Fackler
|
r36096 | return orig(cmd, *args, **kwargs) | ||
extensions.wrapfunction(peer, '_calltwowaystream', wrapped) | ||||
hg.wirepeersetupfuncs.append(wirereposetup) | ||||
Pulkit Goyal
|
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 | ||||
""" | ||||
Pulkit Goyal
|
r40183 | preferuncompressed = False | ||
Pulkit Goyal
|
r40106 | 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) | ||||
Martin von Zweigbergk
|
r40380 | bundler = bundle2.widen_bundle(repo, oldmatch, newmatch, common, known, | ||
Pulkit Goyal
|
r40107 | cgversion, ellipses) | ||
Pulkit Goyal
|
r40106 | except error.Abort as exc: | ||
Pulkit Goyal
|
r40107 | bundler = bundle2.bundle20(repo.ui) | ||
Pulkit Goyal
|
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)) | ||||
Pulkit Goyal
|
r40183 | preferuncompressed = True | ||
Pulkit Goyal
|
r40106 | |||
chunks = bundler.getchunks() | ||||
Pulkit Goyal
|
r40183 | return wireprototypes.streamres(gen=chunks, | ||
prefer_uncompressed=preferuncompressed) | ||||
Pulkit Goyal
|
r40106 | |||
def peernarrowwiden(remote, **kwargs): | ||||
Pulkit Goyal
|
r40248 | for ch in (r'oldincludes', r'newincludes', r'oldexcludes', r'newexcludes', | ||
r'commonheads', r'known'): | ||||
Pulkit Goyal
|
r40106 | kwargs[ch] = wireprototypes.encodelist(kwargs[ch]) | ||
Pulkit Goyal
|
r40248 | kwargs[r'ellipses'] = '%i' % bool(kwargs[r'ellipses']) | ||
Pulkit Goyal
|
r40106 | f = remote._callcompressable('narrow_widen', **kwargs) | ||
return bundle2.getunbundler(remote.ui, f) | ||||