# HG changeset patch # User Pierre-Yves David # Date 1678417450 -3600 # Node ID f95ab2c5330340639c9e568f36cdd51d3e3786b0 # Parent 385a4f8056e54e71f5f9da7cb7c0d96c477e170e outgoing: fix common-heads computation from `missingroots` argument When initializing a `outgoing` object, the `common set` can be defined explicitly (with the `commonheads` argument`) or implicitly (with the missingroots arguments). It turns out the logic to compute `commonheads` from `missingroots` is buggy, as it does not consider the parents of enough changesets. Previously, it only considered parents of "missingroots` items, while it need to consider all parents of missing. Here is an example: F |\ C E | | B D |/ A If we use [E] as missing-roots, the missing set is [E, F], and the common-heads are [C, D]. However you cannot only consider the parent of [E] to find them, as [C] is not a parent of [E]. This already fix the bundle generated in one test, and it would prevent many other to misbehave with future change from this series. diff -r 385a4f8056e5 -r f95ab2c53303 mercurial/discovery.py --- a/mercurial/discovery.py Thu Mar 09 01:26:04 2023 +0100 +++ b/mercurial/discovery.py Fri Mar 10 04:04:10 2023 +0100 @@ -104,14 +104,14 @@ if ancestorsof is None: ancestorsof = cl.heads() if missingroots: - discbases = [] - for n in missingroots: - discbases.extend([p for p in cl.parents(n) if p != repo.nullid]) # TODO remove call to nodesbetween. # TODO populate attributes on outgoing instance instead of setting # discbases. csets, roots, heads = cl.nodesbetween(missingroots, ancestorsof) included = set(csets) + discbases = [] + for n in csets: + discbases.extend([p for p in cl.parents(n) if p != repo.nullid]) ancestorsof = heads commonheads = [n for n in discbases if n not in included] elif not commonheads: diff -r 385a4f8056e5 -r f95ab2c53303 tests/test-rebase-conflicts.t --- a/tests/test-rebase-conflicts.t Thu Mar 09 01:26:04 2023 +0100 +++ b/tests/test-rebase-conflicts.t Fri Mar 10 04:04:10 2023 +0100 @@ -296,9 +296,8 @@ bundle2-output-part: "cache:rev-branch-cache" (advisory) streamed payload bundle2-output-part: "phase-heads" 24 bytes payload saved backup bundle to $TESTTMP/issue4041/.hg/strip-backup/e31216eec445-15f7a814-rebase.hg - 3 changesets found + 2 changesets found list of changesets: - 4c9fbe56a16f30c0d5dcc40ec1a97bbe3325209c 19c888675e133ab5dff84516926a65672eaf04d9 c1ffa3b5274e92a9388fe782854e295d2e8d0443 bundle2-output-bundle: "HG20", 3 parts total @@ -309,15 +308,14 @@ bundle2-input-bundle: with-transaction bundle2-input-part: "changegroup" (params: 1 mandatory 1 advisory) supported adding changesets - add changeset 4c9fbe56a16f add changeset 19c888675e13 add changeset c1ffa3b5274e adding manifests adding file changes adding f1.txt revisions - bundle2-input-part: total payload size 1761 + bundle2-input-part: total payload size 1255 bundle2-input-part: "cache:rev-branch-cache" (advisory) supported - bundle2-input-part: total payload size 74 + bundle2-input-part: total payload size 54 bundle2-input-part: "phase-heads" supported bundle2-input-part: total payload size 24 bundle2-input-bundle: 3 parts total