Skip to content

Commit a8f61b1

Browse files
authored
Update auto-assign-reviewers.yml
1 parent 3fb3be8 commit a8f61b1

File tree

1 file changed

+51
-19
lines changed

1 file changed

+51
-19
lines changed

.github/workflows/auto-assign-reviewers.yml

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
12
#
23
# Copyright (c) 2006-2025, RT-Thread Development Team
34
#
@@ -7,6 +8,7 @@
78
# Date Author Notes
89
# 2025-01-21 kurisaW Initial version
910
# 2025-03-14 hydevcode
11+
# 2025-05-10 kurisaW Fixed file existence, cache, and comment time issues
1012

1113
# Script Function Description: Assign PR reviews based on the MAINTAINERS list.
1214

@@ -50,6 +52,10 @@ jobs:
5052
"https://api.github.com/repos/${{ github.repository }}/issues/${{ steps.extract-pr.outputs.PR_NUMBER }}/comments" | \
5153
jq -r '.[] | select(.user.login == "github-actions[bot]") | {body: .body} | @base64')
5254
55+
echo "=== Changed Files ==="
56+
cat changed_files.txt
57+
echo "====================="
58+
5359
comment_body=""
5460
if [[ ! -z "$existing_comment" ]]; then
5561
comment_body=$(echo "$existing_comment" | head -1 | base64 -d | jq -r .body|sed -nE 's/.*Last Updated: ([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2} UTC).*/\1/p')
@@ -63,6 +69,8 @@ jobs:
6369
echo "COMMENT_TIME=${comment_time}" >> $GITHUB_OUTPUT
6470
fi
6571
echo "COMMENT_TIME=${comment_time}"
72+
73+
6674
- name: Parse MAINTAINERS file
6775
id: parse_maintainer
6876
run: |
@@ -72,8 +80,10 @@ jobs:
7280
/^tag:/ {
7381
tag = substr($0, index($0, $2)) # 提取标签内容
7482
}
75-
/^path:/ {
76-
path = substr($0, index($0, $2)) # 提取路径内容
83+
/^path:/ {
84+
# 提取 path 字段并去除前后空格
85+
path = substr($0, index($0, $2))
86+
gsub(/^[ \t]+|[ \t]+$/, "", path) # 清理前后空格和制表符
7787
}
7888
/^owners:/ {
7989
owners = substr($0, index($0, $2)) # 提取维护者信息
@@ -85,21 +95,35 @@ jobs:
8595
print tag "|" path "|" github_ids
8696
}
8797
' MAINTAINERS > tag_data.csv
98+
8899
- name: Generate reviewers list
89100
id: generate_reviewers
90101
run: |
91-
# 根据变更文件路径匹配维护者规则
92-
rm -f triggered_reviewers.txt
93-
rm -f triggered_tags.txt
102+
rm -f triggered_reviewers.txt triggered_tags.txt unique_reviewers.txt unique_tags.txt
103+
touch triggered_reviewers.txt triggered_tags.txt unique_reviewers.txt unique_tags.txt
104+
94105
while IFS='|' read -r tag path reviewers; do
95-
# 使用正则匹配路径(支持子目录)
96-
if grep -qE "^$path(/|$)" changed_files.txt; then
97-
echo "$reviewers" | tr ' ' '\n' >> triggered_reviewers.txt
98-
echo "$tag" | tr ' ' '\n' >> triggered_tags.txt
106+
# 转义路径中的正则特殊字符
107+
escaped_path=$(sed 's/[.[\*^$]/\\&/g' <<< "$path")
108+
109+
# 使用增强型正则匹配路径及其所有子目录
110+
if grep -qE "^$escaped_path(/.*)*" changed_files.txt; then
111+
echo "$reviewers" | tr -s ' ' '\n' | sed '/^$/d' >> triggered_reviewers.txt
112+
echo "$tag" >> triggered_tags.txt
113+
echo "Matched: $path → $tag"
99114
fi
100115
done < tag_data.csv
101-
awk 'NF && !seen[$0]++' triggered_reviewers.txt > unique_reviewers.txt
102-
awk 'NF && !seen[$0]++' triggered_tags.txt > unique_tags.txt
116+
117+
# 从 triggered_reviewers.txt 生成 unique_reviewers.txt(去重)
118+
sort triggered_reviewers.txt | uniq > unique_reviewers.txt
119+
# 从 triggered_tags.txt 生成 unique_tags.txt(去重)
120+
sort triggered_tags.txt | uniq > unique_tags.txt
121+
122+
echo "=== Matched Paths ==="
123+
cat unique_tags.txt
124+
echo "=== Matched Reviewers ==="
125+
cat unique_reviewers.txt
126+
103127
- name: Restore Reviewers Cache
104128
id: reviewers-cache-restore
105129
if: ${{ steps.changed_files.outputs.COMMENT_TIME != '' }}
@@ -113,12 +137,20 @@ jobs:
113137
id: get_approval
114138
run: |
115139
current_time=$(date -u +"%Y-%m-%d %H:%M UTC")
140+
141+
# 检查 unique_reviewers.txt 是否存在
142+
if [[ ! -f unique_reviewers.txt ]]; then
143+
echo "Error: unique_reviewers.txt not found. Skipping approval status generation."
144+
echo "CURRENT_TIME=${current_time}" >> $GITHUB_OUTPUT
145+
exit 0
146+
fi
147+
116148
reviewers=$(cat unique_reviewers.txt | tr '\n' '|')
117149

118150
# 获取 PR 的所有评论
119151
comments=$(curl -s \
120152
"https://api.github.com/repos/${{ github.repository }}/issues/${{ steps.extract-pr.outputs.PR_NUMBER }}/comments")
121-
153+
122154
echo '#!/bin/bash' > approval_data.sh
123155
echo 'declare -A approvals=()' >> approval_data.sh
124156

@@ -136,7 +168,7 @@ jobs:
136168
# 加载审查数据并生成状态报告
137169
chmod +x approval_data.sh
138170
source ./approval_data.sh
139-
171+
140172
jq -r --arg reviewers "$reviewers" '
141173
.[] |
142174
select(.user.login != "github-actions[bot]") | # 排除 bot 的评论
@@ -146,30 +178,29 @@ jobs:
146178
select($mention | inside($reviewers)) | # 过滤有效审查者
147179
"\($mention) \(.created_at)" # 输出审查者和时间
148180
' <<< "$comments" >> approval_data.txt
149-
181+
150182
notified_users=""
151183
if [[ -f unique_reviewers_bak.txt ]]; then
152184
notified_users=$(cat unique_reviewers_bak.txt | xargs)
153185
else
154186
notified_users=""
155187
fi
156-
188+
157189
{
158190
echo "---"
159191
echo "### 📊 Current Review Status (Last Updated: $current_time)"
160192
while read -r reviewer; do
161193
formatted_reviewers=""
162194
for r in $reviewers; do
163195
if [[ " ${notified_users[@]} " =~ " $reviewer " ]]; then
164-
formatted_reviewers+="${reviewer#@}"
196+
formatted_reviewers+="${reviewer#@}"
165197
else
166-
formatted_reviewers+="$reviewer"
198+
formatted_reviewers+="$reviewer"
167199
fi
168200
done
169201
170202
if [[ -n "${approvals[$reviewer]}" ]]; then
171203
timestamp=$(date -d "${approvals[$reviewer]}" -u +"%Y-%m-%d %H:%M UTC")
172-
173204
echo "- ✅ **$formatted_reviewers** Reviewed On $timestamp"
174205
else
175206
echo "- ⌛ **$formatted_reviewers** Pending Review"
@@ -178,6 +209,7 @@ jobs:
178209
} > review_status.md
179210
180211
echo "CURRENT_TIME=${current_time}" >> $GITHUB_OUTPUT
212+
181213
- name: Generate review data
182214
id: generate_review
183215
run: |
@@ -289,4 +321,4 @@ jobs:
289321
path: |
290322
unique_tags_bak.txt
291323
unique_reviewers_bak.txt
292-
key: ${{ runner.os }}-auto-assign-reviewers-${{ steps.extract-pr.outputs.PR_NUMBER }}-${{ steps.get_comment_time.outputs.CURRENT_TIME }}
324+
key: ${{ runner.os }}-auto-assign-reviewers-${{ steps.extract-pr.outputs.PR_NUMBER }}-${{ steps.get_comment_time.outputs.CURRENT_TIME }}

0 commit comments

Comments
 (0)