# HG changeset patch # User Denis Laxalde # Date 2017-04-10 13:11:36 # Node ID 826e600605f60f2027cea3aa239b4bc0ea2abc84 # Parent 806f9a883b4ffaa19e17975e17672f30c84a915b 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) + except KeyError: + # nullrev or other branch + continue + inrange, linerange1 = _changesrange(c, p, linerange2, diffopts) + if inrange: + yield c, linerange1 + seen[i] = c, linerange1 + class committablectx(basectx): """A committablectx object provides common functionality for a context that wants the ability to commit, e.g. workingctx or memctx."""