view tests/pullext.py @ 45239:13814622b3b1

commitctx: extract all the file preparation logic in a new function Before we actually start to create a new commit we have a large block of logic that do the necessary file and manifest commit and that determine which files are been affected by the commit (and how). This is a complex process on its own. It return a "simple" output that can be fed to the next step. The output itself is not that simple as we return a lot of individual items (files, added, removed, ...). My next step (and actual goal for this cleanup) will be to simplify the return by returning a richer object that will be more suited for the variation of data we want to store. After this changeset the `commitctx` is a collection of smaller function with limited scope. The largest one is still `_filecommit` without about 100 lines of code.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 23 Jul 2020 23:52:31 +0200
parents 9f70512ae2cf
children 77b8588dd84e
line wrap: on
line source

# pullext.py - Simple extension to test pulling
#
# Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
#
# 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 (
    commands,
    error,
    extensions,
    localrepo,
)
from mercurial.interfaces import repository


def clonecommand(orig, ui, repo, *args, **kwargs):
    if kwargs.get('include') or kwargs.get('exclude'):
        kwargs['narrow'] = True

    if kwargs.get('depth'):
        try:
            kwargs['depth'] = int(kwargs['depth'])
        except ValueError:
            raise error.Abort(_('--depth must be an integer'))

    return orig(ui, repo, *args, **kwargs)


def featuresetup(ui, features):
    features.add(repository.NARROW_REQUIREMENT)


def extsetup(ui):
    entry = extensions.wrapcommand(commands.table, b'clone', clonecommand)

    hasinclude = any(x[1] == b'include' for x in entry[1])
    hasdepth = any(x[1] == b'depth' for x in entry[1])

    if not hasinclude:
        entry[1].append(
            (b'', b'include', [], _(b'pattern of file/directory to clone'))
        )
        entry[1].append(
            (b'', b'exclude', [], _(b'pattern of file/directory to not clone'))
        )

    if not hasdepth:
        entry[1].append(
            (b'', b'depth', b'', _(b'ancestry depth of changesets to fetch'))
        )

    localrepo.featuresetupfuncs.add(featuresetup)