##// END OF EJS Templates
revlog: introduce an explicit NodeMap class for pure code...
marmoute -
r43924:a7c0c5b5 default
parent child Browse files
Show More
@@ -65,6 +65,7 b' from . import ('
65 65 mdiff,
66 66 policy,
67 67 pycompat,
68 revlogutils,
68 69 templatefilters,
69 70 util,
70 71 )
@@ -217,7 +218,7 b' class revlogoldio(object):'
217 218 def parseindex(self, data, inline):
218 219 s = self.size
219 220 index = []
220 nodemap = {nullid: nullrev}
221 nodemap = revlogutils.NodeMap({nullid: nullrev})
221 222 n = off = 0
222 223 l = len(data)
223 224 while off + s <= l:
@@ -375,7 +376,7 b' class revlog(object):'
375 376 # Mapping of partial identifiers to full nodes.
376 377 self._pcache = {}
377 378 # Mapping of revision integer to full node.
378 self._nodecache = {nullid: nullrev}
379 self._nodecache = revlogutils.NodeMap({nullid: nullrev})
379 380 self._nodepos = None
380 381 self._compengine = b'zlib'
381 382 self._compengineopts = {}
@@ -652,7 +653,7 b' class revlog(object):'
652 653 # object.
653 654 self._nodecache.clearcaches()
654 655 except AttributeError:
655 self._nodecache = {nullid: nullrev}
656 self._nodecache = revlogutils.NodeMap({nullid: nullrev})
656 657 self._nodepos = None
657 658
658 659 def rev(self, node):
@@ -661,28 +662,29 b' class revlog(object):'
661 662 except TypeError:
662 663 raise
663 664 except error.RevlogError:
664 # parsers.c radix tree lookup failed
665 if node == wdirid or node in wdirfilenodeids:
666 raise error.WdirUnsupported
667 raise error.LookupError(node, self.indexfile, _(b'no node'))
668 except KeyError:
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
665 if not isinstance(self._nodecache, revlogutils.NodeMap):
666 # parsers.c radix tree lookup failed
667 if node == wdirid or node in wdirfilenodeids:
668 raise error.WdirUnsupported
669 raise error.LookupError(node, self.indexfile, _(b'no node'))
675 670 else:
676 assert p < len(i)
677 for r in pycompat.xrange(p, -1, -1):
678 v = i[r][7]
679 n[v] = r
680 if v == node:
681 self._nodepos = r - 1
682 return r
683 if node == wdirid or node in wdirfilenodeids:
684 raise error.WdirUnsupported
685 raise error.LookupError(node, self.indexfile, _(b'no node'))
671 # pure python cache lookup failed
672 n = self._nodecache
673 i = self.index
674 p = self._nodepos
675 if p is None:
676 p = len(i) - 1
677 else:
678 assert p < len(i)
679 for r in pycompat.xrange(p, -1, -1):
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 689 # Accessors for index entries.
688 690
@@ -0,0 +1,14 b''
1 # mercurial.revlogutils -- basic utilities for revlog
2 #
3 # Copyright 2019 Pierre-Yves David <pierre-yves.david@octobus.net>
4 #
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
7
8 from __future__ import absolute_import
9 from .. import error
10
11
12 class NodeMap(dict):
13 def __missing__(self, x):
14 raise error.RevlogError('unknown node: %s' % x)
General Comments 0
You need to be logged in to leave comments. Login now