You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 17:35:14