# HG changeset patch # User Denis Laxalde # Date 1492152918 -7200 # Node ID 4c2c30bc38b4f84ce8f215146bbf158e299065b3 # Parent e518192d6bacd6c2ea6749514d3654f07c7f7c81 context: follow all branches in blockdescendants() In the initial implementation of blockdescendants (and thus followlines(..., descend=True) revset), only the first branch encountered in descending direction was followed. Update the algorithm so that all children of a revision ('x' in code) are considered. Accordingly, we need to prevent a child revision to be yielded multiple times when it gets visited through different path, so we skip 'i' when this occurs. Finally, since we now consider all parents of a possible child touching a given line range, we take care of yielding the child if it has a diff in specified line range with at least one of its parent (same logic as blockancestors()). diff -r e518192d6bac -r 4c2c30bc38b4 mercurial/context.py --- a/mercurial/context.py Thu Apr 13 08:27:19 2017 -0700 +++ b/mercurial/context.py Fri Apr 14 08:55:18 2017 +0200 @@ -1217,16 +1217,18 @@ seen = {fctx.filerev(): (fctx, (fromline, toline))} for i in fl.descendants([fctx.filerev()]): c = fctx.filectx(i) + inrange = False for x in fl.parentrevs(i): try: - p, linerange2 = seen.pop(x) + p, linerange2 = seen[x] except KeyError: # nullrev or other branch continue - inrange, linerange1 = _changesrange(c, p, linerange2, diffopts) - if inrange: - yield c, linerange1 + inrangep, linerange1 = _changesrange(c, p, linerange2, diffopts) + inrange = inrange or inrangep seen[i] = c, linerange1 + if inrange: + yield c, linerange1 class committablectx(basectx): """A committablectx object provides common functionality for a context that diff -r e518192d6bac -r 4c2c30bc38b4 tests/test-annotate.t --- a/tests/test-annotate.t Thu Apr 13 08:27:19 2017 -0700 +++ b/tests/test-annotate.t Fri Apr 14 08:55:18 2017 +0200 @@ -600,7 +600,28 @@ $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 5:7, startrev=25, descend=True)' 26: baz:3+->3- +we follow all branches in descending direction + $ hg up 22 --quiet + $ sed 's/3/+3/' baz > baz.new + $ mv baz.new baz + $ hg ci -m 'baz:3->+3' + created new head + $ hg log -T '{rev}: {desc}\n' -r 'followlines(baz, 3:5, startrev=16, descend=True)' --graph + @ 29: baz:3->+3 + : + : o 26: baz:3+->3- + : : + : o 23: baz:3->3+ + :/ + o 20: baz:4 + |\ + | ~ + o 19: baz:3 + | + ~ + check error cases + $ hg up 23 --quiet $ hg log -r 'followlines()' hg: parse error: followlines takes at least 1 positional arguments [255]