Mercurial > hg
comparison mercurial/revlog.py @ 14301:f94993769c87
revlog: improve delta generation heuristics for generaldelta
Without this change, pulls (and clones) into a generaldelta repository could
generate very inefficient revlogs, the size of which could be at least twice
the original size.
This was caused by the generated delta chains covering too large distances,
causing new chains to be built far too often. This change addresses the
problem by forcing a delta against second parent or against the previous
revision, when the first parent delta is in danger of creating a long chain.
author | Sune Foldager <cryo@cyanite.org> |
---|---|
date | Thu, 12 May 2011 15:24:33 +0200 |
parents | 62e25c63fb3a |
children | f9e91a400c16 |
comparison
equal
deleted
inserted
replaced
14300:1b8e421d8e42 | 14301:f94993769c87 |
---|---|
1031 p1r, p2r = self.rev(p1), self.rev(p2) | 1031 p1r, p2r = self.rev(p1), self.rev(p2) |
1032 | 1032 |
1033 # should we try to build a delta? | 1033 # should we try to build a delta? |
1034 if prev != nullrev: | 1034 if prev != nullrev: |
1035 if self._generaldelta: | 1035 if self._generaldelta: |
1036 d = builddelta(p1r) | 1036 if p1r >= basecache[1]: |
1037 d = builddelta(p1r) | |
1038 elif p2r >= basecache[1]: | |
1039 d = builddelta(p2r) | |
1040 else: | |
1041 d = builddelta(prev) | |
1037 else: | 1042 else: |
1038 d = builddelta(prev) | 1043 d = builddelta(prev) |
1039 dist, l, data, base, chainbase = d | 1044 dist, l, data, base, chainbase = d |
1040 | 1045 |
1041 # full versions are inserted when the needed deltas | 1046 # full versions are inserted when the needed deltas |