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 } }