Mercurial > hg-stable
changeset 50426:385a4f8056e5
bundle: include required phases when saving a bundle (issue6794)
We now properly computes and includes phases above secret in bundle,
previously, they would be skipped, and then the code computing them would
crash.
Note that from this changeset, we also include the heads associated with the
changegroup's "target" phase. This turned out to be necessary to ensure the
movement of changeset included in the bundle, but already known locally.
This explain why lines for "secret" heads appears in multiple tests.
author | Jason R. Coombs <jaraco@jaraco.com>, Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Thu, 09 Mar 2023 01:26:04 +0100 |
parents | c8a91b0d1077 |
children | f95ab2c53303 |
files | mercurial/bundle2.py mercurial/phases.py tests/test-bundle-phases.t tests/test-bundle-type.t tests/test-phase-archived.t |
diffstat | 5 files changed, 19 insertions(+), 14 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/bundle2.py Wed Mar 08 17:33:33 2023 +0100 +++ b/mercurial/bundle2.py Thu Mar 09 01:26:04 2023 +0100 @@ -1750,12 +1750,16 @@ part.addparam( b'nbchanges', b'%d' % cg.extras[b'clcount'], mandatory=False ) - if opts.get(b'phases') and repo.revs( - b'%ln and secret()', outgoing.ancestorsof - ): - part.addparam( - b'targetphase', b'%d' % phases.secret, mandatory=False - ) + if opts.get(b'phases'): + target_phase = phases.draft + for head in outgoing.ancestorsof: + target_phase = max(target_phase, repo[head].phase()) + if target_phase > phases.draft: + part.addparam( + b'targetphase', + b'%d' % target_phase, + mandatory=False, + ) if repository.REPO_FEATURE_SIDE_DATA in repo.features: part.addparam(b'exp-sidedata', b'1')
--- a/mercurial/phases.py Wed Mar 08 17:33:33 2023 +0100 +++ b/mercurial/phases.py Thu Mar 09 01:26:04 2023 +0100 @@ -827,10 +827,8 @@ cl = repo.changelog headsbyphase = {i: [] for i in allphases} - # No need to keep track of secret phase; any heads in the subset that - # are not mentioned are implicitly secret. - for phase in allphases[:secret]: - revset = b"heads(%%ln & %s())" % phasenames[phase] + for phase in allphases: + revset = b"heads(%%ln & _phase(%d))" % phase headsbyphase[phase] = [cl.node(r) for r in repo.revs(revset, subset)] return headsbyphase
--- a/tests/test-bundle-phases.t Wed Mar 08 17:33:33 2023 +0100 +++ b/tests/test-bundle-phases.t Thu Mar 09 01:26:04 2023 +0100 @@ -44,6 +44,7 @@ cache:rev-branch-cache -- {} (mandatory: False) phase-heads -- {} (mandatory: True) 26805aba1e600a82e93661149f2313866a221a7b draft + 9bc730a19041f9ec7cb33c626e811aa233efb18c secret $ hg strip --no-backup C Phases show on incoming, and are also restored when pulling. Secret commits @@ -374,6 +375,7 @@ phase-heads -- {} (mandatory: True) dc0947a82db884575bb76ea10ac97b08536bfa03 public 03ca77807e919db8807c3749086dc36fb478cac0 draft + 4e4f9194f9f181c57f62e823e8bdfa46ab9e4ff4 secret $ hg strip --no-backup A $ hg unbundle -q bundle $ rm bundle @@ -398,6 +400,7 @@ 4e4f9194f9f181c57f62e823e8bdfa46ab9e4ff4 cache:rev-branch-cache -- {} (mandatory: False) phase-heads -- {} (mandatory: True) + 4e4f9194f9f181c57f62e823e8bdfa46ab9e4ff4 secret $ rm bundle $ hg bundle --base A -r D bundle @@ -411,6 +414,7 @@ cache:rev-branch-cache -- {} (mandatory: False) phase-heads -- {} (mandatory: True) dc0947a82db884575bb76ea10ac97b08536bfa03 public + 4e4f9194f9f181c57f62e823e8bdfa46ab9e4ff4 secret $ rm bundle $ hg bundle --base 'B + C' -r 'D + E' bundle @@ -423,4 +427,5 @@ cache:rev-branch-cache -- {} (mandatory: False) phase-heads -- {} (mandatory: True) 03ca77807e919db8807c3749086dc36fb478cac0 draft + 4e4f9194f9f181c57f62e823e8bdfa46ab9e4ff4 secret $ rm bundle
--- a/tests/test-bundle-type.t Wed Mar 08 17:33:33 2023 +0100 +++ b/tests/test-bundle-type.t Thu Mar 09 01:26:04 2023 +0100 @@ -383,6 +383,7 @@ 66e2c4b43e0cf8f0bdff0733a0b97ce57874e35d public a8c3a1ed30eb71f03f476c5fa7ead831ef991a55 draft 2ea90778052ba7558fab36e3fd5d149512ff986b draft + b9f5f740a8cd76700020e3903ee55ecff78bd3e5 secret bzip2-v2;cg.version=03 adding changesets
--- a/tests/test-phase-archived.t Wed Mar 08 17:33:33 2023 +0100 +++ b/tests/test-phase-archived.t Thu Mar 09 01:26:04 2023 +0100 @@ -181,8 +181,6 @@ The archived changeset should still be hidden $ hg log -G -T '{rev} {node|short} [{phase}] {desc|firstline}\n' - o 2 f90bf4e57854 [draft] some more commit (known-bad-output !) - | (known-bad-output !) @ 1 d1e73e428f29 [draft] unbundletesting | o 0 c1863a3840c6 [draft] root @@ -191,8 +189,7 @@ It may still be around: $ hg log --hidden -G -T '{rev} {node|short} [{phase}] {desc|firstline}\n' - o 2 f90bf4e57854 [draft] some more commit (known-bad-output !) - o 2 f90bf4e57854 [archived] some more commit (missing-correct-output !) + o 2 f90bf4e57854 [archived] some more commit | @ 1 d1e73e428f29 [draft] unbundletesting |