##// END OF EJS Templates
narrow: send specs as bundle2 data instead of param (issue5952) (issue6019)...
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

File last commit:

r40123:1d09ba0d default
r42307:8a37c9b6 default
Show More
narrowdirstate.py
63 lines | 2.1 KiB | text/x-python | PythonLexer
# narrowdirstate.py - extensions to mercurial dirstate to support narrow clones
#
# 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.i18n import _
from mercurial import (
error,
)
def wrapdirstate(repo, dirstate):
"""Add narrow spec dirstate ignore, block changes outside narrow spec."""
def _editfunc(fn):
def _wrapper(self, *args):
narrowmatch = repo.narrowmatch()
for f in args:
if f is not None and not narrowmatch(f) and f not in self:
raise error.Abort(_("cannot track '%s' - it is outside " +
"the narrow clone") % f)
return fn(self, *args)
return _wrapper
class narrowdirstate(dirstate.__class__):
# Prevent adding/editing/copying/deleting files that are outside the
# sparse checkout
@_editfunc
def normal(self, *args):
return super(narrowdirstate, self).normal(*args)
@_editfunc
def add(self, *args):
return super(narrowdirstate, self).add(*args)
@_editfunc
def normallookup(self, *args):
return super(narrowdirstate, self).normallookup(*args)
@_editfunc
def copy(self, *args):
return super(narrowdirstate, self).copy(*args)
@_editfunc
def remove(self, *args):
return super(narrowdirstate, self).remove(*args)
@_editfunc
def merge(self, *args):
return super(narrowdirstate, self).merge(*args)
def rebuild(self, parent, allfiles, changedfiles=None):
if changedfiles is None:
# Rebuilding entire dirstate, let's filter allfiles to match the
# narrowspec.
allfiles = [f for f in allfiles if repo.narrowmatch()(f)]
super(narrowdirstate, self).rebuild(parent, allfiles, changedfiles)
dirstate.__class__ = narrowdirstate
return dirstate