[PATCH] revset: changed revsets to use spanset

Lucas Moscovicz lmoscovicz at fb.com
Tue Feb 18 11:33:55 CST 2014


# HG changeset patch
# User Lucas Moscovicz <lmoscovicz at fb.com>
# Date 1391451315 28800
#      Mon Feb 03 10:15:15 2014 -0800
# Node ID 1062b23968e304d61dc4ff958e7c34633f187544
# Parent  84f626df10a5df208b211d3ad907562034d33c1e
revset: changed revsets to use spanset

Performance Benchmarking:

$ hg perfrevset "first(all())"
! wall 0.304936 comb 0.300000 user 0.280000 sys 0.020000 (best of 33)

$ ./hg perfrevset "first(all())"
! wall 0.175640 comb 0.180000 user 0.160000 sys 0.020000 (best of 56)

diff --git a/mercurial/commands.py b/mercurial/commands.py
--- a/mercurial/commands.py
+++ b/mercurial/commands.py
@@ -2558,7 +2558,8 @@
         if newtree != tree:
             ui.note(revset.prettyformat(newtree), "\n")
     func = revset.match(ui, expr)
-    for c in func(repo, revset.baseset(range(len(repo)))):
+    for c in func(repo, revset.spanset(0, len(repo),
+        repo.changelog.filteredrevs)):
         ui.write("%s\n" % c)
 
 @command('debugsetparents', [], _('REV1 [REV2]'))
diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -232,14 +232,13 @@
     m, n = m[0], n[-1]
 
     if m < n:
-        r = range(m, n + 1)
+        r = spanset(m, n + 1, repo.changelog.filteredrevs)
     else:
-        r = range(m, n - 1, -1)
-    s = subset.set()
-    return baseset([x for x in r if x in s])
+        r = spanset(m, n - 1, repo.changelog.filteredrevs)
+    return r & subset
 
 def dagrange(repo, subset, x, y):
-    r = baseset(repo)
+    r = spanset(0, len(repo), repo.changelog.filteredrevs)
     xs = _revsbetween(repo, getset(repo, r, x), getset(repo, r, y))
     s = subset.set()
     return baseset([r for r in xs if r in s])
@@ -287,7 +286,7 @@
     """
     # i18n: "ancestor" is a keyword
     l = getlist(x)
-    rl = baseset(repo)
+    rl = spanset(0, len(repo), repo.changelog.filteredrevs)
     anc = None
 
     # (getset(repo, rl, i) for i in l) generates a list of lists
@@ -306,7 +305,8 @@
     return baseset([])
 
 def _ancestors(repo, subset, x, followfirst=False):
-    args = getset(repo, baseset(repo), x)
+    args = getset(repo, spanset(0, len(repo),
+        repo.changelog.filteredrevs), x)
     if not args:
         return baseset([])
     s = set(_revancestors(repo, args, followfirst)) | set(args)
@@ -433,7 +433,8 @@
         else:
             return lazyset(subset, lambda r: matcher(repo[r].branch()))
 
-    s = getset(repo, baseset(repo), x)
+    s = getset(repo, spanset(0, len(repo), repo.changelog.filteredrevs),
+                x)
     b = set()
     for r in s:
         b.add(repo[r].branch())
@@ -596,11 +597,12 @@
     return lazyset(subset, matches)
 
 def _descendants(repo, subset, x, followfirst=False):
-    args = getset(repo, baseset(repo), x)
+    args = getset(repo, spanset(0, len(repo),
+        repo.changelog.filteredrevs), x)
     if not args:
         return baseset([])
     s = set(_revdescendants(repo, args, followfirst)) | set(args)
-    return baseset([r for r in subset if r in s])
+    return subset & s
 
 def descendants(repo, subset, x):
     """``descendants(set)``
@@ -620,9 +622,11 @@
     is the same as passing all().
     """
     if x is not None:
-        args = getset(repo, baseset(repo), x).set()
+        args = getset(repo, spanset(0, len(repo),
+            repo.changelog.filteredrevs), x).set()
     else:
-        args = getall(repo, baseset(repo), x).set()
+        args = getall(repo, spanset(0, len(repo),
+            repo.changelog.filteredrevs), x).set()
 
     dests = set()
 
@@ -943,7 +947,8 @@
         # i18n: "limit" is a keyword
         raise error.ParseError(_("limit expects a number"))
     ss = subset.set()
-    os = getset(repo, baseset(repo), l[0])
+    os = getset(repo, spanset(0, len(repo), repo.changelog.filteredrevs),
+                l[0])
     bs = baseset([])
     it = iter(os)
     for x in xrange(lim):
@@ -970,14 +975,16 @@
         # i18n: "last" is a keyword
         raise error.ParseError(_("last expects a number"))
     ss = subset.set()
-    os = getset(repo, baseset(repo), l[0])[-lim:]
+    os = getset(repo, spanset(0, len(repo), repo.changelog.filteredrevs),
+                l[0])[-lim:]
     return baseset([r for r in os if r in ss])
 
 def maxrev(repo, subset, x):
     """``max(set)``
     Changeset with highest revision number in set.
     """
-    os = getset(repo, baseset(repo), x)
+    os = getset(repo, spanset(0, len(repo), repo.changelog.filteredrevs),
+                x)
     if os:
         m = max(os)
         if m in subset:
@@ -1014,7 +1021,8 @@
     """``min(set)``
     Changeset with lowest revision number in set.
     """
-    os = getset(repo, baseset(repo), x)
+    os = getset(repo, spanset(0, len(repo), repo.changelog.filteredrevs),
+                x)
     if os:
         m = min(os)
         if m in subset:
@@ -1068,9 +1076,11 @@
     for the first operation is selected.
     """
     if x is not None:
-        args = getset(repo, baseset(repo), x).set()
+        args = getset(repo, spanset(0, len(repo),
+            repo.changelog.filteredrevs), x).set()
     else:
-        args = getall(repo, baseset(repo), x).set()
+        args = getall(repo, spanset(0, len(repo),
+            repo.changelog.filteredrevs), x).set()
 
     def _firstsrc(rev):
         src = _getrevsource(repo, rev)
@@ -1120,7 +1130,8 @@
 
     ps = set()
     cl = repo.changelog
-    for r in getset(repo, baseset(repo), x):
+    for r in getset(repo, spanset(0, len(repo),
+        repo.changelog.filteredrevs), x):
         ps.add(cl.parentrevs(r)[0])
     return subset & ps
 
@@ -1138,7 +1149,8 @@
 
     ps = set()
     cl = repo.changelog
-    for r in getset(repo, baseset(repo), x):
+    for r in getset(repo, spanset(0, len(repo),
+        repo.changelog.filteredrevs), x):
         ps.add(cl.parentrevs(r)[1])
     return subset & ps
 
@@ -1152,7 +1164,8 @@
 
     ps = set()
     cl = repo.changelog
-    for r in getset(repo, baseset(repo), x):
+    for r in getset(repo, spanset(0, len(repo),
+        repo.changelog.filteredrevs), x):
         ps.update(cl.parentrevs(r))
     return subset & ps
 
diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py
--- a/mercurial/scmutil.py
+++ b/mercurial/scmutil.py
@@ -524,7 +524,8 @@
 
         # fall through to new-style queries if old-style fails
         m = revset.match(repo.ui, spec)
-        dl = [r for r in m(repo, revset.baseset(repo)) if r not in seen]
+        dl = [r for r in m(repo, revset.spanset(0, len(repo),
+            repo.changelog.filteredrevs)) if r not in seen]
         l.extend(dl)
         seen.update(dl)
 


More information about the Mercurial-devel mailing list