##// END OF EJS Templates
changegroup: differentiate between fulltext and diff based deltas...
Gregory Szorc -
r39052:39b8277e default
parent child Browse files
Show More
@@ -507,6 +507,8 b' class revisiondelta(object):'
507 507
508 508 Captured data is sufficient to serialize the delta into multiple
509 509 formats.
510
511 ``revision`` and ``delta`` are mutually exclusive.
510 512 """
511 513 # 20 byte node of this revision.
512 514 node = attr.ib()
@@ -519,17 +521,40 b' class revisiondelta(object):'
519 521 linknode = attr.ib()
520 522 # 2 bytes of flags to apply to revision data.
521 523 flags = attr.ib()
522 # Iterable of chunks holding raw delta data.
523 deltachunks = attr.ib()
524 # Size of base revision this delta is against. May be None if
525 # basenode is nullid.
526 baserevisionsize = attr.ib()
527 # Raw fulltext revision data.
528 revision = attr.ib()
529 # Delta between the basenode and node.
530 delta = attr.ib()
524 531
525 532 def _revisiondeltatochunks(delta, headerfn):
526 533 """Serialize a revisiondelta to changegroup chunks."""
534
535 # The captured revision delta may be encoded as a delta against
536 # a base revision or as a full revision. The changegroup format
537 # requires that everything on the wire be deltas. So for full
538 # revisions, we need to invent a header that says to rewrite
539 # data.
540
541 if delta.delta is not None:
542 prefix, data = b'', delta.delta
543 elif delta.basenode == nullid:
544 data = delta.revision
545 prefix = mdiff.trivialdiffheader(len(data))
546 else:
547 data = delta.revision
548 prefix = mdiff.replacediffheader(delta.baserevisionsize,
549 len(data))
550
527 551 meta = headerfn(delta)
528 l = len(meta) + sum(len(x) for x in delta.deltachunks)
529 yield chunkheader(l)
552
553 yield chunkheader(len(meta) + len(prefix) + len(data))
530 554 yield meta
531 for x in delta.deltachunks:
532 yield x
555 if prefix:
556 yield prefix
557 yield data
533 558
534 559 def _sortnodesnormal(store, nodes, reorder):
535 560 """Sort nodes for changegroup generation and turn into revnums."""
@@ -568,22 +593,24 b' def _revisiondeltanormal(store, rev, pre'
568 593 p1, p2 = store.parentrevs(rev)
569 594 base = deltaparentfn(store, rev, p1, p2, prev)
570 595
571 prefix = ''
596 revision = None
597 delta = None
598 baserevisionsize = None
599
572 600 if store.iscensored(base) or store.iscensored(rev):
573 601 try:
574 delta = store.revision(node, raw=True)
602 revision = store.revision(node, raw=True)
575 603 except error.CensoredNodeError as e:
576 delta = e.tombstone
577 if base == nullrev:
578 prefix = mdiff.trivialdiffheader(len(delta))
579 else:
580 baselen = store.rawsize(base)
581 prefix = mdiff.replacediffheader(baselen, len(delta))
604 revision = e.tombstone
605
606 if base != nullrev:
607 baserevisionsize = store.rawsize(base)
608
582 609 elif base == nullrev:
583 delta = store.revision(node, raw=True)
584 prefix = mdiff.trivialdiffheader(len(delta))
610 revision = store.revision(node, raw=True)
585 611 else:
586 612 delta = store.revdiff(base, rev)
613
587 614 p1n, p2n = store.parents(node)
588 615
589 616 return revisiondelta(
@@ -593,7 +620,9 b' def _revisiondeltanormal(store, rev, pre'
593 620 basenode=store.node(base),
594 621 linknode=linknode,
595 622 flags=store.flags(rev),
596 deltachunks=(prefix, delta),
623 baserevisionsize=baserevisionsize,
624 revision=revision,
625 delta=delta,
597 626 )
598 627
599 628 def _revisiondeltanarrow(cl, store, ischangelog, rev, linkrev,
@@ -677,8 +706,6 b' def _revisiondeltanarrow(cl, store, isch'
677 706 flags |= revlog.REVIDX_ELLIPSIS
678 707
679 708 # TODO: try and actually send deltas for ellipsis data blocks
680 data = store.revision(n)
681 diffheader = mdiff.trivialdiffheader(len(data))
682 709
683 710 return revisiondelta(
684 711 node=n,
@@ -687,7 +714,9 b' def _revisiondeltanarrow(cl, store, isch'
687 714 basenode=nullid,
688 715 linknode=linknode,
689 716 flags=flags,
690 deltachunks=(diffheader, data),
717 baserevisionsize=None,
718 revision=store.revision(n),
719 delta=None,
691 720 )
692 721
693 722 def deltagroup(repo, revs, store, ischangelog, lookup, deltaparentfn,
General Comments 0
You need to be logged in to leave comments. Login now