blob: 2b5e4f4bbb89f8dd548eb8ccfb6a37b04b844619 [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 "
Boyan Karatotev6e270cf2025-09-02 09:24:27 +010047 "project:^ci/hafnium-.%2B OR project:^ci/tf-a-.%2B) "
48 "(branch:integration OR branch:master OR branch:main OR "
49 "branch:^topics\\/.*) -is:wip is:open"
Boyan Karatotev858a7ea2025-07-02 10:29:21 +010050 ), help="the query to pass to tforg's Gerrit (as written in the query box)"
51 )
52
53if __name__ == "__main__":
54 parser = argparse.ArgumentParser(
55 description="Counter of patches in tforg's gerrit",
56 formatter_class=argparse.ArgumentDefaultsHelpFormatter,
57 )
58 add_gerrit_arg(parser)
59 args = parser.parse_args(sys.argv[1:])
60
61 asyncio.run(run_local(args.tforg_gerrit_query))