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 {
|
func (h *Holder) approvedMerges() []approvedMerge {
|
||||||
var out []approvedMerge
|
var out []approvedMerge
|
||||||
seen := map[string]bool{}
|
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
|
r := d.Ready
|
||||||
if r == nil || r.Approved == nil || r.Declined != nil || r.AskID == "" || len(r.Heads) == 0 || seen[r.AskID] ||
|
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) {
|
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
|
return approvedMerge{}, false
|
||||||
}
|
}
|
||||||
for _, am := range h.approvedMerges() {
|
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
|
return am, true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user