Store workflow definitions as table rows and drop YAML

This commit is contained in:
Ian Gulliver
2026-10-20 21:30:39 -07:00
parent 5823af6ff9
commit 32ebf08b66
17 changed files with 624 additions and 454 deletions
+12 -12
View File
@@ -122,7 +122,7 @@ func (m *Manager) reviewsSettled(ctx context.Context, reviews []api.Review) (boo
if r.State != api.ReviewStateDone {
continue
}
def, err := m.store.ReviewDefinition(ctx, r.Id)
_, def, err := m.store.ReviewDefinition(ctx, r.Id)
if err != nil {
return false, err
}
@@ -192,12 +192,12 @@ func (m *Manager) startReviews(ctx context.Context, task api.Task, snap api.Snap
now := time.Now().UTC()
if len(changes.Files) == 0 {
slog.Info("review skipped, snapshot has no diff", "task", task.Id, "snapshot", snap.N)
return m.store.CreateReview(ctx, api.Review{Id: store.NewID(), TaskId: task.Id, SnapshotN: snap.N, State: api.ReviewStateSkipped, CreatedAt: now, FinishedAt: &now}, nil)
return m.store.CreateReview(ctx, api.Review{Id: store.NewID(), TaskId: task.Id, SnapshotN: snap.N, State: api.ReviewStateSkipped, CreatedAt: now, FinishedAt: &now}, "")
}
def, err := m.store.GetWorkflow(ctx, project.ReviewWorkflow)
frozen, err := m.store.FreezeWorkflow(ctx, project.ReviewWorkflow)
if err == nil {
err = reviewProblem(def)
err = reviewProblem(frozen.Definition)
}
if err != nil {
return m.store.CreateReview(ctx, api.Review{
@@ -209,11 +209,11 @@ func (m *Manager) startReviews(ctx context.Context, task api.Task, snap api.Snap
Error: fmt.Sprintf("project %s reviews with workflow %q, which can't run: %v", project.Name, project.ReviewWorkflow, err),
CreatedAt: now,
FinishedAt: &now,
}, nil)
}, "")
}
for _, stage := range workflow.Starts(def) {
err = m.startReviewer(ctx, task, project, snap, def, stage, nil)
for _, stage := range workflow.Starts(frozen.Definition) {
err = m.startReviewer(ctx, task, project, snap, frozen.DefinitionID, frozen.Definition, stage, nil)
if err != nil {
slog.Error("start review stage", "task", task.Id, "snapshot", snap.N, "stage", stage, "err", err)
}
@@ -228,7 +228,7 @@ func (m *Manager) advanceReviews(ctx context.Context, r api.Review) bool {
m.reviewMu.Lock()
defer m.reviewMu.Unlock()
def, err := m.store.ReviewDefinition(ctx, r.Id)
defID, def, err := m.store.ReviewDefinition(ctx, r.Id)
if err != nil {
slog.Error("load review definition", "review", r.Id, "err", err)
return false
@@ -274,7 +274,7 @@ func (m *Manager) advanceReviews(ctx context.Context, r api.Review) bool {
if len(inputs) != len(workflow.After(def, next)) {
continue
}
err = m.startReviewer(ctx, task, project, snap, def, next, inputs)
err = m.startReviewer(ctx, task, project, snap, defID, def, next, inputs)
if err != nil {
slog.Error("start review stage", "task", task.Id, "snapshot", r.SnapshotN, "stage", next, "err", err)
continue
@@ -284,7 +284,7 @@ func (m *Manager) advanceReviews(ctx context.Context, r api.Review) bool {
return started
}
func (m *Manager) startReviewer(ctx context.Context, task api.Task, project api.Project, snap api.Snapshot, def api.WorkflowDefinition, stage string, inputs []api.Review) (err error) {
func (m *Manager) startReviewer(ctx context.Context, task api.Task, project api.Project, snap api.Snapshot, defID string, def api.WorkflowDefinition, stage string, inputs []api.Review) (err error) {
model := workflow.Get(def, stage).Model
vendor := workflow.VendorOf(model)
reviewID := store.NewID()
@@ -305,7 +305,7 @@ func (m *Manager) startReviewer(ctx context.Context, task api.Task, project api.
Error: "the reviewer didn't start: " + err.Error(),
CreatedAt: now,
FinishedAt: &now,
}, &def)
}, defID)
if rerr != nil {
slog.Error("record review that didn't start", "task", task.Id, "stage", stage, "err", rerr)
return
@@ -356,7 +356,7 @@ func (m *Manager) startReviewer(ctx context.Context, task api.Task, project api.
Model: model,
State: api.ReviewStateRunning,
CreatedAt: time.Now().UTC(),
}, &def)
}, defID)
if err != nil {
m.endReviewer(ctx, sess.Id, project, reviewID)
return err