[PATCH 5 of 5 🍦] revset-matching: call `getset` on a `fullreposet`
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Sun Nov 2 05:46:09 CST 2014
# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1413526535 25200
# Thu Oct 16 23:15:35 2014 -0700
# Node ID 7659e131a038fe4b1ac4b87230c63a7d22a6da5f
# Parent 029413a414a56691690eb404ccb22d32b16b5800
revset-matching: call `getset` on a `fullreposet`
Calling `baseset(repo.changelog)` build a list for all revisions in the repo. And
we already have the lazy and efficient `fullreposet` class for this purpose.
This gives us the usual benefits of the fullreposet but it is less visible
because the matching process itself is very expensive:
revset) matching(100)
before) wall 6.413281 comb 6.420000 user 5.910000 sys 0.510000 (best of 3)
after) wall 6.173608 comb 6.170000 user 5.750000 sys 0.420000 (best of 3)
However for some complex list, this provide a massive speedup
revset) matching(parents(100))
before) wall 23.890740 comb 23.890000 user 23.450000 sys 0.440000 (best of 3)
after) wall 6.382280 comb 6.390000 user 5.930000 sys 0.460000 (best of 3)
diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -1381,11 +1381,11 @@ def matching(repo, subset, x):
specified. You can match more than one field at a time.
"""
# i18n: "matching" is a keyword
l = getargs(x, 1, 2, _("matching takes 1 or 2 arguments"))
- revs = getset(repo, baseset(repo.changelog), l[0])
+ revs = getset(repo, fullreposet(repo), l[0])
fieldlist = ['metadata']
if len(l) > 1:
fieldlist = getstring(l[1],
# i18n: "matching" is a keyword
More information about the Mercurial-devel
mailing list