mesh-issues: a fix whose pull request has no record learns its merge from the delivery or the forge, so a delivered event can cover it (issue 1950)

This commit is contained in:
2026-10-27 01:24:57 +01:00
parent 64530a8dcb
commit b51f03c4ff
8 changed files with 402 additions and 67 deletions
+36 -31
View File
@@ -18,6 +18,7 @@ package main
import (
"fmt"
"sort"
"strings"
"time"
)
@@ -112,45 +113,38 @@ func (t *Tracker) clearNotResolved(is *Issue) error {
// askUnheard asks mesh-delivery for a few fixes of issues not yet resolved that the tracker never heard of: a pull
// request linked after its delivery moved hears no transition again, and OnMoved asks only at a move.
func (t *Tracker) askUnheard() error {
if t.Deliveries == nil {
if t.Deliveries == nil && t.Pull == nil {
return nil
}
all, err := t.allIssues()
if err != nil {
return err
}
asked := 0
for n, is := range all {
if !unresolved(is) {
continue
// Issues not resolved first, then the others: a resolved issue's fix merged before the tracker heard deliveries is learned
// too, so its delivery line stops saying nothing was heard (issue 1950). The asks are bounded; the rest wait for the next sweep.
numbers := make([]uint64, 0, len(all))
for n := range all {
numbers = append(numbers, n)
}
sort.Slice(numbers, func(i, j int) bool {
a, b := unresolved(all[numbers[i]]), unresolved(all[numbers[j]])
if a != b {
return a
}
heard := false
for _, pr := range fixPullRequests(is) {
if fixOf(is, pr) != nil {
continue
}
if asked == MostSweepAsks {
return nil
}
asked++
repo, number, _ := strings.Cut(pr, "#")
d, err := t.Deliveries(repo, number)
if err != nil {
return fmt.Errorf("the delivery of %s (issue %d): %v", pr, n, err)
}
if d.State == "" {
continue
}
since := d.Since
if since.IsZero() {
since = t.now()
}
if _, err := t.recordFix(pr, d.heard(since), n); err != nil {
return err
}
heard = true
return numbers[i] < numbers[j]
})
left := MostSweepAsks
for _, n := range numbers {
if left == 0 {
return nil
}
if heard {
is := all[n]
asked, kept, err := t.learnUnheard(n, is, left)
left -= asked
if err != nil {
return err
}
if kept {
if err := t.afterFix(n); err != nil {
return err
}
@@ -159,6 +153,17 @@ func (t *Tracker) askUnheard() error {
return nil
}
// unheardOf is the pull requests an issue names that the tracker keeps no record for.
func unheardOf(is *Issue) []string {
var out []string
for _, pr := range fixPullRequests(is) {
if fixOf(is, pr) == nil {
out = append(out, pr)
}
}
return out
}
// openPullRequest says whether an issue names a pull request not merged yet, or one whose delivery the tracker
// never heard of: work in review is work, and a fix unheard of is not taken for none. One closed without merging
// is not open.