revset: rename revsbetween to reachableroots and add an argument

This patch is part of a series of patches to speed up the computation of
revset.revsbetween by introducing a C implementation. The main motivation is to
speed up smartlog on big repositories. At the end of the series, on our big
repositories the computation of revsbetween is 10-50x faster and smartlog on is
2x-5x faster.

This patch rename 'revsbetween' to 'reachableroots' and makes the computation of
the full path optional. This will allow graphlog to compute grandparents using
'reachableroots' and remove the need for a dedicated grandparent function.
This commit is contained in:
Laurent Charignon 2015-06-19 20:18:54 -07:00
parent c508574727
commit d803ae95b1

View File

@ -87,9 +87,10 @@ def _revdescendants(repo, revs, followfirst):
return generatorset(iterate(), iterasc=True)
def revsbetween(repo, roots, heads):
"""Return all paths between roots and heads, inclusive of both endpoint
sets."""
def reachableroots(repo, roots, heads, includepath=False):
"""return (heads(::<roots> and ::<heads>))
If includepath is True, return (<roots>::<heads>)."""
if not roots:
return baseset()
parentrevs = repo.changelog.parentrevs
@ -110,6 +111,8 @@ def revsbetween(repo, roots, heads):
rev = nextvisit()
if rev in roots:
reached(rev)
if not includepath:
continue
parents = parentrevs(rev)
seen[rev] = parents
for parent in parents:
@ -117,6 +120,8 @@ def revsbetween(repo, roots, heads):
dovisit(parent)
if not reachable:
return baseset()
if not includepath:
return reachable
for rev in sorted(seen):
for parent in seen[rev]:
if parent in reachable:
@ -406,7 +411,8 @@ def rangeset(repo, subset, x, y):
def dagrange(repo, subset, x, y):
r = fullreposet(repo)
xs = revsbetween(repo, getset(repo, r, x), getset(repo, r, y))
xs = reachableroots(repo, getset(repo, r, x), getset(repo, r, y),
includepath=True)
# XXX We should combine with subset first: 'subset & baseset(...)'. This is
# necessary to ensure we preserve the order in subset.
return xs & subset