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: