Skip to content

Commit 4d9f7c3

Browse files
feat(wait): expose live publish activity
Co-authored-by: Andrew <andrewxhill@gmail.com>
1 parent 5212ab3 commit 4d9f7c3

2 files changed

Lines changed: 82 additions & 38 deletions

File tree

internal/app/app_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,25 @@ func TestWaitAndStatusClassifyFailedPublishWithDirtyProtectedRoot(t *testing.T)
742742
if len(submissions) != 1 || len(requests) != 1 {
743743
t.Fatalf("expected one submission and one publish request, got %+v %+v", submissions, requests)
744744
}
745+
lockDir := filepath.Join(layout.GitDir, "mainline", "locks")
746+
if err := os.MkdirAll(lockDir, 0o755); err != nil {
747+
t.Fatalf("MkdirAll(lockDir): %v", err)
748+
}
749+
payload, err := json.Marshal(state.LeaseMetadata{
750+
Domain: state.PublishLock,
751+
RepoRoot: layout.RepositoryRoot,
752+
Owner: "publish-worker",
753+
Stage: publishStagePush,
754+
RequestID: requests[0].ID,
755+
PID: 5150,
756+
CreatedAt: time.Now().UTC(),
757+
})
758+
if err != nil {
759+
t.Fatalf("Marshal: %v", err)
760+
}
761+
if err := os.WriteFile(filepath.Join(lockDir, state.PublishLock+".lock.json"), payload, 0o644); err != nil {
762+
t.Fatalf("WriteFile(lock): %v", err)
763+
}
745764
if _, err := store.UpdatePublishRequestStatus(context.Background(), requests[0].ID, domain.PublishStatusFailed, sql.NullInt64{}); err != nil {
746765
t.Fatalf("UpdatePublishRequestStatus: %v", err)
747766
}
@@ -781,6 +800,12 @@ func TestWaitAndStatusClassifyFailedPublishWithDirtyProtectedRoot(t *testing.T)
781800
if !strings.Contains(waitResult.Error, "protected root checkout is dirty") {
782801
t.Fatalf("expected dirty-root error, got %+v", waitResult)
783802
}
803+
if waitResult.PublishWorker == nil || waitResult.PublishWorker.RequestID != requests[0].ID || waitResult.PublishWorker.Stage != publishStagePush {
804+
t.Fatalf("expected wait publish worker, got %+v", waitResult.PublishWorker)
805+
}
806+
if waitResult.ProtectedWorktreeActivity == nil || waitResult.ProtectedWorktreeActivity.Stage != publishStagePush {
807+
t.Fatalf("expected wait protected worktree activity, got %+v", waitResult.ProtectedWorktreeActivity)
808+
}
784809

785810
var statusOut bytes.Buffer
786811
var statusErr bytes.Buffer

internal/app/wait.go

Lines changed: 57 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -26,22 +26,25 @@ const (
2626
)
2727

2828
type integrationWaitResult struct {
29-
SubmissionID int64 `json:"submission_id"`
30-
Branch string `json:"branch"`
31-
SourceRef string `json:"source_ref,omitempty"`
32-
RefKind domain.RefKind `json:"ref_kind,omitempty"`
33-
SourceWorktree string `json:"source_worktree"`
34-
SourceSHA string `json:"source_sha"`
35-
RepositoryRoot string `json:"repository_root"`
36-
ProtectedBranch string `json:"protected_branch"`
37-
SubmissionStatus domain.SubmissionStatus `json:"submission_status"`
38-
PublishRequestID int64 `json:"publish_request_id,omitempty"`
39-
PublishStatus domain.PublishStatus `json:"publish_status,omitempty"`
40-
Outcome waitOutcome `json:"outcome"`
41-
DurationMS int64 `json:"duration_ms"`
42-
QueueSummary queueSummary `json:"queue_summary,omitempty"`
43-
LastWorkerResult string `json:"last_worker_result,omitempty"`
44-
Error string `json:"error,omitempty"`
29+
SubmissionID int64 `json:"submission_id"`
30+
Branch string `json:"branch"`
31+
SourceRef string `json:"source_ref,omitempty"`
32+
RefKind domain.RefKind `json:"ref_kind,omitempty"`
33+
SourceWorktree string `json:"source_worktree"`
34+
SourceSHA string `json:"source_sha"`
35+
RepositoryRoot string `json:"repository_root"`
36+
ProtectedBranch string `json:"protected_branch"`
37+
SubmissionStatus domain.SubmissionStatus `json:"submission_status"`
38+
PublishRequestID int64 `json:"publish_request_id,omitempty"`
39+
PublishStatus domain.PublishStatus `json:"publish_status,omitempty"`
40+
Outcome waitOutcome `json:"outcome"`
41+
DurationMS int64 `json:"duration_ms"`
42+
QueueSummary queueSummary `json:"queue_summary,omitempty"`
43+
ActivePublishes []statusPublish `json:"active_publishes,omitempty"`
44+
PublishWorker *state.LeaseMetadata `json:"publish_worker,omitempty"`
45+
ProtectedWorktreeActivity *protectedWorktreeActivity `json:"protected_worktree_activity,omitempty"`
46+
LastWorkerResult string `json:"last_worker_result,omitempty"`
47+
Error string `json:"error,omitempty"`
4548
}
4649

