# HG changeset patch # User Jun Wu # Date 1574711630 28800 # Node ID 2e30d7df480950cced6d7992bfe112383ab5b2f0 # Parent 888bd39ed555884ef9ac5de6b9b7c3bc1a0ca29e revlog: fix revset in reachableroots docstring `reachableroots` will only return a subset of `roots` when `includepath` is False. For example, given the following linear DAG: 2 | 1 | 0 Using roots=0+2, heads=1, the definition in the docstring does not match what `reachableroots` actually does: ipdb> repo.changelog.reachableroots(0, roots=[0,2],heads=[1]) [0] ipdb> repo.revs('heads(::(0+2) & (0+2)::1)') The fix is to do `heads & ::roots` (or `heads & heads::roots`) first, then select their ancestors: ipdb> repo.revs('heads(::((0+2) & (0+2)::1))') The docstring was introduced by fd92bfbbe02d9 (2015-06-19 "revset: rename revsbetween to reachableroots and add an argument"), which introduced the `includepath=False` behavior for graphlog grandparents use-case. I believe the docstring instead of the code should be changed because changing the code to match the docstring can result in suboptimal graphlog like: o :\ : o : : :/ o As opposite to the current "linearized" graphlog: o | o : o Differential Revision: https://phab.mercurial-scm.org/D7518 diff -r 888bd39ed555 -r 2e30d7df4809 mercurial/revlog.py --- a/mercurial/revlog.py Tue Nov 19 18:38:17 2019 -0800 +++ b/mercurial/revlog.py Mon Nov 25 11:53:50 2019 -0800 @@ -1279,7 +1279,7 @@ return bool(self.reachableroots(a, [b], [a], includepath=False)) def reachableroots(self, minroot, heads, roots, includepath=False): - """return (heads(:: and ::)) + """return (heads(::( and ::))) If includepath is True, return (::).""" try: