Skip to content

Commit 27e2272

Browse files
refactor(queue): unify status and doctor reporting
Co-authored-by: Andrew <andrewxhill@gmail.com>
1 parent c0b11e5 commit 27e2272

5 files changed

Lines changed: 82 additions & 42 deletions

File tree

internal/app/queue_snapshot.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package app
2+
3+
import (
4+
"context"
5+
6+
"github.com/recallnet/mainline/internal/state"
7+
)
8+
9+
type queueSnapshot struct {
10+
Counts statusCounts `json:"counts"`
11+
Summary queueSummary `json:"summary"`
12+
UnfinishedItems []string `json:"unfinished_items"`
13+
}
14+
15+
func loadQueueSnapshot(store state.Store, repoID int64) (queueSnapshot, error) {
16+
ctx := context.Background()
17+
submissions, err := store.ListIntegrationSubmissions(ctx, repoID)
18+
if err != nil {
19+
return queueSnapshot{}, err
20+
}
21+
requests, err := store.ListPublishRequests(ctx, repoID)
22+
if err != nil {
23+
return queueSnapshot{}, err
24+
}
25+
items, err := store.ListUnfinishedItems(ctx, repoID)
26+
if err != nil {
27+
return queueSnapshot{}, err
28+
}
29+
counts := summarizeCounts(submissions, requests)
30+
return queueSnapshot{
31+
Counts: counts,
32+
Summary: summarizeQueue(counts),
33+
UnfinishedItems: items,
34+
}, nil
35+
}

internal/app/repo.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -831,16 +831,23 @@ Flags:
831831
if record, _, err := ensureRepositoryRecord(ctx, store, repoRoot, cfg); err == nil {
832832
repoRecord = record
833833
hasRepoRecord = true
834-
items, err := store.ListUnfinishedItems(ctx, record.ID)
834+
queue, err := loadQueueSnapshot(store, record.ID)
835835
if err != nil {
836836
return err
837837
}
838-
report.UnfinishedQueueItems = items
838+
report.UnfinishedQueueItems = queue.UnfinishedItems
839839
}
840840
}
841841

