Show More
@@ -2598,11 +2598,14 b' def perfrevlogindex(ui, repo, file_=None' | |||||
2598 | header = struct.unpack(b'>I', data[0:4])[0] |
|
2598 | header = struct.unpack(b'>I', data[0:4])[0] | |
2599 | version = header & 0xFFFF |
|
2599 | version = header & 0xFFFF | |
2600 | if version == 1: |
|
2600 | if version == 1: | |
2601 | revlogio = revlog.revlogio() |
|
|||
2602 | inline = header & (1 << 16) |
|
2601 | inline = header & (1 << 16) | |
2603 | else: |
|
2602 | else: | |
2604 | raise error.Abort(b'unsupported revlog version: %d' % version) |
|
2603 | raise error.Abort(b'unsupported revlog version: %d' % version) | |
2605 |
|
2604 | |||
|
2605 | parse_index_v1 = getattr(revlog, 'parse_index_v1', None) | |||
|
2606 | if parse_index_v1 is None: | |||
|
2607 | parse_index_v1 = revlog.revlogio().parseindex | |||
|
2608 | ||||
2606 | rllen = len(rl) |
|
2609 | rllen = len(rl) | |
2607 |
|
2610 | |||
2608 | node0 = rl.node(0) |
|
2611 | node0 = rl.node(0) | |
@@ -2624,26 +2627,24 b' def perfrevlogindex(ui, repo, file_=None' | |||||
2624 | fh.read() |
|
2627 | fh.read() | |
2625 |
|
2628 | |||
2626 | def parseindex(): |
|
2629 | def parseindex(): | |
2627 |
|
|
2630 | parse_index_v1(data, inline) | |
2628 |
|
2631 | |||
2629 | def getentry(revornode): |
|
2632 | def getentry(revornode): | |
2630 |
index = |
|
2633 | index = parse_index_v1(data, inline)[0] | |
2631 | index[revornode] |
|
2634 | index[revornode] | |
2632 |
|
2635 | |||
2633 | def getentries(revs, count=1): |
|
2636 | def getentries(revs, count=1): | |
2634 |
index = |
|
2637 | index = parse_index_v1(data, inline)[0] | |
2635 |
|
2638 | |||
2636 | for i in range(count): |
|
2639 | for i in range(count): | |
2637 | for rev in revs: |
|
2640 | for rev in revs: | |
2638 | index[rev] |
|
2641 | index[rev] | |
2639 |
|
2642 | |||
2640 | def resolvenode(node): |
|
2643 | def resolvenode(node): | |
2641 |
index = |
|
2644 | index = parse_index_v1(data, inline)[0] | |
2642 | rev = getattr(index, 'rev', None) |
|
2645 | rev = getattr(index, 'rev', None) | |
2643 | if rev is None: |
|
2646 | if rev is None: | |
2644 | nodemap = getattr( |
|
2647 | nodemap = getattr(parse_index_v1(data, inline)[0], 'nodemap', None) | |
2645 | revlogio.parseindex(data, inline)[0], 'nodemap', None |
|
|||
2646 | ) |
|
|||
2647 | # This only works for the C code. |
|
2648 | # This only works for the C code. | |
2648 | if nodemap is None: |
|
2649 | if nodemap is None: | |
2649 | return |
|
2650 | return | |
@@ -2655,12 +2656,10 b' def perfrevlogindex(ui, repo, file_=None' | |||||
2655 | pass |
|
2656 | pass | |
2656 |
|
2657 | |||
2657 | def resolvenodes(nodes, count=1): |
|
2658 | def resolvenodes(nodes, count=1): | |
2658 |
index = |
|
2659 | index = parse_index_v1(data, inline)[0] | |
2659 | rev = getattr(index, 'rev', None) |
|
2660 | rev = getattr(index, 'rev', None) | |
2660 | if rev is None: |
|
2661 | if rev is None: | |
2661 | nodemap = getattr( |
|
2662 | nodemap = getattr(parse_index_v1(data, inline)[0], 'nodemap', None) | |
2662 | revlogio.parseindex(data, inline)[0], 'nodemap', None |
|
|||
2663 | ) |
|
|||
2664 | # This only works for the C code. |
|
2663 | # This only works for the C code. | |
2665 | if nodemap is None: |
|
2664 | if nodemap is None: | |
2666 | return |
|
2665 | return |
@@ -37,8 +37,6 b' from .revlogutils.constants import (' | |||||
37 | FLAG_GENERALDELTA, |
|
37 | FLAG_GENERALDELTA, | |
38 | FLAG_INLINE_DATA, |
|
38 | FLAG_INLINE_DATA, | |
39 | INDEX_ENTRY_V0, |
|
39 | INDEX_ENTRY_V0, | |
40 | INDEX_ENTRY_V1, |
|
|||
41 | INDEX_ENTRY_V2, |
|
|||
42 | INDEX_HEADER, |
|
40 | INDEX_HEADER, | |
43 | REVLOGV0, |
|
41 | REVLOGV0, | |
44 | REVLOGV1, |
|
42 | REVLOGV1, | |
@@ -287,34 +285,61 b' class revlogoldindex(list):' | |||||
287 | return INDEX_ENTRY_V0.pack(*e2) |
|
285 | return INDEX_ENTRY_V0.pack(*e2) | |
288 |
|
286 | |||
289 |
|
287 | |||
290 | class revlogoldio(object): |
|
288 | def parse_index_v0(data, inline): | |
291 | def parseindex(self, data, inline): |
|
289 | s = INDEX_ENTRY_V0.size | |
292 | s = INDEX_ENTRY_V0.size |
|
290 | index = [] | |
293 | index = [] |
|
291 | nodemap = nodemaputil.NodeMap({sha1nodeconstants.nullid: nullrev}) | |
294 | nodemap = nodemaputil.NodeMap({sha1nodeconstants.nullid: nullrev}) |
|
292 | n = off = 0 | |
295 | n = off = 0 |
|
293 | l = len(data) | |
296 | l = len(data) |
|
294 | while off + s <= l: | |
297 | while off + s <= l: |
|
295 | cur = data[off : off + s] | |
298 | cur = data[off : off + s] |
|
296 | off += s | |
299 | off += s |
|
297 | e = INDEX_ENTRY_V0.unpack(cur) | |
300 | e = INDEX_ENTRY_V0.unpack(cur) |
|
298 | # transform to revlogv1 format | |
301 | # transform to revlogv1 format |
|
299 | e2 = ( | |
302 | e2 = ( |
|
300 | offset_type(e[0], 0), | |
303 | offset_type(e[0], 0), |
|
301 | e[1], | |
304 |
|
|
302 | -1, | |
305 |
|
|
303 | e[2], | |
306 |
|
|
304 | e[3], | |
307 | e[3], |
|
305 | nodemap.get(e[4], nullrev), | |
308 |
|
|
306 | nodemap.get(e[5], nullrev), | |
309 | nodemap.get(e[5], nullrev), |
|
307 | e[6], | |
310 | e[6], |
|
308 | ) | |
311 | ) |
|
309 | index.append(e2) | |
312 | index.append(e2) |
|
310 | nodemap[e[6]] = n | |
313 | nodemap[e[6]] = n |
|
311 | n += 1 | |
314 | n += 1 |
|
312 | ||
315 |
|
313 | index = revlogoldindex(index) | ||
316 | index = revlogoldindex(index) |
|
314 | return index, None | |
317 | return index, None |
|
315 | ||
|
316 | ||||
|
317 | def parse_index_v1(data, inline): | |||
|
318 | # call the C implementation to parse the index data | |||
|
319 | index, cache = parsers.parse_index2(data, inline) | |||
|
320 | return index, cache | |||
|
321 | ||||
|
322 | ||||
|
323 | def parse_index_v2(data, inline): | |||
|
324 | # call the C implementation to parse the index data | |||
|
325 | index, cache = parsers.parse_index2(data, inline, revlogv2=True) | |||
|
326 | return index, cache | |||
|
327 | ||||
|
328 | ||||
|
329 | if util.safehasattr(parsers, 'parse_index_devel_nodemap'): | |||
|
330 | ||||
|
331 | def parse_index_v1_nodemap(data, inline): | |||
|
332 | index, cache = parsers.parse_index_devel_nodemap(data, inline) | |||
|
333 | return index, cache | |||
|
334 | ||||
|
335 | ||||
|
336 | else: | |||
|
337 | parse_index_v1_nodemap = None | |||
|
338 | ||||
|
339 | ||||
|
340 | def parse_index_v1_mixed(data, inline): | |||
|
341 | index, cache = parse_index_v1(data, inline) | |||
|
342 | return rustrevlog.MixedIndex(index), cache | |||
318 |
|
343 | |||
319 |
|
344 | |||
320 | # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte |
|
345 | # corresponds to uncompressed length of indexformatng (2 gigs, 4-byte | |
@@ -322,40 +347,6 b' class revlogoldio(object):' | |||||
322 | _maxentrysize = 0x7FFFFFFF |
|
347 | _maxentrysize = 0x7FFFFFFF | |
323 |
|
348 | |||
324 |
|
349 | |||
325 | class revlogio(object): |
|
|||
326 | def parseindex(self, data, inline): |
|
|||
327 | # call the C implementation to parse the index data |
|
|||
328 | index, cache = parsers.parse_index2(data, inline) |
|
|||
329 | return index, cache |
|
|||
330 |
|
||||
331 |
|
||||
332 | class revlogv2io(object): |
|
|||
333 | def parseindex(self, data, inline): |
|
|||
334 | index, cache = parsers.parse_index2(data, inline, revlogv2=True) |
|
|||
335 | return index, cache |
|
|||
336 |
|
||||
337 |
|
||||
338 | NodemapRevlogIO = None |
|
|||
339 |
|
||||
340 | if util.safehasattr(parsers, 'parse_index_devel_nodemap'): |
|
|||
341 |
|
||||
342 | class NodemapRevlogIO(revlogio): |
|
|||
343 | """A debug oriented IO class that return a PersistentNodeMapIndexObject |
|
|||
344 |
|
||||
345 | The PersistentNodeMapIndexObject object is meant to test the persistent nodemap feature. |
|
|||
346 | """ |
|
|||
347 |
|
||||
348 | def parseindex(self, data, inline): |
|
|||
349 | index, cache = parsers.parse_index_devel_nodemap(data, inline) |
|
|||
350 | return index, cache |
|
|||
351 |
|
||||
352 |
|
||||
353 | class rustrevlogio(revlogio): |
|
|||
354 | def parseindex(self, data, inline): |
|
|||
355 | index, cache = super(rustrevlogio, self).parseindex(data, inline) |
|
|||
356 | return rustrevlog.MixedIndex(index), cache |
|
|||
357 |
|
||||
358 |
|
||||
359 | class revlog(object): |
|
350 | class revlog(object): | |
360 | """ |
|
351 | """ | |
361 | the underlying revision storage object |
|
352 | the underlying revision storage object | |
@@ -614,7 +605,7 b' class revlog(object):' | |||||
614 | devel_nodemap = ( |
|
605 | devel_nodemap = ( | |
615 | self.nodemap_file |
|
606 | self.nodemap_file | |
616 | and opts.get(b'devel-force-nodemap', False) |
|
607 | and opts.get(b'devel-force-nodemap', False) | |
617 |
and |
|
608 | and parse_index_v1_nodemap is not None | |
618 | ) |
|
609 | ) | |
619 |
|
610 | |||
620 | use_rust_index = False |
|
611 | use_rust_index = False | |
@@ -624,17 +615,17 b' class revlog(object):' | |||||
624 | else: |
|
615 | else: | |
625 | use_rust_index = self.opener.options.get(b'rust.index') |
|
616 | use_rust_index = self.opener.options.get(b'rust.index') | |
626 |
|
617 | |||
627 | self._io = revlogio() |
|
618 | self._parse_index = parse_index_v1 | |
628 | if self.version == REVLOGV0: |
|
619 | if self.version == REVLOGV0: | |
629 |
self._ |
|
620 | self._parse_index = parse_index_v0 | |
630 | elif fmt == REVLOGV2: |
|
621 | elif fmt == REVLOGV2: | |
631 |
self._ |
|
622 | self._parse_index = parse_index_v2 | |
632 | elif devel_nodemap: |
|
623 | elif devel_nodemap: | |
633 | self._io = NodemapRevlogIO() |
|
624 | self._parse_index = parse_index_v1_nodemap | |
634 | elif use_rust_index: |
|
625 | elif use_rust_index: | |
635 |
self._ |
|
626 | self._parse_index = parse_index_v1_mixed | |
636 | try: |
|
627 | try: | |
637 |
d = self._ |
|
628 | d = self._parse_index(indexdata, self._inline) | |
638 | index, _chunkcache = d |
|
629 | index, _chunkcache = d | |
639 | use_nodemap = ( |
|
630 | use_nodemap = ( | |
640 | not self._inline |
|
631 | not self._inline | |
@@ -2049,7 +2040,6 b' class revlog(object):' | |||||
2049 | with self._indexfp(b'w') as fp: |
|
2040 | with self._indexfp(b'w') as fp: | |
2050 | self.version &= ~FLAG_INLINE_DATA |
|
2041 | self.version &= ~FLAG_INLINE_DATA | |
2051 | self._inline = False |
|
2042 | self._inline = False | |
2052 | io = self._io |
|
|||
2053 | for i in self: |
|
2043 | for i in self: | |
2054 | e = self.index.entry_binary(i, self.version) |
|
2044 | e = self.index.entry_binary(i, self.version) | |
2055 | fp.write(e) |
|
2045 | fp.write(e) | |
@@ -2984,7 +2974,7 b' class revlog(object):' | |||||
2984 | newrl = revlog(self.opener, newindexfile, newdatafile, censorable=True) |
|
2974 | newrl = revlog(self.opener, newindexfile, newdatafile, censorable=True) | |
2985 | newrl.version = self.version |
|
2975 | newrl.version = self.version | |
2986 | newrl._generaldelta = self._generaldelta |
|
2976 | newrl._generaldelta = self._generaldelta | |
2987 |
newrl._ |
|
2977 | newrl._parse_index = self._parse_index | |
2988 |
|
2978 | |||
2989 | for rev in self.revs(): |
|
2979 | for rev in self.revs(): | |
2990 | node = self.node(rev) |
|
2980 | node = self.node(rev) |
General Comments 0
You need to be logged in to leave comments.
Login now