Page MenuHomePhabricator

revlog: fix revset in reachableroots docstring
ClosedPublic

Authored by quark on Nov 25 2019, 3:08 PM.

Details

Summary

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)')
<baseset+ [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))')
<baseset+ [0]>

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

Diff Detail

Repository
rHG Mercurial
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

quark created this revision.Nov 25 2019, 3:08 PM
pulkit accepted this revision.Nov 26 2019, 9:17 AM
This revision is now accepted and ready to land.Nov 26 2019, 9:17 AM
This revision was automatically updated to reflect the committed changes.