[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