diff -r 21f876895dfe -r 197204dba8a2 mercurial/bundlerepo.py --- a/mercurial/bundlerepo.py Thu Feb 23 19:07:58 2023 +0100 +++ b/mercurial/bundlerepo.py Thu Feb 23 23:05:51 2023 +0100 @@ -302,7 +302,9 @@ cgpart = None for part in bundle.iterparts(seekable=True): - if part.type == b'changegroup': + if part.type == b'phase-heads': + self._handle_bundle2_phase_part(bundle, part) + elif part.type == b'changegroup': if cgpart: raise NotImplementedError( b"can't process multiple changegroups" @@ -346,6 +348,17 @@ def _handle_bundle2_cg_part(self, bundle, part): assert part.type == b'changegroup' cgstream = part + targetphase = part.params.get(b'targetphase') + try: + targetphase = int(targetphase) + except TypeError: + pass + if targetphase is None: + targetphase = phases.draft + if targetphase not in phases.allphases: + m = _(b'unsupported targetphase: %d') + m %= targetphase + raise error.Abort(m) version = part.params.get(b'version', b'01') legalcgvers = changegroup.supportedincomingversions(self) if version not in legalcgvers: @@ -360,10 +373,17 @@ phases.retractboundary( self, None, - phases.draft, + targetphase, [ctx.node() for ctx in self[self.firstnewrev :]], ) + def _handle_bundle2_phase_part(self, bundle, part): + assert part.type == b'phase-heads' + + unfi = self.unfiltered() + headsbyphase = phases.binarydecode(part) + phases.updatephases(unfi, lambda: None, headsbyphase) + def _writetempbundle(self, readfn, suffix, header=b''): """Write a temporary file to disk""" fdtemp, temp = self.vfs.mkstemp(prefix=b"hg-bundle-", suffix=suffix)