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
« 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
6from .common import configure_logging, get_github_repo, load_env_config
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
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
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"
28 if current == enabled:
29 print(f"Auto-merge is already {'enabled' if enabled else 'disabled'}.")
30 return
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.")
38 print(f"Auto-merge: {'enabled' if enabled else 'disabled'}")
41def set_repo_settings(repo, dry_run: bool = False) -> None:
42 """Apply standardized repository merge and auto-merge settings.
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
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")
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}")
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.")
97 repo = get_github_repo(gh_account, gh_repo)
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)