hgext3rd/pullbundle.py
changeset 4128 4e5ec9ae682e
child 4129 bc4e62a1cb82
equal deleted inserted replaced
4127:dfa69b5ece87 4128:4e5ec9ae682e
       
     1 # Extension to provide automatic caching of bundle server for pull
       
     2 #
       
     3 # Copyright 2018 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
       
     4 #
       
     5 # This software may be used and distributed according to the terms of the
       
     6 # GNU General Public License version 2 or any later version.
       
     7 
       
     8 from mercurial import (
       
     9     changegroup,
       
    10     exchange,
       
    11     narrowspec,
       
    12 )
       
    13 
       
    14 from mercurial.i18n import _
       
    15 
       
    16 def uisetup(ui):
       
    17     exchange.getbundle2partsmapping['changegroup'] = _getbundlechangegrouppart
       
    18 
       
    19 def _getbundlechangegrouppart(bundler, repo, source, bundlecaps=None,
       
    20                               b2caps=None, heads=None, common=None, **kwargs):
       
    21     """add a changegroup part to the requested bundle"""
       
    22     if not kwargs.get(r'cg', True):
       
    23         return
       
    24 
       
    25     version = '01'
       
    26     cgversions = b2caps.get('changegroup')
       
    27     if cgversions:  # 3.1 and 3.2 ship with an empty value
       
    28         cgversions = [v for v in cgversions
       
    29                       if v in changegroup.supportedoutgoingversions(repo)]
       
    30         if not cgversions:
       
    31             raise ValueError(_('no common changegroup version'))
       
    32         version = max(cgversions)
       
    33 
       
    34     outgoing = exchange._computeoutgoing(repo, heads, common)
       
    35     if not outgoing.missing:
       
    36         return
       
    37 
       
    38     if kwargs.get(r'narrow', False):
       
    39         include = sorted(filter(bool, kwargs.get(r'includepats', [])))
       
    40         exclude = sorted(filter(bool, kwargs.get(r'excludepats', [])))
       
    41         filematcher = narrowspec.match(repo.root, include=include,
       
    42                                        exclude=exclude)
       
    43     else:
       
    44         filematcher = None
       
    45 
       
    46     # START OF ALTERED PART
       
    47     makeallcgpart(bundler.newpart, repo, outgoing, version, source, bundlecaps,
       
    48                   filematcher, cgversions)
       
    49     # END OF ALTERED PART
       
    50 
       
    51     if kwargs.get(r'narrow', False) and (include or exclude):
       
    52         narrowspecpart = bundler.newpart('narrow:spec')
       
    53         if include:
       
    54             narrowspecpart.addparam(
       
    55                 'include', '\n'.join(include), mandatory=True)
       
    56         if exclude:
       
    57             narrowspecpart.addparam(
       
    58                 'exclude', '\n'.join(exclude), mandatory=True)
       
    59 
       
    60 def makeallcgpart(newpart, repo, outgoing, version, source,
       
    61                   bundlecaps, filematcher, cgversions):
       
    62     makeonecgpart(newpart, repo, outgoing, version, source, bundlecaps,
       
    63                   filematcher, cgversions)
       
    64 
       
    65 def _changegroupinfo(repo, nodes, source):
       
    66     if repo.ui.verbose or source == 'bundle':
       
    67         repo.ui.status(_("%d changesets found\n") % len(nodes))
       
    68 
       
    69 def makeonecgpart(newpart, repo, outgoing, version, source,
       
    70                   bundlecaps, filematcher, cgversions):
       
    71     # same as upstream code
       
    72 
       
    73     old = changegroup._changegroupinfo
       
    74     try:
       
    75         changegroup._changegroupinfo = _changegroupinfo
       
    76         cgstream = changegroup.makestream(repo, outgoing, version, source,
       
    77                                           bundlecaps=bundlecaps,
       
    78                                           filematcher=filematcher)
       
    79     finally:
       
    80         changegroup._changegroupinfo = old
       
    81 
       
    82     part = newpart('changegroup', data=cgstream)
       
    83     if cgversions:
       
    84         part.addparam('version', version)
       
    85 
       
    86     part.addparam('nbchanges', '%d' % len(outgoing.missing),
       
    87                   mandatory=False)
       
    88 
       
    89     if 'treemanifest' in repo.requirements:
       
    90         part.addparam('treemanifest', '1')