4750
type waitTarget string
@@ -52,28 +55,31 @@ const (
5255
)
5356

5457
type submissionWaitResult struct {
55-
SubmissionID int64 `json:"submission_id"`
56-
Branch string `json:"branch"`
57-
SourceRef string `json:"source_ref,omitempty"`
58-
RefKind domain.RefKind `json:"ref_kind,omitempty"`
59-
SourceWorktree string `json:"source_worktree"`
60-
SourceSHA string `json:"source_sha"`
61-
RepositoryRoot string `json:"repository_root"`
62-
ProtectedBranch string `json:"protected_branch"`
63-
ProtectedSHA string `json:"protected_sha,omitempty"`
64-
SubmissionStatus domain.SubmissionStatus `json:"submission_status"`
65-
PublishRequestID int64 `json:"publish_request_id,omitempty"`
66-
PublishStatus domain.PublishStatus `json:"publish_status,omitempty"`
67-
Outcome waitOutcome `json:"outcome"`
68-
DurationMS int64 `json:"duration_ms"`
69-
QueueSummary queueSummary `json:"queue_summary,omitempty"`
70-
LastWorkerResult string `json:"last_worker_result,omitempty"`
71-
PublishFailureCause string `json:"publish_failure_cause,omitempty"`
72-
PublishFailureSummary string `json:"publish_failure_summary,omitempty"`
73-
PublishFailureError string `json:"publish_failure_error,omitempty"`
74-
RetryHint string `json:"retry_hint,omitempty"`
75-
ResubmitRequired bool `json:"resubmit_required,omitempty"`
76-
Error string `json:"error,omitempty"`
58+
SubmissionID int64 `json:"submission_id"`
59+
Branch string `json:"branch"`
60+
SourceRef string `json:"source_ref,omitempty"`
61+
RefKind domain.RefKind `json:"ref_kind,omitempty"`
62+
SourceWorktree string `json:"source_worktree"`
63+
SourceSHA string `json:"source_sha"`
64+
RepositoryRoot string `json:"repository_root"`
65+
ProtectedBranch string `json:"protected_branch"`
66+
ProtectedSHA string `json:"protected_sha,omitempty"`
67+
SubmissionStatus domain.SubmissionStatus `json:"submission_status"`
68+
PublishRequestID int64 `json:"publish_request_id,omitempty"`
69+
PublishStatus domain.PublishStatus `json:"publish_status,omitempty"`
70+
Outcome waitOutcome `json:"outcome"`
71+
DurationMS int64 `json:"duration_ms"`
72+
QueueSummary queueSummary `json:"queue_summary,omitempty"`
73+
ActivePublishes []statusPublish `json:"active_publishes,omitempty"`
74+
PublishWorker *state.LeaseMetadata `json:"publish_worker,omitempty"`
75+
ProtectedWorktreeActivity *protectedWorktreeActivity `json:"protected_worktree_activity,omitempty"`
76+
LastWorkerResult string `json:"last_worker_result,omitempty"`
77+
PublishFailureCause string `json:"publish_failure_cause,omitempty"`
78+
PublishFailureSummary string `json:"publish_failure_summary,omitempty"`
79+
PublishFailureError string `json:"publish_failure_error,omitempty"`
80+
RetryHint string `json:"retry_hint,omitempty"`
81+
ResubmitRequired bool `json:"resubmit_required,omitempty"`
82+
Error string `json:"error,omitempty"`
7783
}
7884

7985
func runWait(args []string, stdout *stepPrinter, stderr io.Writer) error {
@@ -175,6 +181,13 @@ Flags:
175181
result.QueueSummary.HasRunningSubmissions,
176182
result.QueueSummary.HasQueuedWork,
177183
)
184+
printer.Line("Active publishes: %d", len(result.ActivePublishes))
185+
if result.PublishWorker != nil {
186+
printer.Line("Publish worker: %s (%s)", result.PublishWorker.Owner, result.PublishWorker.Stage)
187+
}
188+
if result.ProtectedWorktreeActivity != nil {
189+
printer.Line("Protected worktree activity: %s", result.ProtectedWorktreeActivity.Summary)
190+
}
178191
if result.LastWorkerResult != "" {
179192
printer.Line("Last worker result: %s", result.LastWorkerResult)
180193
}
@@ -523,6 +536,9 @@ func populateIntegrationWaitQueueSummary(ctx context.Context, store state.Store,
523536
return
524537
}
525538
result.QueueSummary = snapshot.QueueSummary
539+
result.ActivePublishes = snapshot.ActivePublishes
540+
result.PublishWorker = snapshot.PublishWorker
541+
result.ProtectedWorktreeActivity = snapshot.ProtectedWorktreeActivity
526542
}
527543

528544
func populateSubmissionWaitQueueSummary(ctx context.Context, store state.Store, repoRecord state.RepositoryRecord, cfg policy.File, result *submissionWaitResult) {
@@ -534,4 +550,7 @@ func populateSubmissionWaitQueueSummary(ctx context.Context, store state.Store,
534550
return
535551
}
536552
result.QueueSummary = snapshot.QueueSummary
553+
result.ActivePublishes = snapshot.ActivePublishes
554+
result.PublishWorker = snapshot.PublishWorker
555+
result.ProtectedWorktreeActivity = snapshot.ProtectedWorktreeActivity
537556
}

0 commit comments

Comments
 (0)