changeset 33075:d83b189aef83

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
author Yuya Nishihara <yuya@tcha.org>
date Tue, 20 Jun 2017 22:26:52 +0900
parents e999b59d6eb1
children a76a64c78807
files mercurial/dagop.py mercurial/revset.py tests/test-revset.t
diffstat 3 files changed, 9 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/dagop.py	Tue Jun 20 22:11:23 2017 +0900
+++ b/mercurial/dagop.py	Tue Jun 20 22:26:52 2017 +0900
@@ -98,11 +98,15 @@
     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 @@
                     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)
 
--- a/mercurial/revset.py	Tue Jun 20 22:11:23 2017 +0900
+++ b/mercurial/revset.py	Tue Jun 20 22:26:52 2017 +0900
@@ -600,19 +600,7 @@
     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):
--- a/tests/test-revset.t	Tue Jun 20 22:11:23 2017 +0900
+++ b/tests/test-revset.t	Tue Jun 20 22:26:52 2017 +0900
@@ -3530,11 +3530,7 @@
       ('symbol', 'merge')
       None))
   * set:
-  <addset+
-    <filteredset
-      <fullreposet+ 0:10>,
-      <merge>>,
-    <generatorset+>>
+  <generatorset+>
   6
   7