comparison mercurial/changegroup.py @ 38985:d85b0d81112b

changegroup: extract _revisiondeltanormal() to standalone function It wasn't accessing anything important on the cgpacker that warranted it being a method instead of a function. Differential Revision: https://phab.mercurial-scm.org/D4142
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 06 Aug 2018 11:32:16 -0700
parents a3105433ecc4
children 6076053589b9
comparison
equal deleted inserted replaced
38984:a3105433ecc4 38985:d85b0d81112b
552 # changelog, so what we do is we sort the non-changelog histories 552 # changelog, so what we do is we sort the non-changelog histories
553 # by the order in which they are used by the changelog. 553 # by the order in which they are used by the changelog.
554 key = lambda n: clnodetorev[lookup(n)] 554 key = lambda n: clnodetorev[lookup(n)]
555 return [store.rev(n) for n in sorted(nodes, key=key)] 555 return [store.rev(n) for n in sorted(nodes, key=key)]
556 556
557 def _revisiondeltanormal(store, rev, prev, linknode, deltaparentfn):
558 """Construct a revision delta for non-ellipses changegroup generation."""
559 node = store.node(rev)
560 p1, p2 = store.parentrevs(rev)
561 base = deltaparentfn(store, rev, p1, p2, prev)
562
563 prefix = ''
564 if store.iscensored(base) or store.iscensored(rev):
565 try:
566 delta = store.revision(node, raw=True)
567 except error.CensoredNodeError as e:
568 delta = e.tombstone
569 if base == nullrev:
570 prefix = mdiff.trivialdiffheader(len(delta))
571 else:
572 baselen = store.rawsize(base)
573 prefix = mdiff.replacediffheader(baselen, len(delta))
574 elif base == nullrev:
575 delta = store.revision(node, raw=True)
576 prefix = mdiff.trivialdiffheader(len(delta))
577 else:
578 delta = store.revdiff(base, rev)
579 p1n, p2n = store.parents(node)
580
581 return revisiondelta(
582 node=node,
583 p1node=p1n,
584 p2node=p2n,
585 basenode=store.node(base),
586 linknode=linknode,
587 flags=store.flags(rev),
588 deltachunks=(prefix, delta),
589 )
590
557 class cgpacker(object): 591 class cgpacker(object):
558 def __init__(self, repo, filematcher, version, allowreorder, 592 def __init__(self, repo, filematcher, version, allowreorder,
559 deltaparentfn, builddeltaheader, manifestsend, 593 deltaparentfn, builddeltaheader, manifestsend,
560 bundlecaps=None, ellipses=False, 594 bundlecaps=None, ellipses=False,
561 shallow=False, ellipsisroots=None, fullnodes=None): 595 shallow=False, ellipsisroots=None, fullnodes=None):
677 711
678 if self._ellipses: 712 if self._ellipses:
679 delta = self._revisiondeltanarrow(store, ischangelog, 713 delta = self._revisiondeltanarrow(store, ischangelog,
680 curr, prev, linknode) 714 curr, prev, linknode)
681 else: 715 else:
682 delta = self._revisiondeltanormal(store, ischangelog, 716 delta = _revisiondeltanormal(store, curr, prev, linknode,
683 curr, prev, linknode) 717 self._deltaparentfn)
684 718
685 if not delta: 719 if not delta:
686 continue 720 continue
687 721
688 meta = self._builddeltaheader(delta) 722 meta = self._builddeltaheader(delta)
1008 size += len(chunk) 1042 size += len(chunk)
1009 yield chunk 1043 yield chunk
1010 self._verbosenote(_('%8.i %s\n') % (size, fname)) 1044 self._verbosenote(_('%8.i %s\n') % (size, fname))
1011 progress.complete() 1045 progress.complete()
1012 1046
1013 def _revisiondeltanormal(self, store, ischangelog, rev, prev, linknode):
1014 node = store.node(rev)
1015 p1, p2 = store.parentrevs(rev)
1016 base = self._deltaparentfn(store, rev, p1, p2, prev)
1017
1018 prefix = ''
1019 if store.iscensored(base) or store.iscensored(rev):
1020 try:
1021 delta = store.revision(node, raw=True)
1022 except error.CensoredNodeError as e:
1023 delta = e.tombstone
1024 if base == nullrev:
1025 prefix = mdiff.trivialdiffheader(len(delta))
1026 else:
1027 baselen = store.rawsize(base)
1028 prefix = mdiff.replacediffheader(baselen, len(delta))
1029 elif base == nullrev:
1030 delta = store.revision(node, raw=True)
1031 prefix = mdiff.trivialdiffheader(len(delta))
1032 else:
1033 delta = store.revdiff(base, rev)
1034 p1n, p2n = store.parents(node)
1035
1036 return revisiondelta(
1037 node=node,
1038 p1node=p1n,
1039 p2node=p2n,
1040 basenode=store.node(base),
1041 linknode=linknode,
1042 flags=store.flags(rev),
1043 deltachunks=(prefix, delta),
1044 )
1045
1046 def _revisiondeltanarrow(self, store, ischangelog, rev, prev, linknode): 1047 def _revisiondeltanarrow(self, store, ischangelog, rev, prev, linknode):
1047 # build up some mapping information that's useful later. See 1048 # build up some mapping information that's useful later. See
1048 # the local() nested function below. 1049 # the local() nested function below.
1049 if ischangelog: 1050 if ischangelog:
1050 self._clnodetorev[linknode] = rev 1051 self._clnodetorev[linknode] = rev
1055 self._clrevtolocalrev[linkrev] = rev 1056 self._clrevtolocalrev[linkrev] = rev
1056 1057
1057 # This is a node to send in full, because the changeset it 1058 # This is a node to send in full, because the changeset it
1058 # corresponds to was a full changeset. 1059 # corresponds to was a full changeset.
1059 if linknode in self._fullnodes: 1060 if linknode in self._fullnodes:
1060 return self._revisiondeltanormal(store, ischangelog, rev, prev, 1061 return _revisiondeltanormal(store, rev, prev, linknode,
1061 linknode) 1062 self._deltaparentfn)
1062 1063
1063 # At this point, a node can either be one we should skip or an 1064 # At this point, a node can either be one we should skip or an
1064 # ellipsis. If it's not an ellipsis, bail immediately. 1065 # ellipsis. If it's not an ellipsis, bail immediately.
1065 if linkrev not in self._precomputedellipsis: 1066 if linkrev not in self._precomputedellipsis:
1066 return 1067 return