Coverage for src / gh_secrets_and_vars_async / config.py: 100%

56 statements  

« prev     ^ index     » next       coverage.py v7.13.5, created at 2026-04-16 17:56 +0000

1import click 

2from github.GithubException import GithubException 

3from loguru import logger 

4from rich import print 

5 

6from .common import configure_logging, get_github_repo, load_env_config 

7 

8 

9def get_auto_merge_status(repo) -> bool: 

10 """Return True if auto-merge is enabled on the repository.""" 

11 return repo.allow_auto_merge or False 

12 

13 

14def has_dev_branch(repo) -> bool: 

15 """Check if the repository has a dev branch.""" 

16 try: 

17 repo.get_branch("dev") 

18 return True 

19 except GithubException: 

20 return False 

21 

22 

23def set_auto_merge(repo, enabled: bool, dry_run: bool = False) -> None: 

24 """Enable or disable auto-merge on the repository.""" 

25 current = get_auto_merge_status(repo) 

26 action = "enable" if enabled else "disable" 

27 

28 if current == enabled: 

29 print(f"Auto-merge is already {'enabled' if enabled else 'disabled'}.") 

30 return 

31 

32 if dry_run: 

33 logger.info(f"[DRY RUN] Would {action} auto-merge.") 

34 else: 

35 repo.edit(allow_auto_merge=enabled) 

36 logger.info(f"Auto-merge {action}d.") 

37 

38 print(f"Auto-merge: {'enabled' if enabled else 'disabled'}") 

39 

40 

41def set_repo_settings(repo, dry_run: bool = False) -> None: 

42 """Apply standardized repository merge and auto-merge settings. 

43 

44 Enforces merge commits only (no squash/rebase), PR_TITLE/PR_BODY format, 

45 auto-merge enabled, and always delete branches on merge. Dev branches 

46 are protected from deletion by the branch ruleset, not by this flag. 

47 """ 

48 if dry_run: 

49 logger.info("[DRY RUN] Would set: merge commits only, delete_branch_on_merge=True") 

50 print("[dim]Would apply standard settings (delete_branch_on_merge=True)[/dim]") 

51 return 

52 

53 repo.edit( 

54 allow_merge_commit=True, 

55 allow_squash_merge=False, 

56 allow_rebase_merge=False, 

57 allow_auto_merge=True, 

58 merge_commit_title="PR_TITLE", 

59 merge_commit_message="PR_BODY", 

60 delete_branch_on_merge=True, 

61 ) 

62 logger.info("Repository settings updated.") 

63 print("Merge: commits only (PR_TITLE / PR_BODY), delete_branch_on_merge=True") 

64 

65 

66def display_repo_settings(repo, gh_account: str, gh_repo: str) -> None: 

67 """Display current repository settings.""" 

68 print(f"Repository: {gh_account}/{gh_repo}") 

69 print(f" Auto-merge: {'enabled' if get_auto_merge_status(repo) else 'disabled'}") 

70 print(f" Merge commit: {'allowed' if repo.allow_merge_commit else 'disabled'}") 

71 print(f" Squash merge: {'allowed' if repo.allow_squash_merge else 'disabled'}") 

72 print(f" Rebase merge: {'allowed' if repo.allow_rebase_merge else 'disabled'}") 

73 print(f" Delete branch on merge: {repo.delete_branch_on_merge}") 

74 

75 

76@click.command("config") 

77@click.option("--status", is_flag=True, default=False, help="Show current repo settings.") 

78@click.option("--auto-merge/--no-auto-merge", default=None, help="Enable or disable auto-merge.") 

79@click.option( 

80 "--standardize", 

81 is_flag=True, 

82 help="Apply standard merge settings (merge commits only, auto-merge, PR_TITLE).", 

83) 

84@click.option("--verbose", "-v", is_flag=True, help="Print detailed output.") 

85@click.option( 

86 "--dry-run", "-d", is_flag=True, help="Show what would be done without making changes." 

87) 

88def config_command( 

89 status: bool, auto_merge: bool | None, standardize: bool, verbose: bool, dry_run: bool 

90): 

91 """Check or set repository configuration (merge strategy, auto-merge, etc.).""" 

92 configure_logging(verbose) 

93 gh_repo, gh_account, gh_token = load_env_config() 

94 if not gh_repo or not gh_account: 

95 raise click.ClickException("GH_REPO and GH_ACCOUNT must be set in .env or environment.") 

96 

97 repo = get_github_repo(gh_account, gh_repo) 

98 

99 if standardize: 

100 set_repo_settings(repo, dry_run=dry_run) 

101 elif auto_merge is not None: 

102 set_auto_merge(repo, auto_merge, dry_run=dry_run) 

103 else: 

104 display_repo_settings(repo, gh_account, gh_repo)