[PATCH 1 of 4] context: add a blockdescendants function

Yuya Nishihara yuya at tcha.org
Thu Apr 13 11:52:45 EDT 2017


On Tue, 11 Apr 2017 15:09:08 +0200, Denis Laxalde wrote:
> # HG changeset patch
> # User Denis Laxalde <denis.laxalde at logilab.fr>
> # Date 1491829896 -7200
> #      Mon Apr 10 15:11:36 2017 +0200
> # Node ID ce5fd23baea30c83d668a8680d2b6ed0ef7baa14
> # Parent  9259cf823690e4fcd34a4d2ecd57ced2060d2b3d
> # Available At http://hg.logilab.org/users/dlaxalde/hg
> #              hg pull http://hg.logilab.org/users/dlaxalde/hg -r ce5fd23baea3
> context: add a blockdescendants function
> 
> This is symmetrical with blockancestors() and yields descendants of a filectx
> with changes in the given line range. The noticeable difference is that the
> algorithm does not follow renames (probably because filelog.descendants() does
> not), so we are missing branches with renames.
> 
> diff --git a/mercurial/context.py b/mercurial/context.py
> --- a/mercurial/context.py
> +++ b/mercurial/context.py
> @@ -1208,6 +1208,26 @@ def blockancestors(fctx, fromline, tolin
>          if inrange:
>              yield c, linerange2
>  
> +def blockdescendants(fctx, fromline, toline):
> +    """Yield descendants of `fctx` with respect to the block of lines within
> +    `fromline`-`toline` range.
> +    """
> +    diffopts = patch.diffopts(fctx._repo.ui)
> +    fl = fctx.filelog()
> +    seen = {fctx.filerev(): (fctx, (fromline, toline))}
> +    for i in fl.descendants([fctx.filerev()]):
> +        c = fctx.filectx(i)
> +        for x in fl.parentrevs(i):
> +            try:
> +                p, linerange2 = seen.pop(x)

Maybe this only follows the first branch? The revision 'x' can have many
children.

> +            except KeyError:
> +                # nullrev or other branch
> +                continue
> +            inrange, linerange1 = _changesrange(c, p, linerange2, diffopts)
> +            if inrange:
> +                yield c, linerange1
> +            seen[i] = c, linerange1


More information about the Mercurial-devel mailing list