Show More
@@ -438,6 +438,34 b' def segmentspan(revlog, revs, deltainfo=' | |||
|
438 | 438 | end = revlog.end(revs[-1]) |
|
439 | 439 | return end - revlog.start(revs[0]) |
|
440 | 440 | |
|
441 | def _textfromdelta(fh, revlog, baserev, delta, p1, p2, flags, expectednode): | |
|
442 | """build full text from a (base, delta) pair and other metadata""" | |
|
443 | # special case deltas which replace entire base; no need to decode | |
|
444 | # base revision. this neatly avoids censored bases, which throw when | |
|
445 | # they're decoded. | |
|
446 | hlen = struct.calcsize(">lll") | |
|
447 | if delta[:hlen] == mdiff.replacediffheader(revlog.rawsize(baserev), | |
|
448 | len(delta) - hlen): | |
|
449 | fulltext = delta[hlen:] | |
|
450 | else: | |
|
451 | # deltabase is rawtext before changed by flag processors, which is | |
|
452 | # equivalent to non-raw text | |
|
453 | basetext = revlog.revision(baserev, _df=fh, raw=False) | |
|
454 | fulltext = mdiff.patch(basetext, delta) | |
|
455 | ||
|
456 | try: | |
|
457 | res = revlog._processflags(fulltext, flags, 'read', raw=True) | |
|
458 | fulltext, validatehash = res | |
|
459 | if validatehash: | |
|
460 | revlog.checkhash(fulltext, expectednode, p1=p1, p2=p2) | |
|
461 | if flags & REVIDX_ISCENSORED: | |
|
462 | raise RevlogError(_('node %s is not censored') % expectednode) | |
|
463 | except CensoredNodeError: | |
|
464 | # must pass the censored index flag to add censored revisions | |
|
465 | if not flags & REVIDX_ISCENSORED: | |
|
466 | raise | |
|
467 | return fulltext | |
|
468 | ||
|
441 | 469 | @attr.s(slots=True, frozen=True) |
|
442 | 470 | class _deltainfo(object): |
|
443 | 471 | distance = attr.ib() |
@@ -605,36 +633,13 b' class deltacomputer(object):' | |||
|
605 | 633 | |
|
606 | 634 | revlog = self.revlog |
|
607 | 635 | cachedelta = revinfo.cachedelta |
|
608 | flags = revinfo.flags | |
|
609 | node = revinfo.node | |
|
610 | ||
|
611 | 636 | baserev = cachedelta[0] |
|
612 | 637 | delta = cachedelta[1] |
|
613 | # special case deltas which replace entire base; no need to decode | |
|
614 | # base revision. this neatly avoids censored bases, which throw when | |
|
615 | # they're decoded. | |
|
616 | hlen = struct.calcsize(">lll") | |
|
617 | if delta[:hlen] == mdiff.replacediffheader(revlog.rawsize(baserev), | |
|
618 | len(delta) - hlen): | |
|
619 | btext[0] = delta[hlen:] | |
|
620 | else: | |
|
621 | # deltabase is rawtext before changed by flag processors, which is | |
|
622 | # equivalent to non-raw text | |
|
623 | basetext = revlog.revision(baserev, _df=fh, raw=False) | |
|
624 | btext[0] = mdiff.patch(basetext, delta) | |
|
625 | 638 | |
|
626 | try: | |
|
627 | res = revlog._processflags(btext[0], flags, 'read', raw=True) | |
|
628 | btext[0], validatehash = res | |
|
629 | if validatehash: | |
|
630 | revlog.checkhash(btext[0], node, p1=revinfo.p1, p2=revinfo.p2) | |
|
631 | if flags & REVIDX_ISCENSORED: | |
|
632 | raise RevlogError(_('node %s is not censored') % node) | |
|
633 | except CensoredNodeError: | |
|
634 | # must pass the censored index flag to add censored revisions | |
|
635 | if not flags & REVIDX_ISCENSORED: | |
|
636 | raise | |
|
637 | return btext[0] | |
|
639 | fulltext = btext[0] = _textfromdelta(fh, revlog, baserev, delta, | |
|
640 | revinfo.p1, revinfo.p2, | |
|
641 | revinfo.flags, revinfo.node) | |
|
642 | return fulltext | |
|
638 | 643 | |
|
639 | 644 | def _builddeltadiff(self, base, revinfo, fh): |
|
640 | 645 | revlog = self.revlog |
General Comments 0
You need to be logged in to leave comments.
Login now