Claim a held merge as soon as the merge ahead of it finishes
This commit is contained in:
@@ -115,9 +115,15 @@ func (s *Store) StartDiscardTurn(ctx context.Context, taskID, sessionID, actor s
|
||||
})
|
||||
}
|
||||
|
||||
func (s *Store) EndTurn(ctx context.Context, sessionID, actor string, payload map[string]any, turn *api.Event, reviewRequest, finalizeMerge bool) (DiscardState, string, error) {
|
||||
next := DiscardNone
|
||||
finalizing := ""
|
||||
type TurnEnd struct {
|
||||
Discard DiscardState
|
||||
FinalizeBy string
|
||||
MergeBy string
|
||||
MergeWaiting bool
|
||||
}
|
||||
|
||||
func (s *Store) EndTurn(ctx context.Context, sessionID, actor string, payload map[string]any, turn *api.Event, reviewRequest, finalizeMerge, continues bool) (TurnEnd, error) {
|
||||
end := TurnEnd{Discard: DiscardNone}
|
||||
err := s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
|
||||
taskID := ""
|
||||
projectID := ""
|
||||
@@ -126,10 +132,14 @@ func (s *Store) EndTurn(ctx context.Context, sessionID, actor string, payload ma
|
||||
state := DiscardNone
|
||||
discardSession := ""
|
||||
lead := false
|
||||
mergeAfterTurn := false
|
||||
othersRunning := false
|
||||
err := tx.QueryRowContext(ctx, `
|
||||
SELECT coalesce(t.id, ''), coalesce(t.project_id, ''), s.owner, s.role, coalesce(t.discard_state, ''), coalesce(t.discard_session, ''),
|
||||
s.member = coalesce((SELECT f.member FROM agent_sessions f WHERE f.task_id = s.task_id AND f.role = s.role ORDER BY f.created_at LIMIT 1), '')
|
||||
FROM agent_sessions s LEFT JOIN tasks t ON t.id = s.task_id WHERE s.id = ?`, sessionID).Scan(&taskID, &projectID, &owner, &role, &state, &discardSession, &lead)
|
||||
s.member = coalesce((SELECT f.member FROM agent_sessions f WHERE f.task_id = s.task_id AND f.role = s.role ORDER BY f.created_at LIMIT 1), ''),
|
||||
coalesce(t.merge_after_turn, 0),
|
||||
EXISTS (SELECT 1 FROM agent_sessions o WHERE o.task_id = s.task_id AND o.role = s.role AND o.state = ? AND o.id != s.id)
|
||||
FROM agent_sessions s LEFT JOIN tasks t ON t.id = s.task_id WHERE s.id = ?`, string(api.AgentSessionStateRunning), sessionID).Scan(&taskID, &projectID, &owner, &role, &state, &discardSession, &lead, &mergeAfterTurn, &othersRunning)
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
return ErrNotFound
|
||||
}
|
||||
@@ -167,19 +177,23 @@ func (s *Store) EndTurn(ctx context.Context, sessionID, actor string, payload ma
|
||||
}
|
||||
switch {
|
||||
case state == DiscardHeld:
|
||||
next = DiscardHeld
|
||||
end.Discard = DiscardHeld
|
||||
case state == DiscardRunning && discardSession == sessionID:
|
||||
next = DiscardClosing
|
||||
end.Discard = DiscardClosing
|
||||
_, err = tx.ExecContext(ctx, `UPDATE tasks SET discard_state = ? WHERE id = ?`, string(DiscardClosing), taskID)
|
||||
case mergeAfterTurn && (othersRunning || continues):
|
||||
end.MergeWaiting = true
|
||||
case mergeAfterTurn:
|
||||
err = tx.QueryRowContext(ctx, `UPDATE tasks SET merge_after_turn = 0 WHERE id = ? RETURNING merging_by`, taskID).Scan(&end.MergeBy)
|
||||
case state == DiscardNone && finalizeMerge && lead:
|
||||
err = tx.QueryRowContext(ctx, `UPDATE tasks SET finalizing = merging_by, merging_by = '' WHERE id = ? AND merging_by != '' RETURNING finalizing`, taskID).Scan(&finalizing)
|
||||
err = tx.QueryRowContext(ctx, `UPDATE tasks SET finalizing = merging_by, merging_by = '' WHERE id = ? AND merging_by != '' RETURNING finalizing`, taskID).Scan(&end.FinalizeBy)
|
||||
if errors.Is(err, sql.ErrNoRows) {
|
||||
err = nil
|
||||
}
|
||||
}
|
||||
return err
|
||||
})
|
||||
return next, finalizing, err
|
||||
return end, err
|
||||
}
|
||||
|
||||
func (s *Store) CloseDiscard(ctx context.Context, taskID string) error {
|
||||
|
||||
Reference in New Issue
Block a user