Mercurial > hg
changeset 39087:f90b333e79cb
revlog: filter out "invalid" delta base candidates
There are bases that we know won't produce a good delta chain. For example, if
the base is already bigger than twice the size of the text we store, we know
the resulting delta chain will never be valid.
We might make the check a bit more powerful and generic in the future, but
this looks a good start.
In particular, empty file (size 0) will never find a good base, so we should
stop spending time trying to find one.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Fri, 27 Jul 2018 12:08:10 +0200 |
parents | 64ddad2f26bb |
children | ad88726d6982 |
files | mercurial/revlog.py |
diffstat | 1 files changed, 4 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/revlog.py Tue Aug 14 13:47:07 2018 -0700 +++ b/mercurial/revlog.py Fri Jul 27 12:08:10 2018 +0200 @@ -750,7 +750,11 @@ deltaparent = self.revlog.deltaparent deltainfo = None + deltas_limit = revinfo.textlen * LIMIT_DELTA2TEXT for candidaterevs in self._getcandidaterevs(p1, p2, cachedelta): + # filter out delta base that will never produce good delta + candidaterevs = [r for r in candidaterevs + if self.revlog.length(r) <= deltas_limit] nominateddeltas = [] for candidaterev in candidaterevs: # skip over empty delta (no need to include them in a chain)