Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/bundlerepo.py @ 50239: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
50238:21f876895dfe | 50239: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 |