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