import logging import click import pydantic import frg.forgejo.browser as forgejo_browser import frg.git as git from frg.configuration import Config, get_configuration from frg.context import GitContext, get_git_context logger = logging.getLogger(__name__) class CliContext(pydantic.BaseModel): config: Config git: GitContext verbose: bool @click.group() @click.option( "-v", "--verbose", default=False, type=bool, is_flag=True, help="Exposes extra logging.", ) @click.pass_context def cli(ctx, verbose: bool): """ A command-line tool to interact with different kinds of code forges. """ if verbose: logging.basicConfig(level=logging.INFO) config = get_configuration() logger.info(f"Config: {config}") git_context = get_git_context(domain_aliases=config.domain_aliases) logger.info(f"Context: {git_context}") ctx.obj = CliContext(git=git_context, config=config, verbose=verbose) @cli.group() @click.pass_obj def pr(ctx): """Interacts with pull requests.""" pass @pr.command(name="create") @click.option( "-w", "--web", type=bool, is_flag=True, help="Opens the pull-request page in the default browser.", ) @click.pass_obj def create_pr(ctx, web: bool): """Interacts with pull requests.""" git.push(branch=ctx.git.current_branch) if web: forgejo_browser.create_pull_request_via_web( head=ctx.git.current_branch, host=ctx.git.host, repo=ctx.git.repo_name, owner=ctx.git.repo_author, ) else: raise NotImplementedError("--web is the only mode supported.") @cli.group() @click.pass_obj def repo(ctx): """Interacts with repositories""" pass @repo.command(name="view") @click.option( "-w", "--web", type=bool, is_flag=True, help="Opens the repository page in the default browser.", ) @click.pass_obj def view_repo(ctx, web: bool): """View the current repository.""" if web: forgejo_browser.view_repository_via_web( host=ctx.git.host, repo=ctx.git.repo_name, owner=ctx.git.repo_author ) else: raise NotImplementedError("--web is the only mode supported.") def main(): try: cli() except Exception as e: click.secho(f"Error: {e}", fg="red", bold=True) if __name__ == "__main__": main()