518 flags = attr.ib() |
518 flags = attr.ib() |
519 # Iterable of chunks holding raw delta data. |
519 # Iterable of chunks holding raw delta data. |
520 deltachunks = attr.ib() |
520 deltachunks = attr.ib() |
521 |
521 |
522 class cg1packer(object): |
522 class cg1packer(object): |
523 def __init__(self, repo, filematcher, version, builddeltaheader, |
523 def __init__(self, repo, filematcher, version, allowreorder, |
524 manifestsend, sendtreemanifests, |
524 builddeltaheader, manifestsend, sendtreemanifests, |
525 bundlecaps=None): |
525 bundlecaps=None): |
526 """Given a source repo, construct a bundler. |
526 """Given a source repo, construct a bundler. |
527 |
527 |
528 filematcher is a matcher that matches on files to include in the |
528 filematcher is a matcher that matches on files to include in the |
529 changegroup. Used to facilitate sparse changegroups. |
529 changegroup. Used to facilitate sparse changegroups. |
|
530 |
|
531 allowreorder controls whether reordering of revisions is allowed. |
|
532 This value is used when ``bundle.reorder`` is ``auto`` or isn't |
|
533 set. |
530 |
534 |
531 builddeltaheader is a callable that constructs the header for a group |
535 builddeltaheader is a callable that constructs the header for a group |
532 delta. |
536 delta. |
533 |
537 |
534 manifestsend is a chunk to send after manifests have been fully emitted. |
538 manifestsend is a chunk to send after manifests have been fully emitted. |
550 |
554 |
551 # Set of capabilities we can use to build the bundle. |
555 # Set of capabilities we can use to build the bundle. |
552 if bundlecaps is None: |
556 if bundlecaps is None: |
553 bundlecaps = set() |
557 bundlecaps = set() |
554 self._bundlecaps = bundlecaps |
558 self._bundlecaps = bundlecaps |
|
559 |
555 # experimental config: bundle.reorder |
560 # experimental config: bundle.reorder |
556 reorder = repo.ui.config('bundle', 'reorder') |
561 reorder = repo.ui.config('bundle', 'reorder') |
557 if reorder == 'auto': |
562 if reorder == 'auto': |
558 reorder = None |
563 self._reorder = allowreorder |
559 else: |
564 else: |
560 reorder = stringutil.parsebool(reorder) |
565 self._reorder = stringutil.parsebool(reorder) |
|
566 |
561 self._repo = repo |
567 self._repo = repo |
562 self._reorder = reorder |
568 |
563 if self._repo.ui.verbose and not self._repo.ui.debugflag: |
569 if self._repo.ui.verbose and not self._repo.ui.debugflag: |
564 self._verbosenote = self._repo.ui.note |
570 self._verbosenote = self._repo.ui.note |
565 else: |
571 else: |
566 self._verbosenote = lambda s: None |
572 self._verbosenote = lambda s: None |
567 |
573 |
1118 flags=flags, |
1124 flags=flags, |
1119 deltachunks=(diffheader, data), |
1125 deltachunks=(diffheader, data), |
1120 ) |
1126 ) |
1121 |
1127 |
1122 class cg2packer(cg1packer): |
1128 class cg2packer(cg1packer): |
1123 def __init__(self, repo, filematcher, version, builddeltaheader, |
|
1124 manifestsend, sendtreemanifests, bundlecaps=None): |
|
1125 super(cg2packer, self).__init__(repo, filematcher, version, |
|
1126 builddeltaheader, manifestsend, |
|
1127 sendtreemanifests, |
|
1128 bundlecaps=bundlecaps) |
|
1129 |
|
1130 if self._reorder is None: |
|
1131 # Since generaldelta is directly supported by cg2, reordering |
|
1132 # generally doesn't help, so we disable it by default (treating |
|
1133 # bundle.reorder=auto just like bundle.reorder=False). |
|
1134 self._reorder = False |
|
1135 |
|
1136 def deltaparent(self, store, rev, p1, p2, prev): |
1129 def deltaparent(self, store, rev, p1, p2, prev): |
1137 # Narrow ellipses mode. |
1130 # Narrow ellipses mode. |
1138 if util.safehasattr(self, 'full_nodes'): |
1131 if util.safehasattr(self, 'full_nodes'): |
1139 # TODO: send better deltas when in narrow mode. |
1132 # TODO: send better deltas when in narrow mode. |
1140 # |
1133 # |
1174 |
1167 |
1175 def _makecg1packer(repo, filematcher, bundlecaps): |
1168 def _makecg1packer(repo, filematcher, bundlecaps): |
1176 builddeltaheader = lambda d: _CHANGEGROUPV1_DELTA_HEADER.pack( |
1169 builddeltaheader = lambda d: _CHANGEGROUPV1_DELTA_HEADER.pack( |
1177 d.node, d.p1node, d.p2node, d.linknode) |
1170 d.node, d.p1node, d.p2node, d.linknode) |
1178 |
1171 |
1179 return cg1packer(repo, filematcher, b'01', builddeltaheader, |
1172 return cg1packer(repo, filematcher, b'01', allowreorder=None, |
|
1173 builddeltaheader=builddeltaheader, |
1180 manifestsend=b'', sendtreemanifests=False, |
1174 manifestsend=b'', sendtreemanifests=False, |
1181 bundlecaps=bundlecaps) |
1175 bundlecaps=bundlecaps) |
1182 |
1176 |
1183 def _makecg2packer(repo, filematcher, bundlecaps): |
1177 def _makecg2packer(repo, filematcher, bundlecaps): |
1184 builddeltaheader = lambda d: _CHANGEGROUPV2_DELTA_HEADER.pack( |
1178 builddeltaheader = lambda d: _CHANGEGROUPV2_DELTA_HEADER.pack( |
1185 d.node, d.p1node, d.p2node, d.basenode, d.linknode) |
1179 d.node, d.p1node, d.p2node, d.basenode, d.linknode) |
1186 |
1180 |
1187 return cg2packer(repo, filematcher, b'02', builddeltaheader, |
1181 # Since generaldelta is directly supported by cg2, reordering |
|
1182 # generally doesn't help, so we disable it by default (treating |
|
1183 # bundle.reorder=auto just like bundle.reorder=False). |
|
1184 return cg2packer(repo, filematcher, b'02', allowreorder=False, |
|
1185 builddeltaheader=builddeltaheader, |
1188 manifestsend=b'', sendtreemanifests=False, |
1186 manifestsend=b'', sendtreemanifests=False, |
1189 bundlecaps=bundlecaps) |
1187 bundlecaps=bundlecaps) |
1190 |
1188 |
1191 def _makecg3packer(repo, filematcher, bundlecaps): |
1189 def _makecg3packer(repo, filematcher, bundlecaps): |
1192 builddeltaheader = lambda d: _CHANGEGROUPV3_DELTA_HEADER.pack( |
1190 builddeltaheader = lambda d: _CHANGEGROUPV3_DELTA_HEADER.pack( |
1193 d.node, d.p1node, d.p2node, d.basenode, d.linknode, d.flags) |
1191 d.node, d.p1node, d.p2node, d.basenode, d.linknode, d.flags) |
1194 |
1192 |
1195 return cg2packer(repo, filematcher, b'03', builddeltaheader, |
1193 return cg2packer(repo, filematcher, b'03', allowreorder=False, |
|
1194 builddeltaheader=builddeltaheader, |
1196 manifestsend=closechunk(), sendtreemanifests=True, |
1195 manifestsend=closechunk(), sendtreemanifests=True, |
1197 bundlecaps=bundlecaps) |
1196 bundlecaps=bundlecaps) |
1198 |
1197 |
1199 _packermap = {'01': (_makecg1packer, cg1unpacker), |
1198 _packermap = {'01': (_makecg1packer, cg1unpacker), |
1200 # cg2 adds support for exchanging generaldelta |
1199 # cg2 adds support for exchanging generaldelta |