Mercurial > public > mercurial-scm > hg-stable
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: |