"""Generate a message to ping people responsible for one or more files. """ from pathlib import Path from milc import cli from qmk.maintainers import maintainers @cli.argument('--pr', type=int, arg_only=True, help="PR to send ping to (optional)") @cli.argument('--owner', default='qmk', arg_only=True, help="Owner for the repo (Default: qmk)") @cli.argument('--repo', default='qmk_firmware', arg_only=True, help="Repo to send pings to (Default: qmk_firmware)") @cli.argument("files", type=Path, arg_only=True, nargs='*', help="File to ping maintainers for.") @cli.subcommand("Ping the maintainers and request reviews for one or more files.") def ping_maintainers(cli): """Ping the maintainers for one or more files. """ github_maintainers = set() github_teams = set() for file in cli.args.files: for maintainer in maintainers(file): if '/' in maintainer: github_teams.add(maintainer) else: github_maintainers.add(maintainer) if cli.args.pr: from ghapi.all import GhApi ghapi = GhApi(owner=cli.args.owner, repo=cli.args.repo) pr = ghapi.pulls.get(cli.args.pr) if not pr.draft: for team in pr.requested_teams: team_name = f'@{cli.args.owner}/{team.slug}' if team_name in github_teams: cli.log.info('Found %s in reviews already, skipping', team_name) github_teams.remove(team_name) for team in github_teams: cli.log.info('Requesting review from team %s', team.split('/', 1)[1]) ghapi.pulls.request_reviewers(pull_number=cli.args.pr, team_reviewers=team.split('/', 1)[1]) if github_maintainers: ghapi.issues.create_comment(cli.args.pr, f'If you were pinged by this comment you have one or more files being changed by this PR: {" ".join(sorted(github_maintainers))}') else: print(f'Team Reviews: {" ".join(sorted(github_teams))}') print(f'Individual Reviews: {" ".join(sorted(github_maintainers))}')