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 |