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