mirror of
https://github.com/facebook/sapling.git
synced 2024-10-09 08:18:15 +03:00
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:
parent
c508574727
commit
d803ae95b1
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user