forge-tools/frg/cli.py

109 lines
2.3 KiB
Python

import click
import pydantic
import frg.forgejo.browser as forgejo_browser
from frg.context import get_git_context, GitContext
from frg.configuration import get_configuration, Config
import logging
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."""
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()