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 |
|
|
|
679 |
|
|
|
680 |
if |
|
|
681 |
|
|
|
682 |
|
|
|
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