diff --git a/hgext/narrow/narrowbundle2.py b/hgext/narrow/narrowbundle2.py --- a/hgext/narrow/narrowbundle2.py +++ b/hgext/narrow/narrowbundle2.py @@ -31,8 +31,9 @@ stringutil, ) -_NARROWACL_SECTION = 'narrowhgacl' +_NARROWACL_SECTION = 'narrowacl' _CHANGESPECPART = 'narrow:changespec' +_RESSPECS = 'narrow:responsespec' _SPECPART = 'narrow:spec' _SPECPART_INCLUDE = 'include' _SPECPART_EXCLUDE = 'exclude' @@ -142,6 +143,10 @@ @bundle2.parthandler(_SPECPART, (_SPECPART_INCLUDE, _SPECPART_EXCLUDE)) def _handlechangespec_2(op, inpart): + # XXX: This bundle2 handling is buggy and should be removed after hg5.2 is + # released. New servers will send a mandatory bundle2 part named + # 'Narrowspec' and will send specs as data instead of params. + # Refer to issue5952 and 6019 includepats = set(inpart.params.get(_SPECPART_INCLUDE, '').splitlines()) excludepats = set(inpart.params.get(_SPECPART_EXCLUDE, '').splitlines()) narrowspec.validatepatterns(includepats) @@ -153,6 +158,21 @@ op.repo.setnarrowpats(includepats, excludepats) narrowspec.copytoworkingcopy(op.repo) +@bundle2.parthandler(_RESSPECS) +def _handlenarrowspecs(op, inpart): + data = inpart.read() + inc, exc = data.split('\0') + includepats = set(inc.splitlines()) + excludepats = set(exc.splitlines()) + narrowspec.validatepatterns(includepats) + narrowspec.validatepatterns(excludepats) + + if repository.NARROW_REQUIREMENT not in op.repo.requirements: + op.repo.requirements.add(repository.NARROW_REQUIREMENT) + op.repo._writerequirements() + op.repo.setnarrowpats(includepats, excludepats) + narrowspec.copytoworkingcopy(op.repo) + @bundle2.parthandler(_CHANGESPECPART) def _handlechangespec(op, inpart): repo = op.repo diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -49,7 +49,7 @@ urlerr = util.urlerr urlreq = util.urlreq -_NARROWACL_SECTION = 'narrowhgacl' +_NARROWACL_SECTION = 'narrowacl' # Maps bundle version human names to changegroup versions. _bundlespeccgversions = {'v1': '01', @@ -2213,13 +2213,10 @@ if (kwargs.get(r'narrow', False) and kwargs.get(r'narrow_acl', False) and (include or exclude)): - narrowspecpart = bundler.newpart('narrow:spec') - if include: - narrowspecpart.addparam( - 'include', '\n'.join(include), mandatory=True) - if exclude: - narrowspecpart.addparam( - 'exclude', '\n'.join(exclude), mandatory=True) + # this is mandatory because otherwise ACL clients won't work + narrowspecpart = bundler.newpart('Narrow:responsespec') + narrowspecpart.data = '%s\0%s' % ('\n'.join(include), + '\n'.join(exclude)) @getbundle2partsgenerator('bookmarks') def _getbundlebookmarkpart(bundler, repo, source, bundlecaps=None, diff --git a/tests/test-narrow-acl.t b/tests/test-narrow-acl.t --- a/tests/test-narrow-acl.t +++ b/tests/test-narrow-acl.t @@ -10,7 +10,7 @@ > hg commit -m "Add $x" > done $ cat >> .hg/hgrc << EOF - > [narrowhgacl] + > [narrowacl] > default.includes=f1 f2 > EOF $ hg serve -a localhost -p $HGPORT1 -d --pid-file=hg.pid