comparison mercurial/bundlerepo.py @ 50200:197204dba8a2

bundlerepo: apply phase data stored in the bundle instead of assuming `draft` The phase information contained in the changegroup part and the explicit `phase-heads` part are now taken in account. Initial changes and test by Matt Harbison, code rework by Pierre-Yves David.
author Matt Harbison <matt_harbison@yahoo.com>, Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 23 Feb 2023 23:05:51 +0100
parents 21f876895dfe
children 149f09ffef46
comparison
equal deleted inserted replaced
50199:21f876895dfe 50200:197204dba8a2
300 if isinstance(bundle, bundle2.unbundle20): 300 if isinstance(bundle, bundle2.unbundle20):
301 self._bundlefile = bundle 301 self._bundlefile = bundle
302 302
303 cgpart = None 303 cgpart = None
304 for part in bundle.iterparts(seekable=True): 304 for part in bundle.iterparts(seekable=True):
305 if part.type == b'changegroup': 305 if part.type == b'phase-heads':
306 self._handle_bundle2_phase_part(bundle, part)
307 elif part.type == b'changegroup':
306 if cgpart: 308 if cgpart:
307 raise NotImplementedError( 309 raise NotImplementedError(
308 b"can't process multiple changegroups" 310 b"can't process multiple changegroups"
309 ) 311 )
310 cgpart = part 312 cgpart = part
344 ) 346 )
345 347
346 def _handle_bundle2_cg_part(self, bundle, part): 348 def _handle_bundle2_cg_part(self, bundle, part):
347 assert part.type == b'changegroup' 349 assert part.type == b'changegroup'
348 cgstream = part 350 cgstream = part
351 targetphase = part.params.get(b'targetphase')
352 try:
353 targetphase = int(targetphase)
354 except TypeError:
355 pass
356 if targetphase is None:
357 targetphase = phases.draft
358 if targetphase not in phases.allphases:
359 m = _(b'unsupported targetphase: %d')
360 m %= targetphase
361 raise error.Abort(m)
349 version = part.params.get(b'version', b'01') 362 version = part.params.get(b'version', b'01')
350 legalcgvers = changegroup.supportedincomingversions(self) 363 legalcgvers = changegroup.supportedincomingversions(self)
351 if version not in legalcgvers: 364 if version not in legalcgvers:
352 msg = _(b'Unsupported changegroup version: %s') 365 msg = _(b'Unsupported changegroup version: %s')
353 raise error.Abort(msg % version) 366 raise error.Abort(msg % version)
358 371
359 self.firstnewrev = self.changelog.repotiprev + 1 372 self.firstnewrev = self.changelog.repotiprev + 1
360 phases.retractboundary( 373 phases.retractboundary(
361 self, 374 self,
362 None, 375 None,
363 phases.draft, 376 targetphase,
364 [ctx.node() for ctx in self[self.firstnewrev :]], 377 [ctx.node() for ctx in self[self.firstnewrev :]],
365 ) 378 )
379
380 def _handle_bundle2_phase_part(self, bundle, part):
381 assert part.type == b'phase-heads'
382
383 unfi = self.unfiltered()
384 headsbyphase = phases.binarydecode(part)
385 phases.updatephases(unfi, lambda: None, headsbyphase)
366 386
367 def _writetempbundle(self, readfn, suffix, header=b''): 387 def _writetempbundle(self, readfn, suffix, header=b''):
368 """Write a temporary file to disk""" 388 """Write a temporary file to disk"""
369 fdtemp, temp = self.vfs.mkstemp(prefix=b"hg-bundle-", suffix=suffix) 389 fdtemp, temp = self.vfs.mkstemp(prefix=b"hg-bundle-", suffix=suffix)
370 self.tempfile = temp 390 self.tempfile = temp