@@ -876,8 +876,12 @@ def print_diff(
876876 header_to_add : str ,
877877 header_to_remove : str ,
878878 header_to_change : str ,
879- ) -> None :
879+ ) -> bool :
880+ has_diff = False
881+
880882 if len (self .to_add ) > 0 :
883+ has_diff = True
884+
881885 print (header_to_add )
882886 for entry in self .to_add :
883887 print ()
@@ -886,6 +890,8 @@ def print_diff(
886890 print ()
887891
888892 if len (self .to_remove ) > 0 :
893+ has_diff = True
894+
889895 print (header_to_remove )
890896 for entry in self .to_remove :
891897 print ()
@@ -894,6 +900,8 @@ def print_diff(
894900 print ()
895901
896902 if len (self .to_change ) > 0 :
903+ has_diff = True
904+
897905 print (header_to_change )
898906 for change in self .to_change :
899907 print ()
@@ -904,36 +912,48 @@ def print_diff(
904912
905913 print ()
906914
915+ return has_diff
907916
908917def print_team_members_diff (
909918 * ,
910919 team_name : str ,
911920 target_fname : str ,
912921 target_members : Set [TeamMember ],
913922 actual_members : Set [TeamMember ],
914- ) -> None :
923+ ) -> bool :
924+ has_diff = False
915925 members_diff = Diff .new (
916926 target = target_members ,
917927 actual = actual_members ,
918928 )
929+
919930 if len (members_diff .to_remove ) > 0 :
931+ has_diff = True
932+
920933 print (
921934 f"The following members of team '{ team_name } ' are not specified "
922935 f"in { target_fname } , but are present on GitHub:\n "
923936 )
924937 for member in sorted (members_diff .to_remove ):
925938 print (f" { member .user_name } " )
939+
926940 print ()
927941
928942 if len (members_diff .to_add ) > 0 :
943+ has_diff = True
944+
929945 print (
930946 f"The following members of team '{ team_name } ' are specified "
931947 f"in { target_fname } , but are not present on GitHub:\n "
932948 )
933949 for member in sorted (members_diff .to_add ):
934950 print (f" { member .user_name } " )
951+
935952 print ()
936953
954+ return has_diff
955+
956+
937957
938958def main () -> None :
939959 if "--help" in sys .argv :
@@ -951,6 +971,7 @@ def main() -> None:
951971 print ("See also --help." )
952972 sys .exit (1 )
953973
974+ has_changes = False
954975 target_fname = sys .argv [1 ]
955976 target = Configuration .from_toml_file (target_fname )
956977 org_name = target .organization .name
@@ -962,7 +983,7 @@ def main() -> None:
962983 target .get_repository_target (r ) for r in actual_repos
963984 }
964985 repos_diff = Diff .new (target = target_repos , actual = actual_repos )
965- repos_diff .print_diff (
986+ has_changes |= repos_diff .print_diff (
966987 f"The following repositories are specified in { target_fname } but not present on GitHub:" ,
967988 # Even though we generate the targets form the actuals using the default
968989 # settings, it can happen that we match on repository name but not id
@@ -974,6 +995,7 @@ def main() -> None:
974995
975996 current_org = client .get_organization (org_name )
976997 if current_org != target .organization :
998+ has_changes = True
977999 print ("The organization-level settings need to be changed as follows:\n " )
9781000 print_simple_diff (
9791001 actual = current_org .format_toml (),
@@ -982,15 +1004,15 @@ def main() -> None:
9821004
9831005 current_members = set (client .get_organization_members (org_name ))
9841006 members_diff = Diff .new (target = target .members , actual = current_members )
985- members_diff .print_diff (
1007+ has_changes |= members_diff .print_diff (
9861008 f"The following members are specified in { target_fname } but not a member of the GitHub organization:" ,
9871009 f"The following members are not specified in { target_fname } but are a member of the GitHub organization:" ,
9881010 f"The following members on GitHub need to be changed to match { target_fname } :" ,
9891011 )
9901012
9911013 current_teams = set (client .get_organization_teams (org_name ))
9921014 teams_diff = Diff .new (target = target .teams , actual = current_teams )
993- teams_diff .print_diff (
1015+ has_changes |= teams_diff .print_diff (
9941016 f"The following teams specified in { target_fname } are not present on GitHub:" ,
9951017 f"The following teams are not specified in { target_fname } but are present on GitHub:" ,
9961018 f"The following teams on GitHub need to be changed to match { target_fname } :" ,
@@ -1004,7 +1026,7 @@ def main() -> None:
10041026 team for team in current_teams if team .name in target_team_names
10051027 ]
10061028 for team in existing_desired_teams :
1007- print_team_members_diff (
1029+ has_changes |= print_team_members_diff (
10081030 team_name = team .name ,
10091031 target_fname = target_fname ,
10101032 target_members = {
@@ -1013,6 +1035,9 @@ def main() -> None:
10131035 actual_members = set (client .get_team_members (org_name , team )),
10141036 )
10151037
1038+ if has_changes :
1039+ sys .exit (2 )
1040+
10161041
10171042if __name__ == "__main__" :
10181043 main ()
0 commit comments