Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 11930:12547cedc264
revlog: teach revlog to construct a revision from parentdeltas
author | Pradeepkumar Gayam <in3xes@gmail.com> |
---|---|
date | Tue, 10 Aug 2010 22:27:16 +0530 |
parents | 1839a7518b0d |
children | 6051db1327f8 |
comparison
equal
deleted
inserted
replaced
11929:1839a7518b0d | 11930:12547cedc264 |
---|---|
1038 check = True | 1038 check = True |
1039 return check, rev, chain | 1039 return check, rev, chain |
1040 | 1040 |
1041 def revdiff(self, rev1, rev2): | 1041 def revdiff(self, rev1, rev2): |
1042 """return or calculate a delta between two revisions""" | 1042 """return or calculate a delta between two revisions""" |
1043 if rev1 + 1 == rev2 and self.base(rev1) == self.base(rev2): | 1043 if rev1 != nullrev and self.deltaparent(rev2) == rev1: |
1044 return self._chunk(rev2) | 1044 return self._chunk(rev2) |
1045 | 1045 |
1046 return mdiff.textdiff(self.revision(self.node(rev1)), | 1046 return mdiff.textdiff(self.revision(self.node(rev1)), |
1047 self.revision(self.node(rev2))) | 1047 self.revision(self.node(rev2))) |
1048 | 1048 |
1049 def revision(self, node): | 1049 def revision(self, node): |
1050 """return an uncompressed revision of a given node""" | 1050 """return an uncompressed revision of a given node""" |
1051 cache = nullrev | |
1051 if node == nullid: | 1052 if node == nullid: |
1052 return "" | 1053 return "" |
1053 if self._cache and self._cache[0] == node: | 1054 if self._cache: |
1054 return self._cache[2] | 1055 cache = self._cache[1] |
1056 if self._cache[0] == node: | |
1057 return self._cache[2] | |
1055 | 1058 |
1056 # look up what we need to read | 1059 # look up what we need to read |
1057 text = None | 1060 text = None |
1058 rev = self.rev(node) | 1061 rev = self.rev(node) |
1059 base = self.base(rev) | 1062 cache, base, chain = self.deltachain(rev, cache) |
1060 | 1063 |
1061 # check rev flags | 1064 # check rev flags |
1062 if self.flags(rev) & ~REVIDX_KNOWN_FLAGS: | 1065 if self.flags(rev) & ~REVIDX_KNOWN_FLAGS: |
1063 raise RevlogError(_('incompatible revision flag %x') % | 1066 raise RevlogError(_('incompatible revision flag %x') % |
1064 (self.flags(rev) & ~REVIDX_KNOWN_FLAGS)) | 1067 (self.flags(rev) & ~REVIDX_KNOWN_FLAGS)) |
1065 | 1068 |
1066 # do we have useful data cached? | 1069 # do we have useful data cached? |
1067 if self._cache and self._cache[1] >= base and self._cache[1] < rev: | 1070 if cache and self._cache: |
1068 base = self._cache[1] | |
1069 text = self._cache[2] | 1071 text = self._cache[2] |
1070 | 1072 |
1071 # drop cache to save memory | 1073 # drop cache to save memory |
1072 self._cache = None | 1074 self._cache = None |
1073 | 1075 |
1074 self._loadindex(base, rev + 1) | 1076 self._loadindex(base, rev + 1) |
1075 self._chunkraw(base, rev) | 1077 self._chunkraw(base, rev) |
1076 if text is None: | 1078 if text is None: |
1077 text = self._chunk(base) | 1079 text = self._chunk(base) |
1078 | 1080 |
1079 bins = [self._chunk(r) for r in xrange(base + 1, rev + 1)] | 1081 bins = [self._chunk(r) for r in chain] |
1080 text = mdiff.patches(text, bins) | 1082 text = mdiff.patches(text, bins) |
1081 p1, p2 = self.parents(node) | 1083 p1, p2 = self.parents(node) |
1082 if (node != hash(text, p1, p2) and | 1084 if (node != hash(text, p1, p2) and |
1083 not (self.flags(rev) & REVIDX_PUNCHED_FLAG)): | 1085 not (self.flags(rev) & REVIDX_PUNCHED_FLAG)): |
1084 raise RevlogError(_("integrity check failed on %s:%d") | 1086 raise RevlogError(_("integrity check failed on %s:%d") |