Skip to content

Commit 7f7b87d

Browse files
refactor(status): add shared status snapshot
Co-authored-by: Andrew <andrewxhill@gmail.com>
1 parent b27111f commit 7f7b87d

2 files changed

Lines changed: 111 additions & 56 deletions

File tree

internal/app/status.go

Lines changed: 13 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -243,29 +243,7 @@ func collectStatus(repoPath string, limit int) (statusResult, error) {
243243
}
244244

245245
ctx := context.Background()
246-
submissions, err := store.ListIntegrationSubmissions(ctx, repoRecord.ID)
247-
if err != nil {
248-
return statusResult{}, err
249-
}
250-
requests, err := store.ListPublishRequests(ctx, repoRecord.ID)
251-
if err != nil {
252-
return statusResult{}, err
253-
}
254-
events, err := store.ListEvents(ctx, repoRecord.ID, limit)
255-
if err != nil {
256-
return statusResult{}, err
257-
}
258-
259-
enrichedSubmissions, err := enrichStatusSubmissions(ctx, store, repoRecord.ID, cfg.Repo.MainWorktree, cfg.Repo.ProtectedBranch, submissions)
260-
if err != nil {
261-
return statusResult{}, err
262-
}
263-
estimate, err := collectExecutionEstimate(ctx, store, repoRecord.ID, cfg, submissions)
264-
if err != nil {
265-
return statusResult{}, err
266-
}
267-
enrichedSubmissions = annotateQueueEstimates(enrichedSubmissions, estimate)
268-
queue, err := loadQueueSnapshot(store, repoRecord.ID)
246+
snapshot, err := loadRepoStatusSnapshot(ctx, store, repoRecord, cfg, limit)
269247
if err != nil {
270248
return statusResult{}, err
271249
}
@@ -278,12 +256,12 @@ func collectStatus(repoPath string, limit int) (statusResult, error) {
278256
ProtectedBranch: cfg.Repo.ProtectedBranch,
279257
ProtectedBranchSHA: protectedSHA,
280258
ProtectedUpstream: protectedStatus,
281-
ExecutionEstimate: estimate,
259+
ExecutionEstimate: snapshot.ExecutionEstimate,
282260
PublishExecution: buildPublishExecutionPolicy(cfg),
283-
Counts: queue.Counts,
284-
ActiveSubmissions: activeSubmissions(enrichedSubmissions),
285-
ActivePublishes: activePublishes(requests),
286-
RecentEvents: events,
261+
Counts: snapshot.Counts,
262+
ActiveSubmissions: snapshot.ActiveSubmissions,
263+
ActivePublishes: snapshot.ActivePublishes,
264+
RecentEvents: snapshot.RecentEvents,
287265
}
288266
if currentBranch != "(detached)" && currentBranch != "" && currentBranch != cfg.Repo.ProtectedBranch {
289267
comparison, compareErr := engine.CompareBranches(cfg.Repo.ProtectedBranch, currentBranch)
@@ -292,34 +270,13 @@ func collectStatus(repoPath string, limit int) (statusResult, error) {
292270
result.RebaseGuidance = buildStatusRebaseGuidance(cfg, comparison, protectedStatus, layout.WorktreeRoot, currentBranch)
293271
}
294272
}
295-
result.QueueSummary = queue.Summary
296-
result.Alerts = buildStatusAlerts(result.Counts)
297-
lockManager := state.NewLockManager(layout.RepositoryRoot, layout.GitDir)
298-
if metadata, ok := readActiveLease(lockManager, state.IntegrationLock); ok {
299-
result.IntegrationWorker = &metadata
300-
}
301-
if metadata, ok := readActiveLease(lockManager, state.PublishLock); ok {
302-
result.PublishWorker = &metadata
303-
}
304-
result.ProtectedWorktreeActivity = buildProtectedWorktreeActivity(cfg.Repo.MainWorktree, result.IntegrationWorker, result.PublishWorker)
305-
if len(enrichedSubmissions) > 0 {
306-
latest := enrichedSubmissions[len(enrichedSubmissions)-1]
307-
result.LatestSubmission = &latest
308-
}
309-
if len(requests) > 0 {
310-
latest := newStatusPublish(requests[len(requests)-1])
311-
if result.PublishWorker != nil && result.PublishWorker.RequestID == latest.ID {
312-
latest.ActiveStage = result.PublishWorker.Stage
313-
}
314-
result.LatestPublish = &latest
315-
}
316-
if result.PublishWorker != nil {
317-
for i := range result.ActivePublishes {
318-
if result.ActivePublishes[i].ID == result.PublishWorker.RequestID {
319-
result.ActivePublishes[i].ActiveStage = result.PublishWorker.Stage
320-
}
321-
}
322-
}
273+
result.QueueSummary = snapshot.QueueSummary
274+
result.Alerts = snapshot.Alerts
275+
result.IntegrationWorker = snapshot.IntegrationWorker
276+
result.PublishWorker = snapshot.PublishWorker
277+
result.ProtectedWorktreeActivity = snapshot.ProtectedWorktreeActivity
278+
result.LatestSubmission = snapshot.LatestSubmission
279+
result.LatestPublish = snapshot.LatestPublish
323280

