Patchwork D7518: revlog: fix revset in reachableroots docstring

login
register
mail settings
Submitter phabricator
Date Nov. 25, 2019, 8:08 p.m.
Message ID <differential-rev-PHID-DREV-koehzsgsvtu3h5xytoj3-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/43518/
State Superseded
Headers show

Comments

phabricator - Nov. 25, 2019, 8:08 p.m.
quark created this revision.
Herald added a reviewer: indygreg.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION 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 <https://phab.mercurial-scm.org/rHGfd92bfbbe02d9eabf156735c204104c3022182db> (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

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D7518

AFFECTED FILES
  mercurial/revlog.py

CHANGE DETAILS




To: quark, indygreg, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -1279,7 +1279,7 @@ 
         return bool(self.reachableroots(a, [b], [a], includepath=False))
 
     def reachableroots(self, minroot, heads, roots, includepath=False):
-        """return (heads(::<roots> and <roots>::<heads>))
+        """return (heads(::(<roots> and <roots>::<heads>)))
 
         If includepath is True, return (<roots>::<heads>)."""
         try: