comparison mercurial/revlog.py @ 35737:d99b07bc69fb

revlog: refactor out _finddeltainfo from _addrevision Splicing the code into smaller chunks should help understanding it, and eventually override some parts in experimental branches to try optimization.
author Paul Morelle <paul.morelle@octobus.net>
date Sun, 14 Jan 2018 14:36:22 +0100
parents c41bb85c09ff
children f90f6fd130c1
comparison
equal deleted inserted replaced
35736:29f57ce416ed 35737:d99b07bc69fb
277 """ 277 """
278 node = attr.ib() 278 node = attr.ib()
279 p1 = attr.ib() 279 p1 = attr.ib()
280 p2 = attr.ib() 280 p2 = attr.ib()
281 btext = attr.ib() 281 btext = attr.ib()
282 textlen = attr.ib()
282 cachedelta = attr.ib() 283 cachedelta = attr.ib()
283 flags = attr.ib() 284 flags = attr.ib()
284 285
285 # index v0: 286 # index v0:
286 # 4 bytes: offset 287 # 4 bytes: offset
1985 chainlen += 1 1986 chainlen += 1
1986 compresseddeltalen += deltalen 1987 compresseddeltalen += deltalen
1987 return _deltainfo(dist, deltalen, (header, data), deltabase, 1988 return _deltainfo(dist, deltalen, (header, data), deltabase,
1988 chainbase, chainlen, compresseddeltalen) 1989 chainbase, chainlen, compresseddeltalen)
1989 1990
1991 def _finddeltainfo(self, revinfo, fh):
1992 """Find an acceptable delta against a candidate revision
1993
1994 revinfo: information about the revision (instance of _revisioninfo)
1995 fh: file handle to either the .i or the .d revlog file,
1996 depending on whether it is inlined or not
1997
1998 Returns the first acceptable candidate revision, as ordered by
1999 _getcandidaterevs
2000 """
2001 cachedelta = revinfo.cachedelta
2002 p1 = revinfo.p1
2003 p2 = revinfo.p2
2004
2005 deltainfo = None
2006 for candidaterevs in self._getcandidaterevs(p1, p2, cachedelta):
2007 nominateddeltas = []
2008 for candidaterev in candidaterevs:
2009 candidatedelta = self._builddeltainfo(revinfo, candidaterev, fh)
2010 if self._isgooddeltainfo(candidatedelta, revinfo.textlen):
2011 nominateddeltas.append(candidatedelta)
2012 if nominateddeltas:
2013 deltainfo = min(nominateddeltas, key=lambda x: x.deltalen)
2014 break
2015
2016 return deltainfo
2017
1990 def _addrevision(self, node, rawtext, transaction, link, p1, p2, flags, 2018 def _addrevision(self, node, rawtext, transaction, link, p1, p2, flags,
1991 cachedelta, ifh, dfh, alwayscache=False): 2019 cachedelta, ifh, dfh, alwayscache=False):
1992 """internal function to add revisions to the log 2020 """internal function to add revisions to the log
1993 2021
1994 see addrevision for argument descriptions. 2022 see addrevision for argument descriptions.
2014 btext = [rawtext] 2042 btext = [rawtext]
2015 2043
2016 curr = len(self) 2044 curr = len(self)
2017 prev = curr - 1 2045 prev = curr - 1
2018 offset = self.end(prev) 2046 offset = self.end(prev)
2019 deltainfo = None
2020 p1r, p2r = self.rev(p1), self.rev(p2) 2047 p1r, p2r = self.rev(p1), self.rev(p2)
2021 2048
2022 # full versions are inserted when the needed deltas 2049 # full versions are inserted when the needed deltas
2023 # become comparable to the uncompressed text 2050 # become comparable to the uncompressed text
2024 if rawtext is None: 2051 if rawtext is None:
2025 textlen = mdiff.patchedsize(self.rawsize(cachedelta[0]), 2052 textlen = mdiff.patchedsize(self.rawsize(cachedelta[0]),
2026 cachedelta[1]) 2053 cachedelta[1])
2027 else: 2054 else:
2028 textlen = len(rawtext) 2055 textlen = len(rawtext)
2029 2056
2030 revinfo = _revisioninfo(node, p1, p2, btext, cachedelta, flags) 2057 revinfo = _revisioninfo(node, p1, p2, btext, textlen, cachedelta, flags)
2031 for candidaterevs in self._getcandidaterevs(p1, p2, cachedelta): 2058 deltainfo = self._finddeltainfo(revinfo, fh)
2032 nominateddeltas = []
2033 for candidaterev in candidaterevs:
2034 candidatedelta = self._builddeltainfo(revinfo, candidaterev, fh)
2035 if self._isgooddeltainfo(candidatedelta, textlen):
2036 nominateddeltas.append(candidatedelta)
2037 if nominateddeltas:
2038 deltainfo = min(nominateddeltas, key=lambda x: x.deltalen)
2039 break
2040 2059
2041 if deltainfo is not None: 2060 if deltainfo is not None:
2042 base = deltainfo.base 2061 base = deltainfo.base
2043 chainbase = deltainfo.chainbase 2062 chainbase = deltainfo.chainbase
2044 data = deltainfo.data 2063 data = deltainfo.data