diff -r 539cbe0f8fa3 -r df3cf9422e1b mercurial/changegroup.py --- a/mercurial/changegroup.py Wed May 10 16:17:58 2017 -0700 +++ b/mercurial/changegroup.py Mon May 15 09:35:27 2017 -0700 @@ -494,9 +494,18 @@ class cg1packer(object): deltaheader = _CHANGEGROUPV1_DELTA_HEADER version = '01' - def __init__(self, repo): + def __init__(self, repo, bundlecaps=None): """Given a source repo, construct a bundler. + + bundlecaps is optional and can be used to specify the set of + capabilities which can be used to build the bundle. While bundlecaps is + unused in core Mercurial, extensions rely on this feature to communicate + capabilities to customize the changegroup packer. """ + # Set of capabilities we can use to build the bundle. + if bundlecaps is None: + bundlecaps = set() + self._bundlecaps = bundlecaps # experimental config: bundle.reorder reorder = repo.ui.config('bundle', 'reorder', 'auto') if reorder == 'auto': @@ -800,8 +809,8 @@ version = '02' deltaheader = _CHANGEGROUPV2_DELTA_HEADER - def __init__(self, repo): - super(cg2packer, self).__init__(repo) + def __init__(self, repo, bundlecaps=None): + super(cg2packer, self).__init__(repo, bundlecaps) if self._reorder is None: # Since generaldelta is directly supported by cg2, reordering # generally doesn't help, so we disable it by default (treating @@ -895,9 +904,9 @@ assert versions return min(versions) -def getbundler(version, repo): +def getbundler(version, repo, bundlecaps=None): assert version in supportedoutgoingversions(repo) - return _packermap[version][0](repo) + return _packermap[version][0](repo, bundlecaps) def getunbundler(version, fh, alg, extras=None): return _packermap[version][1](fh, alg, extras=extras) @@ -948,24 +957,26 @@ bundler = getbundler(version, repo) return getsubset(repo, outgoing, bundler, source) -def getlocalchangegroupraw(repo, source, outgoing, version='01'): +def getlocalchangegroupraw(repo, source, outgoing, bundlecaps=None, + version='01'): """Like getbundle, but taking a discovery.outgoing as an argument. This is only implemented for local repos and reuses potentially precomputed sets in outgoing. Returns a raw changegroup generator.""" if not outgoing.missing: return None - bundler = getbundler(version, repo) + bundler = getbundler(version, repo, bundlecaps) return getsubsetraw(repo, outgoing, bundler, source) -def getchangegroup(repo, source, outgoing, version='01'): +def getchangegroup(repo, source, outgoing, bundlecaps=None, + version='01'): """Like getbundle, but taking a discovery.outgoing as an argument. This is only implemented for local repos and reuses potentially precomputed sets in outgoing.""" if not outgoing.missing: return None - bundler = getbundler(version, repo) + bundler = getbundler(version, repo, bundlecaps) return getsubset(repo, outgoing, bundler, source) def getlocalchangegroup(repo, *args, **kwargs):