From e9279ce3c209638aa5422614eb98616f1b8019c1 Mon Sep 17 00:00:00 2001 From: jochen Date: Mon, 26 Oct 2026 12:32:46 +0100 Subject: [PATCH] =?UTF-8?q?gate:=20find=20an=20approved=20merge=20by=20its?= =?UTF-8?q?=20ask,=20not=20by=20which=20member's=20run=20was=20seen=20firs?= =?UTF-8?q?t,=20so=20a=20group's=20turns=20are=20written=20before=20its=20?= =?UTF-8?q?first=20member=20is=20handed=20at=20every=20look=20(ADR=200548?= =?UTF-8?q?=20=C2=A73;=20issue=20568,=20review=20round=201)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmd/mesh-delivery-gate/turns.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/turns.go b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/turns.go index 600adc58..72b3ab85 100644 --- a/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/turns.go +++ b/modules/mesh-delivery-gate/cmd/mesh-delivery-gate/turns.go @@ -102,7 +102,13 @@ type approvedMerge struct { func (h *Holder) approvedMerges() []approvedMerge { var out []approvedMerge seen := map[string]bool{} - for _, d := range h.deliveries { + ids := make([]string, 0, len(h.deliveries)) + for id := range h.deliveries { + ids = append(ids, id) + } + sort.Strings(ids) // the same owner of an ask at every look, whichever member's run holds it + for _, id := range ids { + d := h.deliveries[id] r := d.Ready if r == nil || r.Approved == nil || r.Declined != nil || r.AskID == "" || len(r.Heads) == 0 || seen[r.AskID] || d.State.Final() || d.State == Rejected || d.Base != MergeBranch || r.RefusedSince != nil || h.allMerged(r.Heads) { @@ -146,7 +152,8 @@ func (h *Holder) mergeOfDelivery(d *Delivery) (approvedMerge, bool) { return approvedMerge{}, false } for _, am := range h.approvedMerges() { - if am.run == c { + // By the ask, not the run: a group's members may each hold a run of the same ask, and the merge is the ask's. + if am.run.AskID == c.AskID { return am, true } }