blob: 8626c61206a0fdb8e1c92f7d801a4a794b9836b0 [file] [log] [blame]
Boyan Karatotev858a7ea2025-07-02 10:29:21 +01001#!/usr/bin/env python3
2
3import argparse
4import asyncio
5import json
6import sys
7
8import aiohttp
9
10async def get_patch_counts(session, query: str) -> str:
11 url = "https://review.trustedfirmware.org/changes/?q="
12 skip_arg = "&S={}"
13 skip_num = 0
14
15 totals = {}
16 while True:
17 async with session.get(url + query + skip_arg.format(skip_num)) as response:
18 text = (await response.text())[4:] # strip magic string ")]}'"
19 data = json.loads(text)
20
21 for entry in data:
22 name = entry["project"]
23 totals[name] = totals.get(name, 0) + 1
24
25 if len(data) and data[-1].get("_more_changes", False):
26 skip_num = len(data)
27 else:
28 break
29
30 message = "Patches in review:\n"
Boyan Karatotev5342c682025-07-18 09:02:18 +010031 for name, count in sorted(totals.items(), key=lambda it: it[1], reverse=True):
Boyan Karatotev858a7ea2025-07-02 10:29:21 +010032 message += f"* {name}: {count}\n"
33 return message
34
35async def run_local(query: str) -> str:
36 async with aiohttp.ClientSession() as session:
37 msg = await get_patch_counts(session, query)
38 print(msg)
39
40def add_gerrit_arg(parser):
41 parser.add_argument(
42 "-q", "--tforg-gerrit-query",
43 default=(
44 "(parentproject:TF-A OR parentproject:TF-RMM OR parentproject:TS OR "
Boyan Karatotev6e270cf2025-09-02 09:24:27 +010045 "parentproject:hafnium OR parentproject:RF-A OR "
Sandrine Afsaa472c472025-09-10 10:39:05 +020046 "parentproject:arm-firmware-crates OR "
Manish V Badarkhe58400bc2025-09-10 14:04:36 +010047 "project:^shared/libEventLog OR "
48 "project:^shared/transfer-list-library OR "
Boyan Karatotev6e270cf2025-09-02 09:24:27 +010049 "project:^ci/hafnium-.%2B OR project:^ci/tf-a-.%2B) "
50 "(branch:integration OR branch:master OR branch:main OR "
51 "branch:^topics\\/.*) -is:wip is:open"
Boyan Karatotev858a7ea2025-07-02 10:29:21 +010052 ), help="the query to pass to tforg's Gerrit (as written in the query box)"
53 )
54
55if __name__ == "__main__":
56 parser = argparse.ArgumentParser(
57 description="Counter of patches in tforg's gerrit",
58 formatter_class=argparse.ArgumentDefaultsHelpFormatter,
59 )
60 add_gerrit_arg(parser)
61 args = parser.parse_args(sys.argv[1:])
62
63 asyncio.run(run_local(args.tforg_gerrit_query))