[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