comparison mercurial/revlog.py @ 17134:e7167007c083

revlog: fix for generaldelta distance calculation The decision whether or not to store a full snapshot instead of a delta is done based on the distance value calculated in _addrevision.builddelta(rev). This calculation traditionally used the fact of deltas only using the previous revision as base. Generaldelta mechanism is changing this, yet the calculation still assumes that current-offset minus chainbase-offset equals chain-length. This appears to be wrong. This patch corrects the calculation by means of using the chainlength function if Generaldelta is used.
author Friedrich Kastner-Masilko <kastner_masilko@at.festo.com>
date Wed, 11 Jul 2012 12:38:42 +0200
parents 0c18aed2fcca
children ad1b5e070f16
comparison
equal deleted inserted replaced
17133:9937484e8634 17134:e7167007c083
347 base = index[rev][3] 347 base = index[rev][3]
348 while base != rev: 348 while base != rev:
349 rev = base 349 rev = base
350 base = index[rev][3] 350 base = index[rev][3]
351 return base 351 return base
352 def chainlength(self, rev):
353 index = self.index
354 base = index[rev][3]
355 length = index[rev][1]
356 while base != rev:
357 rev = base
358 base = index[rev][3]
359 length = length + index[rev][1]
360 return length
352 def flags(self, rev): 361 def flags(self, rev):
353 return self.index[rev][0] & 0xFFFF 362 return self.index[rev][0] & 0xFFFF
354 def rawsize(self, rev): 363 def rawsize(self, rev):
355 """return the length of the uncompressed text for a given revision""" 364 """return the length of the uncompressed text for a given revision"""
356 l = self.index[rev][2] 365 l = self.index[rev][2]
1044 l = len(data[1]) + len(data[0]) 1053 l = len(data[1]) + len(data[0])
1045 if basecache[0] == rev: 1054 if basecache[0] == rev:
1046 chainbase = basecache[1] 1055 chainbase = basecache[1]
1047 else: 1056 else:
1048 chainbase = self.chainbase(rev) 1057 chainbase = self.chainbase(rev)
1049 dist = l + offset - self.start(chainbase)
1050 if self._generaldelta: 1058 if self._generaldelta:
1059 dist = l + self.chainlength(rev)
1051 base = rev 1060 base = rev
1052 else: 1061 else:
1062 dist = l + offset - self.start(chainbase)
1053 base = chainbase 1063 base = chainbase
1054 return dist, l, data, base, chainbase 1064 return dist, l, data, base, chainbase
1055 1065
1056 curr = len(self) 1066 curr = len(self)
1057 prev = curr - 1 1067 prev = curr - 1