##// END OF EJS Templates
sidedata: add a function to read sidedata from revlog raw text...
marmoute -
r43302:294afb98 default
parent child Browse files
Show More
@@ -44,6 +44,13 b' class StorageError(Hint, Exception):'
44 class RevlogError(StorageError):
44 class RevlogError(StorageError):
45 __bytes__ = _tobytes
45 __bytes__ = _tobytes
46
46
47 class SidedataHashError(RevlogError):
48
49 def __init__(self, key, expected, got):
50 self.sidedatakey = key
51 self.expecteddigest = expected
52 self.actualdigest = got
53
47 class FilteredIndexError(IndexError):
54 class FilteredIndexError(IndexError):
48 __bytes__ = _tobytes
55 __bytes__ = _tobytes
49
56
@@ -1675,7 +1675,13 b' class revlog(object):'
1675 validatehash = flagutil.processflagsraw(self, rawtext, flags)
1675 validatehash = flagutil.processflagsraw(self, rawtext, flags)
1676 text = rawtext
1676 text = rawtext
1677 else:
1677 else:
1678 r = flagutil.processflagsread(self, rawtext, flags)
1678 try:
1679 r = flagutil.processflagsread(self, rawtext, flags)
1680 except error.SidedataHashError as exc:
1681 msg = _("integrity check failed on %s:%s sidedata key %d")
1682 msg %= (self.indexfile, pycompat.bytestr(rev),
1683 exc.sidedatakey)
1684 raise error.RevlogError(msg)
1679 text, validatehash, sidedata = r
1685 text, validatehash, sidedata = r
1680 if validatehash:
1686 if validatehash:
1681 self.checkhash(text, node, rev=rev)
1687 self.checkhash(text, node, rev=rev)
@@ -32,3 +32,32 b' the concept.'
32 """
32 """
33
33
34 from __future__ import absolute_import
34 from __future__ import absolute_import
35
36 import hashlib
37 import struct
38
39 from .. import error
40
41 SIDEDATA_HEADER = struct.Struct('>H')
42 SIDEDATA_ENTRY = struct.Struct('>HL20s')
43
44 def sidedatareadprocessor(rl, text):
45 sidedata = {}
46 offset = 0
47 nbentry, = SIDEDATA_HEADER.unpack(text[:SIDEDATA_HEADER.size])
48 offset += SIDEDATA_HEADER.size
49 dataoffset = SIDEDATA_HEADER.size + (SIDEDATA_ENTRY.size * nbentry)
50 for i in range(nbentry):
51 nextoffset = offset + SIDEDATA_ENTRY.size
52 key, size, storeddigest = SIDEDATA_ENTRY.unpack(text[offset:nextoffset])
53 offset = nextoffset
54 # read the data associated with that entry
55 nextdataoffset = dataoffset + size
56 entrytext = text[dataoffset:nextdataoffset]
57 readdigest = hashlib.sha1(entrytext).digest()
58 if storeddigest != readdigest:
59 raise error.SidedataHashError(key, storeddigest, readdigest)
60 sidedata[key] = entrytext
61 dataoffset = nextdataoffset
62 text = text[dataoffset:]
63 return text, True, sidedata
General Comments 0
You need to be logged in to leave comments. Login now