view hgext/narrow/narrowpatch.py @ 36101:22ed16caa596

narrowwirepeer: rename expandnarrow capability to exp-expandnarrow The expandnarrow functionality lets a client have a shorthand (for Google it's a reference to a checked-in file) for a set of includes and excludes. For testing we should probably implement a simple version of that functionality here. For now, rename the capability so we don't burn the good name in the future if we need to change behavior. It's plausible that this functionality should be dropped from the narrowhg we ship long-term, but I'm dubious as it seems pretty likely other organizations will want similar shorthands for commonly-used subsets of their trees. Differential Revision: https://phab.mercurial-scm.org/D2193
author Augie Fackler <augie@google.com>
date Mon, 12 Feb 2018 14:49:38 -0500
parents a2a6e724d61a
children f85e32a5e5c8
line wrap: on
line source

# narrowpatch.py - extensions to mercurial patch module 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 import (
    extensions,
    patch,
    util,
)

def setup(repo):
    def _filepairs(orig, *args):
        """Only includes files within the narrow spec in the diff."""
        if util.safehasattr(repo, 'narrowmatch'):
            narrowmatch = repo.narrowmatch()
            for x in orig(*args):
                f1, f2, copyop = x
                if ((not f1 or narrowmatch(f1)) and
                    (not f2 or narrowmatch(f2))):
                    yield x
        else:
            for x in orig(*args):
                yield x

    def trydiff(orig, repo, revs, ctx1, ctx2, modified, added, removed,
                copy, getfilectx, *args, **kwargs):
        if util.safehasattr(repo, 'narrowmatch'):
            narrowmatch = repo.narrowmatch()
            modified = filter(narrowmatch, modified)
            added = filter(narrowmatch, added)
            removed = filter(narrowmatch, removed)
            copy = {k: v for k, v in copy.iteritems() if narrowmatch(k)}
        return orig(repo, revs, ctx1, ctx2, modified, added, removed, copy,
                    getfilectx, *args, **kwargs)

    extensions.wrapfunction(patch, '_filepairs', _filepairs)
    extensions.wrapfunction(patch, 'trydiff', trydiff)