# HG changeset patch # User Pulkit Goyal # Date 2019-04-08 15:22:53 # Node ID 8a37c9b6cf0a29869a1f8b659add1a65bd1c7135 # Parent d086ba387ae8265b073f16421791380bd6686568 narrow: send specs as bundle2 data instead of param (issue5952) (issue6019) Before this patch, when ACL is involved, narrowspecs are send as bundle2 parameter for narrow:spec bundle2 part. The limitation of bundle2 parts are they cannot send data larger than 255 bytes. Includes and excludes in narrow are not limited by size and they can grow over 255 bytes. This patch start sending them as bundle2 data. After this change, we try to read specs both from parameters and data, making it compatible with older servers. Differential Revision: https://phab.mercurial-scm.org/D6218 diff --git a/hgext/narrow/narrowbundle2.py b/hgext/narrow/narrowbundle2.py --- a/hgext/narrow/narrowbundle2.py +++ b/hgext/narrow/narrowbundle2.py @@ -144,6 +144,15 @@ def getbundlechangegrouppart_narrow(bund def _handlechangespec_2(op, inpart): includepats = set(inpart.params.get(_SPECPART_INCLUDE, '').splitlines()) excludepats = set(inpart.params.get(_SPECPART_EXCLUDE, '').splitlines()) + data = inpart.read() + # old servers don't send includes and excludes using bundle2 data, they use + # bundle2 parameters instead. + if data: + inc, exc = data.split('\0') + if inc: + includepats |= set(inc.splitlines()) + if exc: + excludepats |= set(exc.splitlines()) narrowspec.validatepatterns(includepats) narrowspec.validatepatterns(excludepats) diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -2214,12 +2214,14 @@ def _getbundlechangegrouppart(bundler, r if (kwargs.get(r'narrow', False) and kwargs.get(r'narrow_acl', False) and (include or exclude)): narrowspecpart = bundler.newpart('narrow:spec') + data = '' if include: - narrowspecpart.addparam( - 'include', '\n'.join(include), mandatory=True) + data += '\n'.join(include) + data += '\0' if exclude: - narrowspecpart.addparam( - 'exclude', '\n'.join(exclude), mandatory=True) + data += '\n'.join(exclude) + + narrowspecpart.data = data @getbundle2partsgenerator('bookmarks') def _getbundlebookmarkpart(bundler, repo, source, bundlecaps=None,