如何通过Gerrit REST API获取超过500个唯一用户的变更记录?
Gerrit REST API 突破500条限制获取全量变更记录
我正在编写Python脚本统计指定时间段内所有项目的变更数量,但调用Gerrit REST API时最多只能返回500条记录,需要获取全部用户的相关变更记录(即使时间跨度长达1年)。
当前使用的API调用函数:
def requestAPICall(url): """ does API stuff """ response = requests.get(url) if response.status_code == 200: JSON_response = json.loads(response.text[4:]) generateJSON(JSON_response) return (JSON_response, True) print("Error Occured") return (response, False)
当前查询条件:时间段从2022-01-01 11:26:25 +0100到2023-01-01 11:31:25 +0100,请求基于chromium-review的Gerrit实例。
解决方案:实现API分页遍历
Gerrit REST API默认分页限制为500条,通过分页参数S(起始索引)和n(每页数量)可以遍历获取全量数据,具体实现如下:
import requests import json def fetch_all_changes(base_query_url): all_changes = [] start = 0 page_size = 500 # Gerrit允许的最大每页记录数 while True: # 拼接分页参数到基础查询URL paginated_url = f"{base_query_url}&S={start}&n={page_size}" response = requests.get(paginated_url) if response.status_code != 200: print(f"请求失败,状态码: {response.status_code}") break # 处理Gerrit返回的特殊前缀,避免JSON解析错误 raw_response = response.text if raw_response.startswith(")]}'"): raw_response = raw_response[4:] current_page_changes = json.loads(raw_response) if not current_page_changes: # 无更多数据,终止循环 break all_changes.extend(current_page_changes) generateJSON(current_page_changes) # 保留原有数据生成逻辑 start += page_size # 当前页记录数不足page_size,说明是最后一页 if len(current_page_changes) < page_size: break return all_changes, True # 使用示例 base_query = "https://chromium-review.googlesource.com/changes/?q=since:%222022-01-01%2011:26:25%20%2B0100%22+before:%222023-01-01%2011:31:25%20%2B0100%22" full_changes, success = fetch_all_changes(base_query) if success: print(f"已获取全部变更记录,总数: {len(full_changes)}")
关键细节说明
- 分页参数:
S指定从第几条记录开始(索引从0算起),n设置为500(Gerrit允许的最大值)以减少请求次数 - 终止条件:当返回的记录为空或数量不足500时,停止循环
- 前缀处理:Gerrit返回的JSON会带
)]}'前缀,必须去除后才能正常解析 - 限流提示:针对跨年度的大量数据请求,建议添加
time.sleep(1)间隔,避免触发Gerrit的请求频率限制
额外:用户变更数量统计
获取全量数据后,可通过以下代码统计每个用户的变更次数:
user_change_stats = {} for change in full_changes: user_email = change.get('owner', {}).get('email', '未知用户') user_change_stats[user_email] = user_change_stats.get(user_email, 0) + 1 # 打印统计结果 for user, count in user_change_stats.items(): print(f"{user}: {count} 次变更")
内容的提问来源于stack exchange,提问作者Beuler
相关产品推荐
相关产品推荐

