Mercurial > public > mercurial-scm > hg
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 |