| 155 | } |
| 156 | |
| 157 | func evalSubmitPullRequestReview(item CreatedItemReport, repoOverride string) OutcomeReport { |
| 158 | repo := resolveItemRepo(item, repoOverride) |
| 159 | num := resolveItemNumber(item) |
| 160 | report := OutcomeReport{ |
| 161 | Type: item.Type, |
| 162 | ObjectURL: item.URL, |
| 163 | ObjectNumber: num, |
| 164 | Repo: repo, |
| 165 | } |
| 166 | outcomeReviewLog.Printf("Evaluating submit-review outcome: repo=%s, pr=%d", repo, num) |
| 167 | if num == 0 || repo == "" { |
| 168 | report.Result = OutcomeError |
| 169 | report.EvalError = "missing PR number or repo" |
| 170 | return report |
| 171 | } |
| 172 | |
| 173 | pr, err := outcomeReviewGHAPIGet(fmt.Sprintf("pulls/%d", num), repo) |
| 174 | if err != nil { |
| 175 | report.Result = OutcomeError |
| 176 | report.EvalError = err.Error() |
| 177 | return report |
| 178 | } |
| 179 | reviews, err := outcomeReviewGHAPIGetArray(fmt.Sprintf("pulls/%d/reviews", num), repo) |
| 180 | if err != nil { |
| 181 | report.Result = OutcomeError |
| 182 | report.EvalError = err.Error() |
| 183 | return report |
| 184 | } |
| 185 | |
| 186 | reviewID := metadataInt(item.Metadata, "review_id") |
| 187 | review := findReviewByID(reviews, reviewID) |
| 188 | if review == nil { |
| 189 | review = latestReviewAfterTimestamp(reviews, item.Timestamp) |
| 190 | } |
| 191 | if review == nil { |
| 192 | outcomeReviewLog.Printf("Submitted review not found for PR #%d (reviewID=%d, reviews=%d)", num, reviewID, len(reviews)) |
| 193 | report.Result = OutcomeUnknown |
| 194 | report.Detail = "submitted review not found" |
| 195 | report.OutcomeEvaluation = OutcomeEvaluation{ |
| 196 | OutcomeStatus: OutcomeStatusUnknown, |
| 197 | EvidenceStrength: EvidenceWeak, |
| 198 | Signal: "review_missing", |
| 199 | } |
| 200 | return report |
| 201 | } |
| 202 | |
| 203 | reviewState := strings.ToUpper(outcomeString(review["state"])) |
| 204 | reviewSubmittedAt := outcomeString(review["submitted_at"]) |
| 205 | prMerged, _ := pr["merged"].(bool) |
| 206 | prState, _ := pr["state"].(string) |
| 207 | |
| 208 | switch { |
| 209 | case reviewState == "DISMISSED": //nolint:tolowerequalfold |
| 210 | report.Result = OutcomeRejected |
| 211 | report.Detail = "review dismissed by repo admin" |
| 212 | report.OutcomeEvaluation = OutcomeEvaluation{ |
| 213 | OutcomeStatus: OutcomeStatusRejected, |
| 214 | EvidenceStrength: EvidenceStrong, |