842842
lockManager := state.NewLockManager(repoRoot, layout.GitDir)
843843
result := doctorResult{HealthReport: report, RootCheckout: rootInfo}
844+
if hasRepoRecord {
845+
queue, err := loadQueueSnapshot(store, repoRecord.ID)
846+
if err != nil {
847+
return err
848+
}
849+
result.QueueSummary = queue.Summary
850+
}
844851
if fix {
845852
applied, skipped, err := runDoctorFix(ctx, engine, cfg, lockManager, store, repoRecord, hasRepoRecord)
846853
if err != nil {
@@ -858,11 +865,12 @@ Flags:
858865
result.HealthReport = report
859866
result.RootCheckout = rootInfo
860867
if store.Exists() && hasRepoRecord {
861-
items, err := store.ListUnfinishedItems(ctx, repoRecord.ID)
868+
queue, err := loadQueueSnapshot(store, repoRecord.ID)
862869
if err != nil {
863870
return err
864871
}
865-
result.UnfinishedQueueItems = items
872+
result.UnfinishedQueueItems = queue.UnfinishedItems
873+
result.QueueSummary = queue.Summary
866874
}
867875
}
868876
result.QueueBlocked = !result.ProtectedBranchClean || result.MainWorktreeDetached || (result.MainWorktreeBranch != "" && result.MainWorktreeBranch != result.ProtectedBranch)
@@ -941,6 +949,7 @@ Flags:
941949
type doctorResult struct {
942950
git.HealthReport
943951
RootCheckout rootCheckoutInfo `json:"root_checkout,omitempty"`
952+
QueueSummary queueSummary `json:"queue_summary,omitempty"`
944953
QueueBlocked bool `json:"queue_blocked,omitempty"`
945954
NextActions []string `json:"next_actions,omitempty"`
946955
FixesApplied []string `json:"fixes_applied,omitempty"`

internal/app/repo_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,12 @@ func TestDoctorJSONListsConcreteUnfinishedQueueItems(t *testing.T) {
873873
if strings.Join(result.UnfinishedQueueItems, "\n") != strings.Join(want, "\n") {
874874
t.Fatalf("unexpected unfinished queue items:\nwant: %v\ngot: %v", want, result.UnfinishedQueueItems)
875875
}
876+
if result.QueueSummary.Headline != "publishing" || result.QueueSummary.QueueLength != 2 {
877+
t.Fatalf("expected doctor queue summary to reflect publishing blocked mix, got %+v", result.QueueSummary)
878+
}
879+
if !result.QueueSummary.HasBlockedSubmissions || !result.QueueSummary.HasRunningPublishes || result.QueueSummary.HasRunningSubmissions || !result.QueueSummary.HasQueuedWork {
880+
t.Fatalf("unexpected doctor queue summary flags: %+v", result.QueueSummary)
881+
}
876882
for _, item := range result.UnfinishedQueueItems {
877883
if strings.TrimSpace(item) == "" {
878884
t.Fatalf("unexpected blank unfinished queue item in %+v", result.UnfinishedQueueItems)

internal/app/status.go

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,10 @@ func collectStatus(repoPath string, limit int) (statusResult, error) {
293293
return statusResult{}, err
294294
}
295295
enrichedSubmissions = annotateQueueEstimates(enrichedSubmissions, estimate)
296+
queue, err := loadQueueSnapshot(store, repoRecord.ID)
297+
if err != nil {
298+
return statusResult{}, err
299+
}
296300

297301
result := statusResult{
298302
RepositoryRoot: repoRecord.CanonicalPath,
@@ -304,7 +308,7 @@ func collectStatus(repoPath string, limit int) (statusResult, error) {
304308
ProtectedUpstream: protectedStatus,
305309
ExecutionEstimate: estimate,
306310
PublishExecution: buildPublishExecutionPolicy(cfg),
307-
Counts: summarizeCounts(submissions, requests),
311+
Counts: queue.Counts,
308312
ActiveSubmissions: activeSubmissions(enrichedSubmissions),
309313
ActivePublishes: activePublishes(requests),
310314
RecentEvents: events,
@@ -316,14 +320,13 @@ func collectStatus(repoPath string, limit int) (statusResult, error) {
316320
result.RebaseGuidance = buildStatusRebaseGuidance(cfg, comparison, protectedStatus, layout.WorktreeRoot, currentBranch)
317321
}
318322
}
319-
queue := summarizeQueue(result.Counts)
320-
result.State = queue.Headline
321-
result.QueueLength = queue.QueueLength
322-
result.HasBlockedSubmissions = queue.HasBlockedSubmissions
323-
result.HasRunningPublishes = queue.HasRunningPublishes
324-
result.HasRunningSubmissions = queue.HasRunningSubmissions
325-
result.HasQueuedWork = queue.HasQueuedWork
326-
result.QueueSummary = queue
323+
result.State = queue.Summary.Headline
324+
result.QueueLength = queue.Summary.QueueLength
325+
result.HasBlockedSubmissions = queue.Summary.HasBlockedSubmissions
326+
result.HasRunningPublishes = queue.Summary.HasRunningPublishes
327+
result.HasRunningSubmissions = queue.Summary.HasRunningSubmissions
328+
result.HasQueuedWork = queue.Summary.HasQueuedWork
329+
result.QueueSummary = queue.Summary
327330
result.Alerts = buildStatusAlerts(result.Counts)
328331
lockManager := state.NewLockManager(layout.RepositoryRoot, layout.GitDir)
329332
if metadata, ok := readActiveLease(lockManager, state.IntegrationLock); ok {

internal/app/wait.go

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -527,43 +527,30 @@ func populateIntegrationWaitQueueSummary(store state.Store, repoID int64, result
527527
if result == nil {
528528
return
529529
}
530-
summary, ok := loadQueueSummary(store, repoID)
531-
if !ok {
530+
snapshot, err := loadQueueSnapshot(store, repoID)
531+
if err != nil {
532532
return
533533
}
534-
result.QueueState = summary.Headline
535-
result.QueueLength = summary.QueueLength
536-
result.HasBlockedSubmissions = summary.HasBlockedSubmissions
537-
result.HasRunningPublishes = summary.HasRunningPublishes
538-
result.HasRunningSubmissions = summary.HasRunningSubmissions
539-
result.HasQueuedWork = summary.HasQueuedWork
534+
result.QueueState = snapshot.Summary.Headline
535+
result.QueueLength = snapshot.Summary.QueueLength
536+
result.HasBlockedSubmissions = snapshot.Summary.HasBlockedSubmissions
537+
result.HasRunningPublishes = snapshot.Summary.HasRunningPublishes
538+
result.HasRunningSubmissions = snapshot.Summary.HasRunningSubmissions
539+
result.HasQueuedWork = snapshot.Summary.HasQueuedWork
540540
}
541541

542542
func populateSubmissionWaitQueueSummary(store state.Store, repoID int64, result *submissionWaitResult) {
543543
if result == nil {
544544
return
545545
}
546-
summary, ok := loadQueueSummary(store, repoID)
547-
if !ok {
548-
return
549-
}
550-
result.QueueState = summary.Headline
551-
result.QueueLength = summary.QueueLength
552-
result.HasBlockedSubmissions = summary.HasBlockedSubmissions
553-
result.HasRunningPublishes = summary.HasRunningPublishes
554-
result.HasRunningSubmissions = summary.HasRunningSubmissions
555-
result.HasQueuedWork = summary.HasQueuedWork
556-
}
557-
558-
func loadQueueSummary(store state.Store, repoID int64) (queueSummary, bool) {
559-
ctx := context.Background()
560-
submissions, err := store.ListIntegrationSubmissions(ctx, repoID)
561-
if err != nil {
562-
return queueSummary{}, false
563-
}
564-
requests, err := store.ListPublishRequests(ctx, repoID)
546+
snapshot, err := loadQueueSnapshot(store, repoID)
565547
if err != nil {
566-
return queueSummary{}, false
548+
return
567549
}
568-
return summarizeQueue(summarizeCounts(submissions, requests)), true
550+
result.QueueState = snapshot.Summary.Headline
551+
result.QueueLength = snapshot.Summary.QueueLength
552+
result.HasBlockedSubmissions = snapshot.Summary.HasBlockedSubmissions
553+
result.HasRunningPublishes = snapshot.Summary.HasRunningPublishes
554+
result.HasRunningSubmissions = snapshot.Summary.HasRunningSubmissions
555+
result.HasQueuedWork = snapshot.Summary.HasQueuedWork
569556
}

0 commit comments

Comments
 (0)