@@ -101,17 +101,56 @@ jobs:
101101 echo "当前已处理PR列表: $PROCESSED_PRS"
102102
103103 # 获取开放PR列表
104- PR_API_URL="https://api.github.com/repos/$TARGET_REPO/pulls?state=open&per_page=100"
105- PR_RESPONSE=$(curl -s -w "\n%{http_code}" -H "Authorization: token $GITHUB_TOKEN" "$PR_API_URL")
106- PR_HTTP_CODE=$(echo "$PR_RESPONSE" | tail -n1)
107- PR_BODY=$(echo "$PR_RESPONSE" | head -n -1)
108- if [ "$PR_HTTP_CODE" -ne 200 ]; then
109- echo "❌ 获取PR列表失败,状态码: $PR_HTTP_CODE"
110- exit 1
111- fi
112- PR_LIST=$(echo "$PR_BODY" | jq -r '.[]?.number | select(. != null)')
113- echo "获取到的PR列表: $PR_LIST"
104+ # PR_API_URL="https://api.github.com/repos/$TARGET_REPO/pulls?state=open&per_page=100"
105+ # PR_RESPONSE=$(curl -s -w "\n%{http_code}" -H "Authorization: token $GITHUB_TOKEN" "$PR_API_URL")
106+ # PR_HTTP_CODE=$(echo "$PR_RESPONSE" | tail -n1)
107+ # PR_BODY=$(echo "$PR_RESPONSE" | head -n -1)
108+ # if [ "$PR_HTTP_CODE" -ne 200 ]; then
109+ # echo "❌ 获取PR列表失败,状态码: $PR_HTTP_CODE"
110+ # exit 1
111+ # fi
112+ # PR_LIST=$(echo "$PR_BODY" | jq -r '.[]?.number | select(. != null)')
113+ # echo "获取到的PR列表: $PR_LIST"
114+
115+ # 1. 获取最近7天合并的PR(核心修改:state=closed + 按合并时间排序)
116+ # API参数说明:
117+ # - state=closed:筛选状态为"已关闭"的PR(合并后的PR状态是closed)
118+ # - sort=merged:按合并时间排序
119+ # - direction=desc:降序(最近合并的在前)
120+ SINCE_DATE=$(date -u -d '7 days ago' +'%Y-%m-%dT%H:%M:%SZ')
121+ CURRENT_PAGE_URL="https://api.github.com/repos/$TARGET_REPO/pulls?state=closed&sort=merged&direction=desc&per_page=100&since=$SINCE_DATE"
122+ ALL_MERGED_PR_NUMBERS=""
123+
124+ # 分页获取所有最近合并的PR
125+ while [ -n "$CURRENT_PAGE_URL" ]; do
126+ # 检查API速率限制
127+ RATE_LIMIT=$(curl -s -I -H "Authorization: token $GITHUB_TOKEN" "https://api.github.com/rate_limit" | grep -i "x-ratelimit-remaining" | awk '{print $2}')
128+ [ "$RATE_LIMIT" -lt 50 ] && echo "速率限制不足,暂停10分钟" && sleep 600
129+
130+ # 请求当前页PR
131+ echo "请求合并PR列表: $CURRENT_PAGE_URL"
132+ RESPONSE=$(curl -s -w "\n%{http_code}\n%{header_Link}" -H "Authorization: token $GITHUB_TOKEN" "$CURRENT_PAGE_URL")
133+ HTTP_CODE=$(echo "$RESPONSE" | tail -n2 | head -n1)
134+ LINK_HEADER=$(echo "$RESPONSE" | tail -n1)
135+ PR_BODY=$(echo "$RESPONSE" | head -n -2)
114136
137+ [ "$HTTP_CODE" -ne 200 ] && echo "获取PR列表失败,状态码: $HTTP_CODE" && exit 1
138+
139+ # 提取当前页中"已合并"的PR编号(过滤未合并的closed PR)
140+ # 通过 jq 筛选 merged_at 不为null的PR(即真正合并的)
141+ CURRENT_PAGE_MERGED_PR=$(echo "$PR_BODY" | jq -r '.[]? | select(.merged_at != null) | .number')
142+ ALL_MERGED_PR_NUMBERS="$ALL_MERGED_PR_NUMBERS $CURRENT_PAGE_MERGED_PR"
143+ echo "当前页合并PR数量: $(echo "$CURRENT_PAGE_MERGED_PR" | wc -w), 累计: $(echo "$ALL_MERGED_PR_NUMBERS" | wc -w)"
144+
145+ # 获取下一页URL
146+ CURRENT_PAGE_URL=$(echo "$LINK_HEADER" | grep -oP '<[^>]+>; rel="next"' | sed -E 's/<([^>]+)>; rel="next"/\1/')
147+ sleep 1 # 控制请求频率
148+ done
149+
150+ # 去重并排序PR编号
151+ PR_LIST=$(echo "$ALL_MERGED_PR_NUMBERS" | tr ' ' '\n' | sort -nr | uniq) # 按编号降序(最近合并的在前)
152+ echo "去重后合并PR总数: $(echo "$PR_LIST" | wc -w)"
153+
115154 for pr in $PR_LIST; do
116155 echo "=== 处理 PR #$pr ==="
117156
0 commit comments