@@ -18,8 +18,9 @@ pub(crate) fn create_diff(
1818 github : Box < dyn GithubRead > ,
1919 teams : Vec < rust_team_data:: v1:: Team > ,
2020 repos : Vec < rust_team_data:: v1:: Repo > ,
21+ config : rust_team_data:: v1:: Config ,
2122) -> anyhow:: Result < Diff > {
22- let github = SyncGitHub :: new ( github, teams, repos) ?;
23+ let github = SyncGitHub :: new ( github, teams, repos, config ) ?;
2324 github. diff_all ( )
2425}
2526
@@ -29,6 +30,7 @@ struct SyncGitHub {
2930 github : Box < dyn GithubRead > ,
3031 teams : Vec < rust_team_data:: v1:: Team > ,
3132 repos : Vec < rust_team_data:: v1:: Repo > ,
33+ config : rust_team_data:: v1:: Config ,
3234 usernames_cache : HashMap < u64 , String > ,
3335 org_owners : HashMap < OrgName , HashSet < u64 > > ,
3436 org_members : HashMap < OrgName , HashMap < u64 , String > > ,
@@ -39,6 +41,7 @@ impl SyncGitHub {
3941 github : Box < dyn GithubRead > ,
4042 teams : Vec < rust_team_data:: v1:: Team > ,
4143 repos : Vec < rust_team_data:: v1:: Repo > ,
44+ config : rust_team_data:: v1:: Config ,
4245 ) -> anyhow:: Result < Self > {
4346 debug ! ( "caching mapping between user ids and usernames" ) ;
4447 let users = teams
@@ -72,6 +75,7 @@ impl SyncGitHub {
7275 github,
7376 teams,
7477 repos,
78+ config,
7579 usernames_cache,
7680 org_owners,
7781 org_members,
@@ -118,12 +122,29 @@ impl SyncGitHub {
118122 panic ! ( "GitHub organization {org} not found" ) ;
119123 } ;
120124
121- // Remove all members that are in TOML teams
125+ // Initialize `members_to_remove` to all GitHub members in the org.
126+ // Next, we'll delete members from `members_to_remove` that don't respect certain criteria.
122127 let mut members_to_remove = gh_org_members. clone ( ) ;
128+
129+ // Remove all members that are in TOML teams.
130+ // We want people who belong to a team to stay in the org.
123131 for member in toml_members {
124132 members_to_remove. remove ( & member) ;
125133 }
126134
135+ // Remove members that are explicitly allowed by config.
136+ // These are usually bots or admins that should stay in the org.
137+ for allowed_member in & self . config . allowed_org_members {
138+ // Look for the member by username in the members_to_remove map
139+ if let Some ( member_to_retain) = members_to_remove
140+ . iter ( )
141+ . find ( |( _, username) | username == & allowed_member)
142+ . map ( |( id, _) | * id)
143+ {
144+ members_to_remove. remove ( & member_to_retain) ;
145+ }
146+ }
147+
127148 // The rest are members that should be removed
128149 if !members_to_remove. is_empty ( ) {
129150 let mut members_to_remove: Vec < String > = members_to_remove. into_values ( ) . collect ( ) ;
@@ -735,7 +756,7 @@ struct OrgMembershipDiff {
735756impl OrgMembershipDiff {
736757 fn apply ( self , sync : & GitHubWrite ) -> anyhow:: Result < ( ) > {
737758 for member in & self . members_to_remove {
738- sync. remove_gh_member_from_org ( & self . org , & member) ?;
759+ sync. remove_gh_member_from_org ( & self . org , member) ?;
739760 }
740761
741762 Ok ( ( ) )
0 commit comments