1+
12#
23# Copyright (c) 2006-2025, RT-Thread Development Team
34#
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
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')
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 : |
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