fix. harden Go review flow
Fix runner bootstrap and auth handling, preserve queued SHAs, make event/job acceptance atomic, fence stale runs, correct retries and prompts, add fake end-to-end coverage, and fix deployment defaults. Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
+41
-37
@@ -136,7 +136,44 @@ func (s *Server) webhook(w http.ResponseWriter, r *http.Request) {
|
||||
writeJSON(w, 200, map[string]any{"accepted": false, "reason": "no codex command"})
|
||||
return
|
||||
}
|
||||
inserted, err := s.store.InsertWebhookEvent(r.Context(), event)
|
||||
|
||||
if cmd.IsReview() {
|
||||
pr, prErr := s.gitea.GetPullRequest(r.Context(), event.Repo, event.PRNumber)
|
||||
if prErr == nil {
|
||||
event.HeadSHA = pr.HeadSHA
|
||||
if text, configured, cfgErr := s.gitea.GetFileContent(r.Context(), event.Repo, ".codex-review.yml", event.HeadSHA); cfgErr != nil {
|
||||
writeError(w, cfgErr)
|
||||
return
|
||||
} else if configured {
|
||||
cfg, parseErr := review.ParseRepoConfig(text)
|
||||
if parseErr != nil {
|
||||
writeError(w, parseErr)
|
||||
return
|
||||
}
|
||||
review.ApplyServerMaxDiff(&cfg, s.settings.MaxDiffBytes)
|
||||
if !cfg.Enabled {
|
||||
inserted, eventErr := s.store.InsertWebhookEvent(r.Context(), event)
|
||||
if eventErr != nil {
|
||||
writeError(w, eventErr)
|
||||
return
|
||||
}
|
||||
if !inserted {
|
||||
writeJSON(w, 200, map[string]any{"accepted": true, "reason": "duplicate event"})
|
||||
return
|
||||
}
|
||||
_, _ = s.gitea.PostIssueComment(r.Context(), event.Repo, event.PRNumber, review.FormatDisabledAck())
|
||||
writeJSON(w, 200, map[string]any{"accepted": true, "reason": "review disabled by repo config"})
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
cooldown := time.Duration(0)
|
||||
if cmd.Name == "review" {
|
||||
cooldown = time.Duration(s.settings.CooldownSeconds) * time.Second
|
||||
}
|
||||
job, inserted, remaining, err := s.store.EnqueueAcceptedJob(r.Context(), event, cmd, cooldown)
|
||||
if err != nil {
|
||||
writeError(w, err)
|
||||
return
|
||||
@@ -145,42 +182,9 @@ func (s *Server) webhook(w http.ResponseWriter, r *http.Request) {
|
||||
writeJSON(w, 200, map[string]any{"accepted": true, "reason": "duplicate event"})
|
||||
return
|
||||
}
|
||||
if cmd.IsReview() {
|
||||
pr, prErr := s.gitea.GetPullRequest(r.Context(), event.Repo, event.PRNumber)
|
||||
if prErr == nil {
|
||||
event.HeadSHA = pr.HeadSHA
|
||||
}
|
||||
cfg := review.MissingRepoConfig()
|
||||
if prErr == nil {
|
||||
if text, configured, cfgErr := s.gitea.GetFileContent(r.Context(), event.Repo, ".codex-review.yml", event.HeadSHA); cfgErr == nil && configured {
|
||||
cfg, err = review.ParseRepoConfig(text)
|
||||
if err != nil {
|
||||
writeError(w, err)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
if !cfg.Enabled {
|
||||
_, _ = s.gitea.PostIssueComment(r.Context(), event.Repo, event.PRNumber, review.FormatDisabledAck())
|
||||
writeJSON(w, 200, map[string]any{"accepted": true, "reason": "review disabled by repo config"})
|
||||
return
|
||||
}
|
||||
if cmd.Name != "rerun" {
|
||||
remaining, err := s.store.CooldownRemaining(r.Context(), event.Repo, event.PRNumber, time.Duration(s.settings.CooldownSeconds)*time.Second)
|
||||
if err != nil {
|
||||
writeError(w, err)
|
||||
return
|
||||
}
|
||||
if remaining > 0 {
|
||||
_, _ = s.gitea.PostIssueComment(r.Context(), event.Repo, event.PRNumber, review.FormatCooldownAck(remaining))
|
||||
writeJSON(w, 200, map[string]any{"accepted": true, "reason": "cooldown active", "cooldown_seconds_remaining": remaining})
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
job, err := s.store.EnqueueJob(r.Context(), event, cmd)
|
||||
if err != nil {
|
||||
writeError(w, err)
|
||||
if remaining > 0 {
|
||||
_, _ = s.gitea.PostIssueComment(r.Context(), event.Repo, event.PRNumber, review.FormatCooldownAck(remaining))
|
||||
writeJSON(w, 200, map[string]any{"accepted": true, "reason": "cooldown active", "cooldown_seconds_remaining": remaining})
|
||||
return
|
||||
}
|
||||
if cmd.IsReview() {
|
||||
|
||||
Reference in New Issue
Block a user