comparison mercurial/revlog.py @ 35637:a7d39f08bc66

revlog: extract 'builddelta' closure function from _addrevision
author Paul Morelle <paul.morelle@octobus.net>
date Fri, 12 Jan 2018 18:10:03 +0100
parents 8108bb51309d
children edc9330acac1
comparison
equal deleted inserted replaced
35636:8108bb51309d 35637:a7d39f08bc66
1921 # must pass the censored index flag to add censored revisions 1921 # must pass the censored index flag to add censored revisions
1922 if not flags & REVIDX_ISCENSORED: 1922 if not flags & REVIDX_ISCENSORED:
1923 raise 1923 raise
1924 return btext[0] 1924 return btext[0]
1925 1925
1926 def _builddelta(self, node, rev, p1, p2, btext, cachedelta, fh, flags):
1927 # can we use the cached delta?
1928 if cachedelta and cachedelta[0] == rev:
1929 delta = cachedelta[1]
1930 else:
1931 t = self._buildtext(node, p1, p2, btext, cachedelta, fh, flags)
1932 if self.iscensored(rev):
1933 # deltas based on a censored revision must replace the
1934 # full content in one patch, so delta works everywhere
1935 header = mdiff.replacediffheader(self.rawsize(rev), len(t))
1936 delta = header + t
1937 else:
1938 ptext = self.revision(rev, _df=fh, raw=True)
1939 delta = mdiff.textdiff(ptext, t)
1940 header, data = self.compress(delta)
1941 deltalen = len(header) + len(data)
1942 chainbase = self.chainbase(rev)
1943 offset = self.end(len(self) - 1)
1944 dist = deltalen + offset - self.start(chainbase)
1945 if self._generaldelta:
1946 base = rev
1947 else:
1948 base = chainbase
1949 chainlen, compresseddeltalen = self._chaininfo(rev)
1950 chainlen += 1
1951 compresseddeltalen += deltalen
1952 return (dist, deltalen, (header, data), base,
1953 chainbase, chainlen, compresseddeltalen)
1954
1926 def _addrevision(self, node, rawtext, transaction, link, p1, p2, flags, 1955 def _addrevision(self, node, rawtext, transaction, link, p1, p2, flags,
1927 cachedelta, ifh, dfh, alwayscache=False): 1956 cachedelta, ifh, dfh, alwayscache=False):
1928 """internal function to add revisions to the log 1957 """internal function to add revisions to the log
1929 1958
1930 see addrevision for argument descriptions. 1959 see addrevision for argument descriptions.
1946 fh = ifh 1975 fh = ifh
1947 else: 1976 else:
1948 fh = dfh 1977 fh = dfh
1949 1978
1950 btext = [rawtext] 1979 btext = [rawtext]
1951
1952 def builddelta(rev):
1953 # can we use the cached delta?
1954 if cachedelta and cachedelta[0] == rev:
1955 delta = cachedelta[1]
1956 else:
1957 t = self._buildtext(node, p1, p2, btext, cachedelta, fh, flags)
1958 if self.iscensored(rev):
1959 # deltas based on a censored revision must replace the
1960 # full content in one patch, so delta works everywhere
1961 header = mdiff.replacediffheader(self.rawsize(rev), len(t))
1962 delta = header + t
1963 else:
1964 ptext = self.revision(rev, _df=fh, raw=True)
1965 delta = mdiff.textdiff(ptext, t)
1966 header, data = self.compress(delta)
1967 deltalen = len(header) + len(data)
1968 chainbase = self.chainbase(rev)
1969 dist = deltalen + offset - self.start(chainbase)
1970 if self._generaldelta:
1971 base = rev
1972 else:
1973 base = chainbase
1974 chainlen, compresseddeltalen = self._chaininfo(rev)
1975 chainlen += 1
1976 compresseddeltalen += deltalen
1977 return (dist, deltalen, (header, data), base,
1978 chainbase, chainlen, compresseddeltalen)
1979 1980
1980 curr = len(self) 1981 curr = len(self)
1981 prev = curr - 1 1982 prev = curr - 1
1982 offset = self.end(prev) 1983 offset = self.end(prev)
1983 delta = None 1984 delta = None
1992 textlen = len(rawtext) 1993 textlen = len(rawtext)
1993 1994
1994 for candidaterevs in self._getcandidaterevs(p1, p2, cachedelta): 1995 for candidaterevs in self._getcandidaterevs(p1, p2, cachedelta):
1995 nominateddeltas = [] 1996 nominateddeltas = []
1996 for candidaterev in candidaterevs: 1997 for candidaterev in candidaterevs:
1997 candidatedelta = builddelta(candidaterev) 1998 candidatedelta = self._builddelta(node, candidaterev, p1, p2,
1999 btext, cachedelta, fh,
2000 flags)
1998 if self._isgooddelta(candidatedelta, textlen): 2001 if self._isgooddelta(candidatedelta, textlen):
1999 nominateddeltas.append(candidatedelta) 2002 nominateddeltas.append(candidatedelta)
2000 if nominateddeltas: 2003 if nominateddeltas:
2001 delta = min(nominateddeltas, key=lambda x: x[1]) 2004 delta = min(nominateddeltas, key=lambda x: x[1])
2002 break 2005 break