Skip to content

Commit 3f7ff18

Browse files
committed
Keep information about review candidates longer
1 parent 6792a75 commit 3f7ff18

File tree

1 file changed

+17
-12
lines changed

1 file changed

+17
-12
lines changed

src/handlers/assign.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -840,13 +840,13 @@ async fn find_reviewer_from_names(
840840
.to_string())
841841
}
842842

843-
#[derive(Eq, PartialEq, Hash)]
843+
#[derive(Eq, PartialEq, Hash, Debug)]
844844
struct ReviewerCandidate {
845845
name: String,
846846
origin: ReviewerCandidateOrigin,
847847
}
848848

849-
#[derive(Eq, PartialEq, Hash, Copy, Clone)]
849+
#[derive(Eq, PartialEq, Hash, Copy, Clone, Debug)]
850850
enum ReviewerCandidateOrigin {
851851
/// This reviewer was directly requested for a review.
852852
Direct,
@@ -976,7 +976,7 @@ async fn candidate_reviewers_from_names<'a>(
976976

977977
// Set of candidate usernames to choose from.
978978
// We go through each expanded candidate and store either success or an error for them.
979-
let mut candidates: Vec<Result<String, FindReviewerError>> = Vec::new();
979+
let mut candidates: Vec<Result<ReviewerCandidate, FindReviewerError>> = Vec::new();
980980
let previous_reviewer_names = get_previous_reviewer_names(db, issue).await;
981981

982982
// Step 2: pre-filter candidates based on checks that we can perform quickly
@@ -1022,7 +1022,7 @@ async fn candidate_reviewers_from_names<'a>(
10221022
if let Some(error_reason) = reason {
10231023
candidates.push(Err(error_reason));
10241024
} else {
1025-
candidates.push(Ok(reviewer_candidate.name));
1025+
candidates.push(Ok(reviewer_candidate));
10261026
}
10271027
}
10281028
assert_eq!(candidates.len(), expanded_count);
@@ -1031,7 +1031,7 @@ async fn candidate_reviewers_from_names<'a>(
10311031
// Step 3: gather potential usernames to form a DB query for review preferences
10321032
let usernames: Vec<String> = candidates
10331033
.iter()
1034-
.filter_map(|res| res.as_deref().ok().map(|s| s.to_string()))
1034+
.filter_map(|res| res.as_ref().ok().map(|s| s.name.to_string()))
10351035
.collect();
10361036
let usernames: Vec<&str> = usernames.iter().map(|s| s.as_str()).collect();
10371037
let review_prefs = get_review_prefs_batch(db, &usernames)
@@ -1044,35 +1044,40 @@ async fn candidate_reviewers_from_names<'a>(
10441044
// Step 4: check review preferences
10451045
candidates = candidates
10461046
.into_iter()
1047-
.map(|username| {
1047+
.map(|candidate| {
10481048
// Only consider candidates that did not have an earlier error
1049-
let username = username?;
1049+
let candidate = candidate?;
1050+
let username = &candidate.name;
10501051

10511052
// If no review prefs were found, we assume the default unlimited
10521053
// review capacity and being on rotation.
10531054
let Some(review_prefs) = review_prefs.get(username.as_str()) else {
1054-
return Ok(username);
1055+
return Ok(candidate);
10551056
};
10561057
if let Some(capacity) = review_prefs.max_assigned_prs {
10571058
let assigned_prs = workqueue.assigned_pr_count(review_prefs.user_id as UserId);
10581059
// Is the reviewer at max capacity?
10591060
if (assigned_prs as i32) >= capacity {
1060-
return Err(FindReviewerError::ReviewerAtMaxCapacity { username });
1061+
return Err(FindReviewerError::ReviewerAtMaxCapacity {
1062+
username: username.clone(),
1063+
});
10611064
}
10621065
}
10631066
if review_prefs.rotation_mode == RotationMode::OffRotation {
1064-
return Err(FindReviewerError::ReviewerOffRotation { username });
1067+
return Err(FindReviewerError::ReviewerOffRotation {
1068+
username: username.clone(),
1069+
});
10651070
}
10661071

1067-
return Ok(username);
1072+
return Ok(candidate);
10681073
})
10691074
.collect();
10701075
}
10711076
assert_eq!(candidates.len(), expanded_count);
10721077

10731078
let valid_candidates: HashSet<&str> = candidates
10741079
.iter()
1075-
.filter_map(|res| res.as_deref().ok())
1080+
.filter_map(|res| res.as_ref().ok().map(|c| c.name.as_str()))
10761081
.collect();
10771082

10781083
log::debug!(

0 commit comments

Comments
 (0)