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()).
--- 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
--- 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]