Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 36748:369aadf7a326 stable 4.5.1
revlog: resolve lfs rawtext to vanilla rawtext before applying delta
This happens when a LFS delta base gets a non-LFS delta from another client.
In that case, the LFS delta base needs to be converted to non-LFS version
before applying the delta.
Differential Revision: https://phab.mercurial-scm.org/D2069
author | Jun Wu <quark@fb.com> |
---|---|
date | Tue, 13 Feb 2018 11:35:32 -0800 |
parents | 33275ab5e837 |
children | 7bf80d9d9543 |
comparison
equal
deleted
inserted
replaced
36744:33275ab5e837 | 36748:369aadf7a326 |
---|---|
334 hlen = struct.calcsize(">lll") | 334 hlen = struct.calcsize(">lll") |
335 if delta[:hlen] == mdiff.replacediffheader(revlog.rawsize(baserev), | 335 if delta[:hlen] == mdiff.replacediffheader(revlog.rawsize(baserev), |
336 len(delta) - hlen): | 336 len(delta) - hlen): |
337 btext[0] = delta[hlen:] | 337 btext[0] = delta[hlen:] |
338 else: | 338 else: |
339 basetext = revlog.revision(baserev, _df=fh, raw=True) | 339 # deltabase is rawtext before changed by flag processors, which is |
340 # equivalent to non-raw text | |
341 basetext = revlog.revision(baserev, _df=fh, raw=False) | |
340 btext[0] = mdiff.patch(basetext, delta) | 342 btext[0] = mdiff.patch(basetext, delta) |
341 | 343 |
342 try: | 344 try: |
343 res = revlog._processflags(btext[0], flags, 'read', raw=True) | 345 res = revlog._processflags(btext[0], flags, 'read', raw=True) |
344 btext[0], validatehash = res | 346 btext[0], validatehash = res |
2082 p1r, p2r = self.rev(p1), self.rev(p2) | 2084 p1r, p2r = self.rev(p1), self.rev(p2) |
2083 | 2085 |
2084 # full versions are inserted when the needed deltas | 2086 # full versions are inserted when the needed deltas |
2085 # become comparable to the uncompressed text | 2087 # become comparable to the uncompressed text |
2086 if rawtext is None: | 2088 if rawtext is None: |
2087 textlen = mdiff.patchedsize(self.rawsize(cachedelta[0]), | 2089 # need rawtext size, before changed by flag processors, which is |
2090 # the non-raw size. use revlog explicitly to avoid filelog's extra | |
2091 # logic that might remove metadata size. | |
2092 textlen = mdiff.patchedsize(revlog.size(self, cachedelta[0]), | |
2088 cachedelta[1]) | 2093 cachedelta[1]) |
2089 else: | 2094 else: |
2090 textlen = len(rawtext) | 2095 textlen = len(rawtext) |
2091 | 2096 |
2092 if deltacomputer is None: | 2097 if deltacomputer is None: |