comparison mercurial/revlog.py @ 13258:c2661863f16f

revlog: introduce a cache for partial lookups Partial lookups are always O(n), and often we look up the same one multiple times.
author Matt Mackall <mpm@selenic.com>
date Tue, 11 Jan 2011 17:12:32 -0600
parents 5ef5eb1f3515
children 3b616dfa4b17
comparison
equal deleted inserted replaced
13257:d1245ce817a8 13258:c2661863f16f
219 self._cache = None 219 self._cache = None
220 self._chunkcache = (0, '') 220 self._chunkcache = (0, '')
221 self.index = [] 221 self.index = []
222 self._shallowroot = shallowroot 222 self._shallowroot = shallowroot
223 self._parentdelta = 0 223 self._parentdelta = 0
224 self._pcache = {}
224 225
225 v = REVLOG_DEFAULT_VERSION 226 v = REVLOG_DEFAULT_VERSION
226 if hasattr(opener, 'options') and 'defversion' in opener.options: 227 if hasattr(opener, 'options') and 'defversion' in opener.options:
227 v = opener.options['defversion'] 228 v = opener.options['defversion']
228 if v & REVLOGNG: 229 if v & REVLOGNG:
701 return node 702 return node
702 except (TypeError, LookupError): 703 except (TypeError, LookupError):
703 pass 704 pass
704 705
705 def _partialmatch(self, id): 706 def _partialmatch(self, id):
707 if id in self._pcache:
708 return self._pcache[id]
709
706 if len(id) < 40: 710 if len(id) < 40:
707 try: 711 try:
708 # hex(node)[:...] 712 # hex(node)[:...]
709 l = len(id) // 2 # grab an even number of digits 713 l = len(id) // 2 # grab an even number of digits
710 bin_id = bin(id[:l * 2]) 714 bin_id = bin(id[:l * 2])
711 nl = [n for n in self.nodemap if n[:l] == bin_id] 715 nl = [n for n in self.nodemap if n[:l] == bin_id]
712 nl = [n for n in nl if hex(n).startswith(id)] 716 nl = [n for n in nl if hex(n).startswith(id)]
713 if len(nl) > 0: 717 if len(nl) > 0:
714 if len(nl) == 1: 718 if len(nl) == 1:
719 self._pcache[id] = nl[0]
715 return nl[0] 720 return nl[0]
716 raise LookupError(id, self.indexfile, 721 raise LookupError(id, self.indexfile,
717 _('ambiguous identifier')) 722 _('ambiguous identifier'))
718 return None 723 return None
719 except TypeError: 724 except TypeError: