Mercurial > public > mercurial-scm > hg
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. |