Files
byre/internal/agents/coordinator.go
T

68 lines
1.4 KiB
Go
Raw Normal View History

package agents
import (
"context"
"log/slog"
)
const abandonedMergeText = "The Merge turn ended unfinished (interrupted, failed to start, or with no final message), so byre didn't squash or push the task. Merge again to retry."
func (m *Manager) poke() {
select {
case m.pokes <- struct{}{}:
default:
}
}
func (m *Manager) coordinate() {
started := map[string]bool{}
for {
select {
case <-m.watchStop:
return
case <-m.pokes:
m.coordinatePass(context.Background(), started)
}
}
}
func (m *Manager) coordinatePass(ctx context.Context, started map[string]bool) {
work, err := m.store.Coordinate(ctx)
if err != nil {
slog.Error("coordinate", "err", err)
return
}
for _, id := range work.AbandonedMerges {
slog.Info("merge turn ended unfinished", "task", id)
m.fileError(ctx, id, abandonedMergeText)
m.deliverIdle(ctx, id)
}
for _, c := range work.StartMerges {
m.startClaimedMerge(ctx, c)
}
for _, id := range work.StartDiscards {
m.startDiscard(ctx, id)
}
current := map[string]bool{}
once := func(key string, run func()) {
current[key] = true
if started[key] {
return
}
started[key] = true
go run()
}
for _, f := range work.FinalizeMerges {
once("merge:"+f.Task.Id, func() { m.finalizeMerge(f) })
}
for _, id := range work.FinishDiscards {
once("discard:"+id, func() { m.finishDiscard(id) })
}
for key := range started {
if !current[key] {
delete(started, key)
}
}
}