diff mercurial/dagop.py @ 33003:f63d111258da

revset: add startdepth limit to ancestors() as internal option This is necessary to implement the set{gen} (set subscript) operator. For example, set{-n} will be translated to ancestors(set, depth=n, startdepth=n). https://www.mercurial-scm.org/wiki/RevsetOperatorPlan#ideas_from_mpm The UI is undecided and I doubt if the startdepth option would be actually useful, so the option is hidden for now. 'depth' could be extended to take min:max range, in which case, integer depth should select a single generation. ancestors(set, depth=:y) # scan up to y-th generation ancestors(set, depth=x:) # skip until (x-1)-th generation ancestors(set, depth=x) # select only x-th generation Any ideas are welcomed. # reverse(ancestors(tip)) using hg repo 3) 0.075951 4) 0.076175
author Yuya Nishihara <yuya@tcha.org>
date Sun, 18 Jun 2017 00:40:58 +0900
parents 272a44cac57e
children a10f5f6771f6
line wrap: on
line diff
--- a/mercurial/dagop.py	Sun Jun 18 00:22:41 2017 +0900
+++ b/mercurial/dagop.py	Sun Jun 18 00:40:58 2017 +0900
@@ -23,11 +23,13 @@
 # possible maximum depth between null and wdir()
 _maxlogdepth = 0x80000000
 
-def _genrevancestors(repo, revs, followfirst, stopdepth):
+def _genrevancestors(repo, revs, followfirst, startdepth, stopdepth):
     if followfirst:
         cut = 1
     else:
         cut = None
+    if startdepth is None:
+        startdepth = 0
     if stopdepth is None:
         stopdepth = _maxlogdepth
     if stopdepth <= 0:
@@ -53,8 +55,10 @@
             inputrev = next(irevs, None)
             if inputrev is not None:
                 heapq.heappush(pendingheap, (-inputrev, 0))
+        # rescan parents until curdepth >= startdepth because queued entries
+        # of the same revision are iterated from the lowest depth
         foundnew = (currev != lastrev)
-        if foundnew:
+        if foundnew and curdepth >= startdepth:
             lastrev = currev
             yield currev
         pdepth = curdepth + 1
@@ -68,13 +72,14 @@
                     if pctx.rev() != node.nullrev:
                         heapq.heappush(pendingheap, (-pctx.rev(), pdepth))
 
-def revancestors(repo, revs, followfirst, stopdepth=None):
+def revancestors(repo, revs, followfirst, startdepth=None, stopdepth=None):
     """Like revlog.ancestors(), but supports additional options, includes
     the given revs themselves, and returns a smartset
 
-    Scan ends at the stopdepth (exlusive) if specified.
+    Scan ends at the stopdepth (exlusive) if specified. Revisions found
+    earlier than the startdepth are omitted.
     """
-    gen = _genrevancestors(repo, revs, followfirst, stopdepth)
+    gen = _genrevancestors(repo, revs, followfirst, startdepth, stopdepth)
     return generatorset(gen, iterasc=False)
 
 def revdescendants(repo, revs, followfirst):