dagop: change revdescendants() to include all root revisions

Prepares for adding depth support. I want to process depth=0 in
revdescendants() to make things simpler.

only() also calls dagop.revdescendants(), but it filters out root revisions
explicitly. So this should cause no problem.

  # descendants(0) using hg repo
  0) 0.052380
  1) 0.051226

  # only(tip) using hg repo
  0) 0.001433
  1) 0.001425
This commit is contained in:
Yuya Nishihara 2017-06-20 22:26:52 +09:00
parent 42de67c95b
commit c6472824e6
3 changed files with 9 additions and 20 deletions

View File

@ -98,11 +98,15 @@ def _genrevdescendants(repo, revs, followfirst):
if first == nullrev:
# Are there nodes with a null first parent and a non-null
# second one? Maybe. Do we care? Probably not.
yield first
for i in cl:
yield i
else:
seen = set(revs)
for i in cl.revs(first + 1):
for i in cl.revs(first):
if i in seen:
yield i
continue
for x in cl.parentrevs(i)[:cut]:
if x != nullrev and x in seen:
seen.add(i)
@ -110,7 +114,8 @@ def _genrevdescendants(repo, revs, followfirst):
break
def revdescendants(repo, revs, followfirst):
"""Like revlog.descendants() but supports followfirst."""
"""Like revlog.descendants() but supports additional options, includes
the given revs themselves, and returns a smartset"""
gen = _genrevdescendants(repo, revs, followfirst)
return generatorset(gen, iterasc=True)

View File

@ -600,19 +600,7 @@ def _descendants(repo, subset, x, followfirst=False):
if not roots:
return baseset()
s = dagop.revdescendants(repo, roots, followfirst)
# Both sets need to be ascending in order to lazily return the union
# in the correct order.
base = subset & roots
desc = subset & s
result = base + desc
if subset.isascending():
result.sort()
elif subset.isdescending():
result.sort(reverse=True)
else:
result = subset & result
return result
return subset & s
@predicate('descendants(set)', safe=True)
def descendants(repo, subset, x):

View File

@ -3530,11 +3530,7 @@ test alias recursion
('symbol', 'merge')
None))
* set:
<addset+
<filteredset
<fullreposet+ 0:10>,
<merge>>,
<generatorset+>>
<generatorset+>
6
7