Merge pull request 'mesh-issues: a milestone or commit link moves no issue and keeps no worker current (issue 1781)' (#510) from fix/1781-moved-ignores-milestone-links into main
This commit was merged in pull request #510.
This commit is contained in:
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -26,6 +27,22 @@ func TestListSaysWhenEachIssueMovedAndKeepsTheLinkedOnes(t *testing.T) {
|
|||||||
if _, err := h.Link(LinkAsk{Number: quiet, Kind: LinkDesign, Target: "03-DESIGN/01-to-be/47-delivery-from-commit-to-delivered.md"}); err != nil {
|
if _, err := h.Link(LinkAsk{Number: quiet, Kind: LinkDesign, Target: "03-DESIGN/01-to-be/47-delivery-from-commit-to-delivered.md"}); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
// Issue 1781: a milestone or a commit link places the issue and moves nothing, nor keeps its worker current.
|
||||||
|
if _, err := h.milestoneSet("lead@shanks", MilestoneSetAsk{Design: 47, ID: "R6", Outcome: "x"}); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
h.fixing(t, noted)
|
||||||
|
worked, _ := h.Get(noted)
|
||||||
|
clock = clock.Add(time.Hour)
|
||||||
|
for _, l := range []LinkAsk{{Number: noted, Kind: LinkMilestone, Target: "47/R6"},
|
||||||
|
{Number: noted, Kind: LinkCommit, Target: "mesh-catalog@" + strings.Repeat("a", 40)}} {
|
||||||
|
if _, err := h.link("seed@shanks", l); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if after, _ := h.Get(noted); !after.Worker.Active.Equal(worked.Worker.Active) {
|
||||||
|
t.Fatalf("a milestone link kept the worker current: %v, was %v", after.Worker.Active, worked.Worker.Active)
|
||||||
|
}
|
||||||
start := time.Date(2026, 10, 26, 12, 0, 0, 0, time.UTC)
|
start := time.Date(2026, 10, 26, 12, 0, 0, 0, time.UTC)
|
||||||
for _, c := range []struct {
|
for _, c := range []struct {
|
||||||
name string
|
name string
|
||||||
@@ -35,7 +52,7 @@ func TestListSaysWhenEachIssueMovedAndKeepsTheLinkedOnes(t *testing.T) {
|
|||||||
refuse bool
|
refuse bool
|
||||||
}{
|
}{
|
||||||
{"numbers say moved", ListAsk{Numbers: []uint64{quiet, noted, linked}}, []uint64{quiet, noted, linked},
|
{"numbers say moved", ListAsk{Numbers: []uint64{quiet, noted, linked}}, []uint64{quiet, noted, linked},
|
||||||
[]time.Time{start.Add(2 * time.Hour), start.Add(time.Hour), start.Add(2 * time.Hour)}, false},
|
[]time.Time{start.Add(2 * time.Hour), start.Add(2 * time.Hour), start.Add(2 * time.Hour)}, false},
|
||||||
{"linked to a decision", ListAsk{Linked: "decision:0493"}, []uint64{linked}, nil, false},
|
{"linked to a decision", ListAsk{Linked: "decision:0493"}, []uint64{linked}, nil, false},
|
||||||
{"linked to a design", ListAsk{Linked: " design:03-DESIGN/01-to-be/47-delivery-from-commit-to-delivered.md"}, []uint64{quiet}, nil, false},
|
{"linked to a design", ListAsk{Linked: " design:03-DESIGN/01-to-be/47-delivery-from-commit-to-delivered.md"}, []uint64{quiet}, nil, false},
|
||||||
{"linked and numbers together", ListAsk{Linked: "decision:0493", Numbers: []uint64{quiet, noted}}, nil, nil, false},
|
{"linked and numbers together", ListAsk{Linked: "decision:0493", Numbers: []uint64{quiet, noted}}, nil, nil, false},
|
||||||
|
|||||||
@@ -675,7 +675,9 @@ func (t *Tracker) link(by string, a LinkAsk) (*Linked, error) {
|
|||||||
return fmt.Errorf("issue %d already has the %s link to %s", is.Number, kind, target)
|
return fmt.Errorf("issue %d already has the %s link to %s", is.Number, kind, target)
|
||||||
}
|
}
|
||||||
is.Links = append(is.Links[:i:i], is.Links[i+1:]...)
|
is.Links = append(is.Links[:i:i], is.Links[i+1:]...)
|
||||||
touch(is, by, at)
|
if !placesOnly(kind) {
|
||||||
|
touch(is, by, at)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -692,7 +694,9 @@ func (t *Tracker) link(by string, a LinkAsk) (*Linked, error) {
|
|||||||
return fmt.Errorf("issue %d has %d links, the most one issue keeps", is.Number, MostLinks)
|
return fmt.Errorf("issue %d has %d links, the most one issue keeps", is.Number, MostLinks)
|
||||||
}
|
}
|
||||||
is.Links = append(is.Links, Link{Kind: kind, Target: target, By: by, At: at})
|
is.Links = append(is.Links, Link{Kind: kind, Target: target, By: by, At: at})
|
||||||
touch(is, by, at)
|
if !placesOnly(kind) {
|
||||||
|
touch(is, by, at)
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -768,7 +772,7 @@ type Row struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// lastMoved is when an issue last changed, as its own record says: the latest of its opening, its closing, its
|
// lastMoved is when an issue last changed, as its own record says: the latest of its opening, its closing, its
|
||||||
// notes, its links, its worker's start and last act, its import and what the delivery last said of each fix.
|
// notes, its links but those that only place it, its worker's start and last act, its import and what the delivery last said of each fix.
|
||||||
func lastMoved(is *Issue) time.Time {
|
func lastMoved(is *Issue) time.Time {
|
||||||
at := is.Opened
|
at := is.Opened
|
||||||
later := func(t time.Time) {
|
later := func(t time.Time) {
|
||||||
@@ -783,7 +787,9 @@ func lastMoved(is *Issue) time.Time {
|
|||||||
later(n.At)
|
later(n.At)
|
||||||
}
|
}
|
||||||
for _, l := range is.Links {
|
for _, l := range is.Links {
|
||||||
later(l.At)
|
if !placesOnly(l.Kind) {
|
||||||
|
later(l.At)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if w := is.Worker; w != nil {
|
if w := is.Worker; w != nil {
|
||||||
later(w.Since)
|
later(w.Since)
|
||||||
@@ -798,6 +804,10 @@ func lastMoved(is *Issue) time.Time {
|
|||||||
return at
|
return at
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// placesOnly says a link of this kind only places the issue (its milestone) or names a commit that fixed it: no work
|
||||||
|
// on it, so it neither moves the issue nor keeps its worker current (issue 1781: the seed linked 188 issues at once).
|
||||||
|
func placesOnly(kind string) bool { return kind == LinkMilestone || kind == LinkCommit }
|
||||||
|
|
||||||
// checkLinked is a list's linked filter, kind:target, said the one way a link of that kind is kept.
|
// checkLinked is a list's linked filter, kind:target, said the one way a link of that kind is kept.
|
||||||
func checkLinked(s string) (kind, target string, err error) {
|
func checkLinked(s string) (kind, target string, err error) {
|
||||||
k, t, ok := strings.Cut(strings.TrimSpace(s), ":")
|
k, t, ok := strings.Cut(strings.TrimSpace(s), ":")
|
||||||
|
|||||||
Reference in New Issue
Block a user