324281
return result, nil
325282
}

internal/app/status_snapshot.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
package app
2+
3+
import (
4+
"context"
5+
"path/filepath"
6+
7+
"github.com/recallnet/mainline/internal/policy"
8+
"github.com/recallnet/mainline/internal/state"
9+
)
10+
11+
type repoStatusSnapshot struct {
12+
ExecutionEstimate executionEstimate
13+
Counts queueCounts
14+
QueueSummary queueSummary
15+
Alerts []string
16+
LatestSubmission *statusSubmission
17+
LatestPublish *statusPublish
18+
ActiveSubmissions []statusSubmission
19+
ActivePublishes []statusPublish
20+
IntegrationWorker *state.LeaseMetadata
21+
PublishWorker *state.LeaseMetadata
22+
ProtectedWorktreeActivity *protectedWorktreeActivity
23+
RecentEvents []state.EventRecord
24+
}
25+
26+
func loadRepoStatusSnapshot(ctx context.Context, store state.Store, repoRecord state.RepositoryRecord, cfg policy.File, limit int) (repoStatusSnapshot, error) {
27+
submissions, err := store.ListIntegrationSubmissions(ctx, repoRecord.ID)
28+
if err != nil {
29+
return repoStatusSnapshot{}, err
30+
}
31+
requests, err := store.ListPublishRequests(ctx, repoRecord.ID)
32+
if err != nil {
33+
return repoStatusSnapshot{}, err
34+
}
35+
events, err := store.ListEvents(ctx, repoRecord.ID, limit)
36+
if err != nil {
37+
return repoStatusSnapshot{}, err
38+
}
39+
40+
enrichedSubmissions, err := enrichStatusSubmissions(ctx, store, repoRecord.ID, cfg.Repo.MainWorktree, cfg.Repo.ProtectedBranch, submissions)
41+
if err != nil {
42+
return repoStatusSnapshot{}, err
43+
}
44+
estimate, err := collectExecutionEstimate(ctx, store, repoRecord.ID, cfg, submissions)
45+
if err != nil {
46+
return repoStatusSnapshot{}, err
47+
}
48+
enrichedSubmissions = annotateQueueEstimates(enrichedSubmissions, estimate)
49+
queue, err := loadQueueSnapshot(store, repoRecord.ID)
50+
if err != nil {
51+
return repoStatusSnapshot{}, err
52+
}
53+
54+
snapshot := repoStatusSnapshot{
55+
ExecutionEstimate: estimate,
56+
Counts: queue.Counts,
57+
QueueSummary: queue.Summary,
58+
Alerts: buildStatusAlerts(queue.Counts),
59+
ActiveSubmissions: activeSubmissions(enrichedSubmissions),
60+
ActivePublishes: activePublishes(requests),
61+
RecentEvents: events,
62+
}
63+
64+
lockManager := state.NewLockManager(repoRecord.CanonicalPath, stateGitDirFromStorePath(store.Path))
65+
if metadata, ok := readActiveLease(lockManager, state.IntegrationLock); ok {
66+
snapshot.IntegrationWorker = &metadata
67+
}
68+
if metadata, ok := readActiveLease(lockManager, state.PublishLock); ok {
69+
snapshot.PublishWorker = &metadata
70+
}
71+
snapshot.ProtectedWorktreeActivity = buildProtectedWorktreeActivity(cfg.Repo.MainWorktree, snapshot.IntegrationWorker, snapshot.PublishWorker)
72+
73+
if len(enrichedSubmissions) > 0 {
74+
latest := enrichedSubmissions[len(enrichedSubmissions)-1]
75+
snapshot.LatestSubmission = &latest
76+
}
77+
if len(requests) > 0 {
78+
latest := newStatusPublish(requests[len(requests)-1])
79+
if snapshot.PublishWorker != nil && snapshot.PublishWorker.RequestID == latest.ID {
80+
latest.ActiveStage = snapshot.PublishWorker.Stage
81+
}
82+
snapshot.LatestPublish = &latest
83+
}
84+
if snapshot.PublishWorker != nil {
85+
for i := range snapshot.ActivePublishes {
86+
if snapshot.ActivePublishes[i].ID == snapshot.PublishWorker.RequestID {
87+
snapshot.ActivePublishes[i].ActiveStage = snapshot.PublishWorker.Stage
88+
}
89+
}
90+
}
91+
92+
return snapshot, nil
93+
}
94+
95+
func stateGitDirFromStorePath(path string) string {
96+
// state.DefaultPath writes under <gitdir>/mainline/state.db; derive the gitdir back from that stable layout.
97+
return filepath.Dir(filepath.Dir(path))
98+
}

0 commit comments

Comments
 (0)