Comments
Patch
@@ -76,13 +76,14 @@ def _revdescendants(repo, revs, followfi
yield i
break
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
visit = list(heads)
reachable = set()
@@ -99,17 +100,21 @@ def revsbetween(repo, roots, heads):
# sys.getrecursionlimit()
while visit:
rev = nextvisit()
if rev in roots:
reached(rev)
+ if not includepath:
+ continue
parents = parentrevs(rev)
seen[rev] = parents
for parent in parents:
if parent >= minroot and parent not in seen:
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:
reached(rev)
return baseset(sorted(reachable))
@@ -395,11 +400,12 @@ def rangeset(repo, subset, x, y):
# would be more efficient.
return r & subset
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
def andset(repo, subset, x, y):