ci: deduplicate reviewers and reduce requests

This commit is contained in:
trag1c
2025-04-19 01:01:15 +02:00
parent 6a876ef8ec
commit fd42733541

View File

@ -1,8 +1,8 @@
# /// script # /// script
# requires-python = ">=3.9" # requires-python = ">=3.9"
# dependencies = [ # dependencies = [
# "githubkit", # "githubkit==0.12.11",
# "loguru", # "loguru==0.7.3",
# ] # ]
# /// # ///
@ -12,9 +12,9 @@ import asyncio
import os import os
import re import re
import sys import sys
from collections.abc import Iterator from collections.abc import Iterable, Iterator
from contextlib import contextmanager from contextlib import contextmanager
from itertools import chain from itertools import batched, chain
from githubkit import GitHub from githubkit import GitHub
from githubkit.exception import RequestFailed from githubkit.exception import RequestFailed
@ -124,18 +124,19 @@ async def get_changed_files(pr_number: int) -> list[str]:
return [d.filename for d in diff_entries] return [d.filename for d in diff_entries]
async def request_review(pr_number: int, user: str, pr_author: str) -> None: async def request_review(pr_number: int, users: Iterable[str], pr_author: str) -> None:
if user == pr_author: users = set(users) - {pr_author}
logger.debug(f"Skipping review request for {user!r} (is PR author)") for batch in map(list, batched(users, 10)):
logger.debug(f"Requesting review from {user!r}...") members_str = ", ".join(map(repr, batch))
with log_fail(f"Failed to request review from {user}", die=False): logger.debug(f"Requesting review from: {members_str}...")
await gh.rest.pulls.async_request_reviewers( with log_fail(f"Failed to request review from {members_str}", die=False):
ORG_NAME, await gh.rest.pulls.async_request_reviewers(
REPO_NAME, ORG_NAME,
pr_number, REPO_NAME,
headers={"Accept": "application/vnd.github+json"}, pr_number,
data={"reviewers": [user]}, headers={"Accept": "application/vnd.github+json"},
) data={"reviewers": list(batch)},
)
def is_localization_team(team_name: str) -> bool: def is_localization_team(team_name: str) -> bool:
@ -177,12 +178,7 @@ async def main() -> None:
member_lists = await asyncio.gather( member_lists = await asyncio.gather(
*(get_team_members(owner) for owner in found_owners) *(get_team_members(owner) for owner in found_owners)
) )
await asyncio.gather( await request_review(pr_number, chain.from_iterable(member_lists), pr_author)
*(
request_review(pr_number, user, pr_author)
for user in chain.from_iterable(member_lists)
)
)
if __name__ == "__main__": if __name__ == "__main__":