comparison mercurial/revlog.py @ 19624:55749cb14d24

revlog: extract 'checkhash' method Extract method that decides whether nodeid is correct for paricular revision text and parent nodes. Having this method extracted will allow revlog subclasses to implement custom way of computing nodes. In particular this change is necessary to implement manifest compression.
author Wojciech Lopata <lopek@fb.com>
date Mon, 19 Aug 2013 11:06:38 -0700
parents fd1bb7c1be78
children 6a411a06cb1f
comparison
equal deleted inserted replaced
19623:d0dbe5330177 19624:55749cb14d24
12 """ 12 """
13 13
14 # import stuff from node for others to import from revlog 14 # import stuff from node for others to import from revlog
15 from node import bin, hex, nullid, nullrev 15 from node import bin, hex, nullid, nullrev
16 from i18n import _ 16 from i18n import _
17 import ancestor, mdiff, parsers, error, util 17 import ancestor, mdiff, parsers, error, util, templatefilters
18 import struct, zlib, errno 18 import struct, zlib, errno
19 19
20 _pack = struct.pack 20 _pack = struct.pack
21 _unpack = struct.unpack 21 _unpack = struct.unpack
22 _compress = zlib.compress 22 _compress = zlib.compress
941 self._cache = (node, rev, text) 941 self._cache = (node, rev, text)
942 return text 942 return text
943 943
944 def _checkhash(self, text, node, rev): 944 def _checkhash(self, text, node, rev):
945 p1, p2 = self.parents(node) 945 p1, p2 = self.parents(node)
946 self.checkhash(text, p1, p2, node, rev)
947 return text
948
949 def checkhash(self, text, p1, p2, node, rev=None):
946 if node != hash(text, p1, p2): 950 if node != hash(text, p1, p2):
947 raise RevlogError(_("integrity check failed on %s:%d") 951 revornode = rev
948 % (self.indexfile, rev)) 952 if revornode is None:
949 return text 953 revornode = templatefilters.short(hex(node))
954 raise RevlogError(_("integrity check failed on %s:%s")
955 % (self.indexfile, revornode))
950 956
951 def checkinlinesize(self, tr, fp=None): 957 def checkinlinesize(self, tr, fp=None):
952 if not self._inline or (self.start(-2) + self.length(-2)) < _maxinline: 958 if not self._inline or (self.start(-2) + self.length(-2)) < _maxinline:
953 return 959 return
954 960
1061 if dfh: 1067 if dfh:
1062 dfh.flush() 1068 dfh.flush()
1063 ifh.flush() 1069 ifh.flush()
1064 basetext = self.revision(self.node(cachedelta[0])) 1070 basetext = self.revision(self.node(cachedelta[0]))
1065 btext[0] = mdiff.patch(basetext, cachedelta[1]) 1071 btext[0] = mdiff.patch(basetext, cachedelta[1])
1066 chk = hash(btext[0], p1, p2) 1072 self.checkhash(btext[0], p1, p2, node)
1067 if chk != node:
1068 raise RevlogError(_("consistency error in delta"))
1069 return btext[0] 1073 return btext[0]
1070 1074
1071 def builddelta(rev): 1075 def builddelta(rev):
1072 # can we use the cached delta? 1076 # can we use the cached delta?
1073 if cachedelta and cachedelta[0] == rev: 1077 if cachedelta and cachedelta[0] == rev: