[PATCH 04 of 13] revset: implement dagrange directly

Bryan O'Sullivan bos at serpentine.com
Fri Jun 1 17:52:02 CDT 2012


# HG changeset patch
# User Bryan O'Sullivan <bryano at fb.com>
# Date 1338591022 25200
# Node ID 7cc07c4cc88f377cee98668f4d077c357f9b9499
# Parent  5f7f85ea07b42f4be71689901f53846e6bd5f6c4
revset: implement dagrange directly

This is much faster than the older implementation (~8x).

For safety, we currently compare every result from the new
implementation against the old.

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -191,11 +191,30 @@ def rangeset(repo, subset, x, y):
     s = set(subset)
     return [x for x in r if x in s]
 
-def dagrange(repo, subset, x, y):
+def dagrangenew(repo, subset, x, y):
+    if subset:
+        r = range(len(repo))
+        m = getset(repo, r, x)
+        n = getset(repo, r, y)
+        cl = repo.changelog
+        xs = map(cl.rev, cl.nodesbetween(map(cl.node, m), map(cl.node, n))[0])
+        s = set(subset)
+        return [r for r in xs if r in s]
+    return []
+
+def dagrangeold(repo, subset, x, y):
     return andset(repo, subset,
                   ('func', ('symbol', 'descendants'), x),
                   ('func', ('symbol', 'ancestors'), y))
 
+def dagrangecheck(repo, subset, x, y):
+    old = dagrangeold(repo, subset, x, y)
+    new = dagrangenew(repo, subset, x, y)
+    assert sorted(old) == sorted(new), 'dagrange: old != new'
+    return new
+
+dagrange = dagrangecheck
+
 def andset(repo, subset, x, y):
     return getset(repo, getset(repo, subset, x), y)
 


More information about the Mercurial-devel mailing list