From bc362846e01a114c3de1958b814d27557c66f6af Mon Sep 17 00:00:00 2001 From: vivekjami Date: Thu, 23 Oct 2025 02:18:05 +0530 Subject: [PATCH 1/2] chore : validate no duplicate team members #1918 --- src/validate.rs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/validate.rs b/src/validate.rs index 386a331da..495b6a5a8 100644 --- a/src/validate.rs +++ b/src/validate.rs @@ -220,17 +220,29 @@ fn validate_team_leads(data: &Data, errors: &mut Vec) { }); } -/// Ensure team members are people +/// Ensure team members are people and don't contain duplicates fn validate_team_members(data: &Data, errors: &mut Vec) { wrapper(data.teams(), errors, |team, errors| { + let mut seen = std::collections::HashSet::new(); wrapper(team.members(data)?.iter(), errors, |member, _| { + // Check if member exists if data.person(member).is_none() { bail!( - "person `{}` is member of team `{}` but doesn't exist", + "person {} is member of team {} but doesn't exist", member, team.name() ); } + + // Check for duplicates + if !seen.insert(member) { + bail!( + "person {} is listed multiple times in team {}", + member, + team.name() + ); + } + Ok(()) }); Ok(()) From 5cb4a4c1872e51779d840f3c632e341fac58f964 Mon Sep 17 00:00:00 2001 From: vivekjami Date: Thu, 23 Oct 2025 23:52:34 +0530 Subject: [PATCH 2/2] chore: add explicitmember check --- src/validate.rs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/validate.rs b/src/validate.rs index 495b6a5a8..957bfa1f6 100644 --- a/src/validate.rs +++ b/src/validate.rs @@ -220,29 +220,30 @@ fn validate_team_leads(data: &Data, errors: &mut Vec) { }); } -/// Ensure team members are people and don't contain duplicates +/// Ensure team members are real people and not duplicated fn validate_team_members(data: &Data, errors: &mut Vec) { wrapper(data.teams(), errors, |team, errors| { - let mut seen = std::collections::HashSet::new(); - wrapper(team.members(data)?.iter(), errors, |member, _| { - // Check if member exists - if data.person(member).is_none() { + // Check for duplicate members in explicit_members + let mut seen = HashSet::new(); + for member in team.explicit_members() { + if !seen.insert(&member.github) { bail!( - "person {} is member of team {} but doesn't exist", - member, + "person `{}` is duplicated in team `{}`", + member.github, team.name() ); } - - // Check for duplicates - if !seen.insert(member) { + } + + // Existing validation: ensure members are real people + wrapper(team.members(data)?.iter(), errors, |member, _| { + if data.person(member).is_none() { bail!( - "person {} is listed multiple times in team {}", + "person `{}` is member of team `{}` but doesn't exist", member, team.name() ); } - Ok(()) }); Ok(())