hgext/narrow/narrowwirepeer.py
author Martin von Zweigbergk <martinvonz@google.com>
Thu, 02 Aug 2018 14:57:20 -0700
changeset 38872 576eef1ab43d
parent 36351 87e950a070e6
child 39523 c90514043eaa
permissions -rw-r--r--
narrow: move .hg/narrowspec to .hg/store/narrowspec (BC) The narrowspec is more closely related to the store than to the working copy. For example, if the narrowspec changes, the set of revlogs also needs to change (the working copy may change, but that depends on which commit is checked out). Also, when using the share extension, the narrowspec needs to be shared along with the store. This patch therefore moves the narrowspec into the store/ directory. This is clearly a breaking change, but I haven't bothered trying to fall back to reading the narrowspec from the old location (.hg/), because there are very few users of narrow out there. (We'll add a temporary hack to our Google-internal extension to handle the migration.) Differential Revision: https://phab.mercurial-scm.org/D4099

# 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)