hgext/narrow/narrowwirepeer.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 02 Aug 2018 23:50:47 -0700
changeset 38818 e411774a2e0f
parent 36351 87e950a070e6
child 39523 c90514043eaa
permissions -rw-r--r--
narrow: move status-filtering to core and to ctx One of my recent changes from repo.status(ctx1, ctx2) to ctx1.status(ctx2) broke some of our Google-internal tests. The problem turned out to be that the narrow extension was overriding repo.status() to make it filter out paths outside the narrowspec. When I changed to ctx1.status(ctx2), then that filtering obviously got lost. ctx.status() seems like a better method to do the filtering in, so this patch moves the filtering into that method, thereby also moving it out of the extension and into core. Differential Revision: https://phab.mercurial-scm.org/D4068

# 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 __future__ import absolute_import

from mercurial.i18n import _
from mercurial import (
    error,
    extensions,
    hg,
    narrowspec,
    node,
)

def uisetup():
    def peersetup(ui, peer):
        # We must set up the expansion before reposetup below, since it's used
        # at clone time before we have a repo.
        class expandingpeer(peer.__class__):
            def expandnarrow(self, narrow_include, narrow_exclude, nodes):
                ui.status(_("expanding narrowspec\n"))
                if not self.capable('exp-expandnarrow'):
                    raise error.Abort(
                        'peer does not support expanding narrowspecs')

                hex_nodes = (node.hex(n) for n in nodes)
                new_narrowspec = self._call(
                    'expandnarrow',
                    includepats=','.join(narrow_include),
                    excludepats=','.join(narrow_exclude),
                    nodes=','.join(hex_nodes))

                return narrowspec.parseserverpatterns(new_narrowspec)
        peer.__class__ = expandingpeer
    hg.wirepeersetupfuncs.append(peersetup)

def reposetup(repo):
    def wirereposetup(ui, peer):
        def wrapped(orig, cmd, *args, **kwargs):
            if cmd == 'unbundle':
                # TODO: don't blindly add include/exclude wireproto
                # arguments to unbundle.
                include, exclude = repo.narrowpats
                kwargs[r"includepats"] = ','.join(include)
                kwargs[r"excludepats"] = ','.join(exclude)
            return orig(cmd, *args, **kwargs)
        extensions.wrapfunction(peer, '_calltwowaystream', wrapped)
    hg.wirepeersetupfuncs.append(wirereposetup)