mercurial/changegroup.py
changeset 38900 6e999a2d8fe7
parent 38899 7a154778fb46
child 38901 23ae0c07a3e1
equal deleted inserted replaced
38899:7a154778fb46 38900:6e999a2d8fe7
   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