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:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user