Patchwork [3,of,4,nullrev] revset: duplicate spanset.__contains__ to fullreposet for modification

login
register
mail settings
Submitter Yuya Nishihara
Date March 4, 2015, 3:19 p.m.
Message ID <617bcddf3f7f7ec2f458.1425482375@mimosa>
Download mbox | patch
Permalink /patch/7900/
State Accepted
Headers show

Comments

Yuya Nishihara - March 4, 2015, 3:19 p.m.
# HG changeset patch
# User Yuya Nishihara <yuya@tcha.org>
# Date 1420880965 -32400
#      Sat Jan 10 18:09:25 2015 +0900
# Node ID 617bcddf3f7f7ec2f4589de35b4f80f211d08f2e
# Parent  3cc24fd0d1fa746217013a256b287d5050cf1135
revset: duplicate spanset.__contains__ to fullreposet for modification

1d7a2771aa36 says we should avoid function calls in __contains__, so
super(fullreposet, self).__contains__(rev) is not an option.

Actually the super call doubled the benchmark result of trivial query:

revisions:
0) 678f53865c68 (tip when I wrote this patch)
1) rev == node.nullrev or super(fullreposet, self).__contains__(rev)

revset #0: tip:0
0) wall 0.008441 comb 0.010000 user 0.010000 sys 0.000000 (best of 282)
1) wall 0.016152 comb 0.010000 user 0.010000 sys 0.000000 (best of 146)

Patch

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -3318,6 +3318,11 @@  class fullreposet(spanset):
     def __init__(self, repo):
         super(fullreposet, self).__init__(repo)
 
+    def __contains__(self, rev):
+        hidden = self._hiddenrevs
+        return ((self._start <= rev < self._end)
+                and not (hidden and rev in hidden))
+
     def __and__(self, other):
         """As self contains the whole repo, all of the other set should also be
         in self. Therefore `self & other = other`.