##// END OF EJS Templates
largefiles: sync up `largefilesdirstate` methods with `dirstate` base class...
largefiles: sync up `largefilesdirstate` methods with `dirstate` base class As it currently stands, pytype infers the `dirstate` class (and anything else decorated with `@interfaceutil.implementer`) as `Any`. When that is worked around, it suddenly noticed that most of these methods don't exist in the `dirstate` class anymore. Since they only called into the missing methods and there's no test failures, we can assume these are never called, and they can be dropped. In addition, PyCharm flagged `set_tracked()` and `_ignore()` as not overriding a superclass method with the same arguments. The missing default parameter for the former was the obvious issue. I'm guessing that the latter was named wrong because while there is `_ignore()` in the base class, it takes no arguments and returns a matcher. The `_ignorefiles()` superclass method also takes no args, and returns a list of bytes. The `_ignorefileandline()` superclass method DOES take a file, but returns a tuple. Therefore, the closest match is `_dirignore()`, which takes a file AND returns a bool. No idea why this needs to be overridden though.

File last commit:

r52202:9b44b25d stable
r52700:0b2c978f default
Show More
narrowwirepeer.py
182 lines | 5.7 KiB | text/x-python | PythonLexer
# narrowwirepeer.py - passes narrow spec with unbundle command
#
# 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 mercurial.i18n import _
from mercurial.utils import stringutil
from mercurial import (
bundle2,
error,
exchange,
extensions,
hg,
narrowspec,
wireprototypes,
wireprotov1peer,
wireprotov1server,
)
from . import narrowbundle2
def uisetup():
wireprotov1peer.wirepeer.narrow_widen = peernarrowwiden
def reposetup(repo):
def wirereposetup(ui, peer):
def wrapped(orig, cmd, *args, **kwargs):
if cmd == b'unbundle':
# TODO: don't blindly add include/exclude wireproto
# arguments to unbundle.
include, exclude = repo.narrowpats
kwargs["includepats"] = b','.join(include)
kwargs["excludepats"] = b','.join(exclude)
return orig(cmd, *args, **kwargs)
extensions.wrapfunction(peer, '_calltwowaystream', wrapped)
hg.wirepeersetupfuncs.append(wirereposetup)
@wireprotov1server.wireprotocommand(
b'narrow_widen',
b'oldincludes oldexcludes'
b' newincludes newexcludes'
b' commonheads cgversion'
b' known ellipses',
permission=b'pull',
)
def narrow_widen(
repo,
proto,
oldincludes,
oldexcludes,
newincludes,
newexcludes,
commonheads,
cgversion,
known,
ellipses,
):
"""wireprotocol command to send data when a narrow clone is widen. We will
be sending a changegroup here.
The current set of arguments which are required:
oldincludes: the old includes of the narrow copy
oldexcludes: the old excludes of the narrow copy
newincludes: the new includes of the narrow copy
newexcludes: the new excludes of the narrow copy
commonheads: list of heads which are common between the server and client
cgversion(maybe): the changegroup version to produce
known: list of nodes which are known on the client (used in ellipses cases)
ellipses: whether to send ellipses data or not
"""
preferuncompressed = False
try:
def splitpaths(data):
# work around ''.split(',') => ['']
return data.split(b',') if data else []
oldincludes = set(splitpaths(oldincludes))
newincludes = set(splitpaths(newincludes))
oldexcludes = set(splitpaths(oldexcludes))
newexcludes = set(splitpaths(newexcludes))
# enforce narrow acl if set
if repo.ui.has_section(exchange._NARROWACL_SECTION):
kwargs = exchange.applynarrowacl(
repo, {'includepats': newincludes, 'excludepats': newexcludes}
)
newincludes = kwargs['includepats']
requiredexcludes = kwargs['excludepats'] - newexcludes
if requiredexcludes:
# XXX: The below code to get the username was copied from exchange.py,
# where it is noted that this is technically a layering violation for
# assuming the existence of HTTP. Using it anyway to make the error
# message consistent with the error message for invalid includes.
ui = repo.ui
username = ui.shortuser(
ui.environ.get(b'REMOTE_USER') or ui.username()
)
raise error.Abort(
_(b"The following excludes cannot be removed for %s: %s")
% (username, stringutil.pprint(list(requiredexcludes)))
)
newexcludes = kwargs['excludepats']
# validate the patterns
narrowspec.validatepatterns(oldincludes)
narrowspec.validatepatterns(newincludes)
narrowspec.validatepatterns(oldexcludes)
narrowspec.validatepatterns(newexcludes)
common = wireprototypes.decodelist(commonheads)
known = wireprototypes.decodelist(known)
if ellipses == b'0':
ellipses = False
else:
ellipses = bool(ellipses)
cgversion = cgversion
bundler = bundle2.bundle20(repo.ui)
newmatch = narrowspec.match(
repo.root, include=newincludes, exclude=newexcludes
)
oldmatch = narrowspec.match(
repo.root, include=oldincludes, exclude=oldexcludes
)
if not ellipses:
bundle2.widen_bundle(
bundler,
repo,
oldmatch,
newmatch,
common,
known,
cgversion,
ellipses,
)
else:
narrowbundle2.generate_ellipses_bundle2_for_widening(
bundler,
repo,
oldmatch,
newmatch,
cgversion,
common,
known,
)
except error.Abort as exc:
bundler = bundle2.bundle20(repo.ui)
manargs = [(b'message', exc.message)]
advargs = []
if exc.hint is not None:
advargs.append((b'hint', exc.hint))
bundler.addpart(bundle2.bundlepart(b'error:abort', manargs, advargs))
preferuncompressed = True
chunks = bundler.getchunks()
return wireprototypes.streamres(
gen=chunks, prefer_uncompressed=preferuncompressed
)
def peernarrowwiden(remote, **kwargs):
for ch in ('commonheads', 'known'):
kwargs[ch] = wireprototypes.encodelist(kwargs[ch])
for ch in ('oldincludes', 'newincludes', 'oldexcludes', 'newexcludes'):
kwargs[ch] = b','.join(kwargs[ch])
kwargs['ellipses'] = b'%i' % bool(kwargs['ellipses'])
f = remote._callcompressable(b'narrow_widen', **kwargs)
return bundle2.getunbundler(remote.ui, f)