comparison mercurial/revlog.py @ 43524:a7c0c5b5a50f

revlog: introduce an explicit NodeMap class for pure code This class make the "pure" nodemap raise the same exception than the C-extension one. This is a step toward unifying nodemap and index, the class is not meant to survive on the long run. This work is part of a refactoring to unify the revlog index and the nodemap. This unification prepare the use of a persistent nodemap. There is a new `isinstance` call, it will be cleaned up in coming changesets. Differential Revision: https://phab.mercurial-scm.org/D7312
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Wed, 06 Nov 2019 14:13:19 +0100
parents 9f70512ae2cf
children 845e5b313783
comparison
equal deleted inserted replaced
43523:c21aca51b392 43524:a7c0c5b5a50f
63 dagop, 63 dagop,
64 error, 64 error,
65 mdiff, 65 mdiff,
66 policy, 66 policy,
67 pycompat, 67 pycompat,
68 revlogutils,
68 templatefilters, 69 templatefilters,
69 util, 70 util,
70 ) 71 )
71 from .interfaces import ( 72 from .interfaces import (
72 repository, 73 repository,
215 self.size = indexformatv0.size 216 self.size = indexformatv0.size
216 217
217 def parseindex(self, data, inline): 218 def parseindex(self, data, inline):
218 s = self.size 219 s = self.size
219 index = [] 220 index = []
220 nodemap = {nullid: nullrev} 221 nodemap = revlogutils.NodeMap({nullid: nullrev})
221 n = off = 0 222 n = off = 0
222 l = len(data) 223 l = len(data)
223 while off + s <= l: 224 while off + s <= l:
224 cur = data[off : off + s] 225 cur = data[off : off + s]
225 off += s 226 off += s
373 self._deltabothparents = True 374 self._deltabothparents = True
374 self.index = [] 375 self.index = []
375 # Mapping of partial identifiers to full nodes. 376 # Mapping of partial identifiers to full nodes.
376 self._pcache = {} 377 self._pcache = {}
377 # Mapping of revision integer to full node. 378 # Mapping of revision integer to full node.
378 self._nodecache = {nullid: nullrev} 379 self._nodecache = revlogutils.NodeMap({nullid: nullrev})
379 self._nodepos = None 380 self._nodepos = None
380 self._compengine = b'zlib' 381 self._compengine = b'zlib'
381 self._compengineopts = {} 382 self._compengineopts = {}
382 self._maxdeltachainspan = -1 383 self._maxdeltachainspan = -1
383 self._withsparseread = False 384 self._withsparseread = False
650 # If we are using the native C version, you are in a fun case 651 # If we are using the native C version, you are in a fun case
651 # where self.index, self.nodemap and self._nodecaches is the same 652 # where self.index, self.nodemap and self._nodecaches is the same
652 # object. 653 # object.
653 self._nodecache.clearcaches() 654 self._nodecache.clearcaches()
654 except AttributeError: 655 except AttributeError:
655 self._nodecache = {nullid: nullrev} 656 self._nodecache = revlogutils.NodeMap({nullid: nullrev})
656 self._nodepos = None 657 self._nodepos = None
657 658
658 def rev(self, node): 659 def rev(self, node):
659 try: 660 try:
660 return self._nodecache[node] 661 return self._nodecache[node]
661 except TypeError: 662 except TypeError:
662 raise 663 raise
663 except error.RevlogError: 664 except error.RevlogError:
664 # parsers.c radix tree lookup failed 665 if not isinstance(self._nodecache, revlogutils.NodeMap):
665 if node == wdirid or node in wdirfilenodeids: 666 # parsers.c radix tree lookup failed
666 raise error.WdirUnsupported 667 if node == wdirid or node in wdirfilenodeids:
667 raise error.LookupError(node, self.indexfile, _(b'no node')) 668 raise error.WdirUnsupported
668 except KeyError: 669 raise error.LookupError(node, self.indexfile, _(b'no node'))
669 # pure python cache lookup failed
670 n = self._nodecache
671 i = self.index
672 p = self._nodepos
673 if p is None:
674 p = len(i) - 1
675 else: 670 else:
676 assert p < len(i) 671 # pure python cache lookup failed
677 for r in pycompat.xrange(p, -1, -1): 672 n = self._nodecache
678 v = i[r][7] 673 i = self.index
679 n[v] = r 674 p = self._nodepos
680 if v == node: 675 if p is None:
681 self._nodepos = r - 1 676 p = len(i) - 1
682 return r 677 else:
683 if node == wdirid or node in wdirfilenodeids: 678 assert p < len(i)
684 raise error.WdirUnsupported 679 for r in pycompat.xrange(p, -1, -1):
685 raise error.LookupError(node, self.indexfile, _(b'no node')) 680 v = i[r][7]
681 n[v] = r
682 if v == node:
683 self._nodepos = r - 1
684 return r
685 if node == wdirid or node in wdirfilenodeids:
686 raise error.WdirUnsupported
687 raise error.LookupError(node, self.indexfile, _(b'no node'))
686 688
687 # Accessors for index entries. 689 # Accessors for index entries.
688 690
689 # First tuple entry is 8 bytes. First 6 bytes are offset. Last 2 bytes 691 # First tuple entry is 8 bytes. First 6 bytes are offset. Last 2 bytes
690 # are flags. 692 # are flags.