refactor(hive-forge): share latest-per-reviewer logic between pr-status and pr-merge
pr-status and pr-merge both computed 'latest non-comment review verdict per reviewer' independently (identical oldest-first, COMMENT/PENDING-skipping, supersede-by-later loop). Extract it to a shared verbs::latest_reviews helper so the verdict semantics live in one place and can't drift between the health view and the pre-merge changes-requested gate. Pure dedup, no behaviour change.
This commit is contained in:
parent
f6e1651dff
commit
f633abbdc4
3 changed files with 42 additions and 53 deletions
|
|
@ -136,30 +136,10 @@ fn check_ready(client: &Client, repo: &str, number: u64, pull: &Value) -> Result
|
|||
}
|
||||
}
|
||||
|
||||
// Latest verdict per reviewer wins (reviews page oldest-first), so a
|
||||
// later APPROVED supersedes an earlier REQUEST_CHANGES. Block only on
|
||||
// reviewers whose *current* verdict requests changes.
|
||||
let reviews = client.get_json_all(&format!("/repos/{repo}/pulls/{number}/reviews"), 10)?;
|
||||
let mut latest: Vec<(String, String)> = Vec::new();
|
||||
for r in &reviews {
|
||||
let Some(login) = r
|
||||
.get("user")
|
||||
.and_then(|u| u.get("login"))
|
||||
.and_then(Value::as_str)
|
||||
else {
|
||||
continue;
|
||||
};
|
||||
let st = r.get("state").and_then(Value::as_str).unwrap_or("");
|
||||
if st == "COMMENT" || st == "PENDING" || st.is_empty() {
|
||||
continue;
|
||||
}
|
||||
if let Some(slot) = latest.iter_mut().find(|(l, _)| l == login) {
|
||||
st.clone_into(&mut slot.1);
|
||||
} else {
|
||||
latest.push((login.to_owned(), st.to_owned()));
|
||||
}
|
||||
}
|
||||
let blockers: Vec<String> = latest
|
||||
// Block only on reviewers whose *current* verdict requests changes
|
||||
// (latest-per-reviewer, so a later APPROVED clears an earlier
|
||||
// REQUEST_CHANGES). Shares the verdict logic with `pr-status`.
|
||||
let blockers: Vec<String> = super::latest_reviews(client, repo, number)?
|
||||
.into_iter()
|
||||
.filter(|(_, st)| st == "REQUEST_CHANGES")
|
||||
.map(|(login, _)| login)
|
||||
|
|
|
|||
Loading…
Reference in a new issue