gate: find an approved merge by its ask, not by which member's run was seen first, so a group's turns are written before its first member is handed at every look (ADR 0548 §3; issue 568, review round 1)
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user