Show More
@@ -10,8 +10,12 b' from __future__ import absolute_import' | |||||
10 | import struct |
|
10 | import struct | |
11 | import zlib |
|
11 | import zlib | |
12 |
|
12 | |||
13 | from ..node import nullid |
|
13 | from ..node import nullid, nullrev | |
14 |
from .. import |
|
14 | from .. import ( | |
|
15 | pycompat, | |||
|
16 | revlogutils, | |||
|
17 | util, | |||
|
18 | ) | |||
15 |
|
19 | |||
16 | stringio = pycompat.bytesio |
|
20 | stringio = pycompat.bytesio | |
17 |
|
21 | |||
@@ -43,6 +47,17 b' def offset_type(offset, type):' | |||||
43 |
|
47 | |||
44 |
|
48 | |||
45 | class BaseIndexObject(object): |
|
49 | class BaseIndexObject(object): | |
|
50 | @util.propertycache | |||
|
51 | def nodemap(self): | |||
|
52 | nodemap = revlogutils.NodeMap({nullid: nullrev}) | |||
|
53 | for r in range(0, len(self)): | |||
|
54 | n = self[r][7] | |||
|
55 | nodemap[n] = r | |||
|
56 | return nodemap | |||
|
57 | ||||
|
58 | def clearcaches(self): | |||
|
59 | self.__dict__.pop('nodemap', None) | |||
|
60 | ||||
46 | def __len__(self): |
|
61 | def __len__(self): | |
47 | return self._lgt + len(self._extra) |
|
62 | return self._lgt + len(self._extra) | |
48 |
|
63 |
@@ -205,6 +205,17 b' indexformatv0_unpack = indexformatv0.unp' | |||||
205 |
|
205 | |||
206 |
|
206 | |||
207 | class revlogoldindex(list): |
|
207 | class revlogoldindex(list): | |
|
208 | @util.propertycache | |||
|
209 | def nodemap(self): | |||
|
210 | nodemap = revlogutils.NodeMap({nullid: nullrev}) | |||
|
211 | for r in range(0, len(self)): | |||
|
212 | n = self[r][7] | |||
|
213 | nodemap[n] = r | |||
|
214 | return nodemap | |||
|
215 | ||||
|
216 | def clearcaches(self): | |||
|
217 | self.__dict__.pop('nodemap', None) | |||
|
218 | ||||
208 | def __getitem__(self, i): |
|
219 | def __getitem__(self, i): | |
209 | if i == -1: |
|
220 | if i == -1: | |
210 | return (0, 0, 0, -1, -1, -1, -1, nullid) |
|
221 | return (0, 0, 0, -1, -1, -1, -1, nullid) | |
@@ -240,7 +251,8 b' class revlogoldio(object):' | |||||
240 | nodemap[e[6]] = n |
|
251 | nodemap[e[6]] = n | |
241 | n += 1 |
|
252 | n += 1 | |
242 |
|
253 | |||
243 |
|
|
254 | index = revlogoldindex(index) | |
|
255 | return index, index.nodemap, None | |||
244 |
|
256 | |||
245 | def packentry(self, entry, node, version, rev): |
|
257 | def packentry(self, entry, node, version, rev): | |
246 | if gettype(entry[0]): |
|
258 | if gettype(entry[0]): | |
@@ -287,7 +299,7 b' class revlogio(object):' | |||||
287 | def parseindex(self, data, inline): |
|
299 | def parseindex(self, data, inline): | |
288 | # call the C implementation to parse the index data |
|
300 | # call the C implementation to parse the index data | |
289 | index, cache = parsers.parse_index2(data, inline) |
|
301 | index, cache = parsers.parse_index2(data, inline) | |
290 |
return index, |
|
302 | return index, index.nodemap, cache | |
291 |
|
303 | |||
292 | def packentry(self, entry, node, version, rev): |
|
304 | def packentry(self, entry, node, version, rev): | |
293 | p = indexformatng_pack(*entry) |
|
305 | p = indexformatng_pack(*entry) | |
@@ -372,11 +384,11 b' class revlog(object):' | |||||
372 | self._chunkcachesize = 65536 |
|
384 | self._chunkcachesize = 65536 | |
373 | self._maxchainlen = None |
|
385 | self._maxchainlen = None | |
374 | self._deltabothparents = True |
|
386 | self._deltabothparents = True | |
375 |
self.index = |
|
387 | self.index = None | |
376 | # Mapping of partial identifiers to full nodes. |
|
388 | # Mapping of partial identifiers to full nodes. | |
377 | self._pcache = {} |
|
389 | self._pcache = {} | |
378 | # Mapping of revision integer to full node. |
|
390 | # Mapping of revision integer to full node. | |
379 |
self._nodecache = |
|
391 | self._nodecache = None | |
380 | self._nodepos = None |
|
392 | self._nodepos = None | |
381 | self._compengine = b'zlib' |
|
393 | self._compengine = b'zlib' | |
382 | self._compengineopts = {} |
|
394 | self._compengineopts = {} | |
@@ -541,8 +553,7 b' class revlog(object):' | |||||
541 | _(b"index %s is corrupted") % self.indexfile |
|
553 | _(b"index %s is corrupted") % self.indexfile | |
542 | ) |
|
554 | ) | |
543 | self.index, nodemap, self._chunkcache = d |
|
555 | self.index, nodemap, self._chunkcache = d | |
544 | if nodemap is not None: |
|
556 | self.nodemap = self._nodecache = nodemap | |
545 | self.nodemap = self._nodecache = nodemap |
|
|||
546 | if not self._chunkcache: |
|
557 | if not self._chunkcache: | |
547 | self._chunkclear() |
|
558 | self._chunkclear() | |
548 | # revnum -> (chain-length, sum-delta-length) |
|
559 | # revnum -> (chain-length, sum-delta-length) | |
@@ -646,15 +657,7 b' class revlog(object):' | |||||
646 | self._chainbasecache.clear() |
|
657 | self._chainbasecache.clear() | |
647 | self._chunkcache = (0, b'') |
|
658 | self._chunkcache = (0, b'') | |
648 | self._pcache = {} |
|
659 | self._pcache = {} | |
649 |
|
660 | self.index.clearcaches() | ||
650 | try: |
|
|||
651 | # If we are using the native C version, you are in a fun case |
|
|||
652 | # where self.index, self.nodemap and self._nodecaches is the same |
|
|||
653 | # object. |
|
|||
654 | self._nodecache.clearcaches() |
|
|||
655 | except AttributeError: |
|
|||
656 | self._nodecache = revlogutils.NodeMap({nullid: nullrev}) |
|
|||
657 | self._nodepos = None |
|
|||
658 |
|
661 | |||
659 | def rev(self, node): |
|
662 | def rev(self, node): | |
660 | try: |
|
663 | try: | |
@@ -662,29 +665,10 b' class revlog(object):' | |||||
662 | except TypeError: |
|
665 | except TypeError: | |
663 | raise |
|
666 | raise | |
664 | except error.RevlogError: |
|
667 | except error.RevlogError: | |
665 | if not isinstance(self._nodecache, revlogutils.NodeMap): |
|
668 | # parsers.c radix tree lookup failed | |
666 | # parsers.c radix tree lookup failed |
|
669 | if node == wdirid or node in wdirfilenodeids: | |
667 | if node == wdirid or node in wdirfilenodeids: |
|
670 | raise error.WdirUnsupported | |
668 | raise error.WdirUnsupported |
|
671 | raise error.LookupError(node, self.indexfile, _(b'no node')) | |
669 | raise error.LookupError(node, self.indexfile, _(b'no node')) |
|
|||
670 | else: |
|
|||
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')) |
|
|||
688 |
|
672 | |||
689 | # Accessors for index entries. |
|
673 | # Accessors for index entries. | |
690 |
|
674 |
General Comments 0
You need to be logged in to leave comments.
Login now