From 59c198fb066f82c312c4c15e4e6d6151b6fbf2a4 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Tue, 8 Sep 2026 10:07:33 +0800 Subject: [PATCH] =?UTF-8?q?fix(sdlc):=20=E4=BF=AE=E6=AD=A3=20wp-gate=20che?= =?UTF-8?q?ck-deps=20=E7=9B=B8=E4=BE=9D=E6=AC=84=E4=BD=8D=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=8C=AF=E4=BD=8D=E5=95=8F=E9=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原本 awk -F'|' 固定用第 6 欄當相依欄,但表格每列開頭多一個空欄,實際相依欄是第 7 欄, 導致每個候選工作包都被誤判成無相依可直接挑選,相依關卡形同虛設。同時 PR/狀態欄改用 從結尾往回數,避免層 0 多一欄「工作證」時與層 1 到 4 的表格欄位對不齊;並在切欄前先 處理儲存格內跳脫的字面 |,避免該列後續欄位整批錯位。 Co-Authored-By: Claude Sonnet 5 --- tools/wp-gate.sh | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tools/wp-gate.sh b/tools/wp-gate.sh index 32dcf31..21966d9 100755 --- a/tools/wp-gate.sh +++ b/tools/wp-gate.sh @@ -339,11 +339,16 @@ case "$sub" in page="$analyze" content=$(sh "$gitea" wiki-get "$wiki_repo" "$page" 2>/dev/null) [ -n "$content" ] || missing_dep "讀不到分析頁 $wiki_repo 的 $page。" + # markdown 表格用 \| 跳脫儲存格裡的字面 |(例如描述某個分隔符本身就是 |); + # 下面逐欄用 awk -F'|' 切列,不先把跳脫符換掉,這一格會多出一欄, + # 害同一列後面每一欄全部錯位。先把 \| 換成控制字元,切完欄位再也用不到它,不必換回來。 + content=$(printf '%s' "$content" | sed $'s/\\\\|/\x01/g') - # WBS 表欄位(以 | 分隔,$1 是第一個 | 之前的空字串): - # $2=編號 $6=相依 $11=PR $12=狀態。 - # 找列一律比數值,不比字串:範本固定兩位數補零(WP-08),但呼叫端或相依欄裡的寫法 - # 不一定補零(WP-8);比字串會讓兩種寫法各自找不到對方那一列,誤判成「查不到」。 + # WBS 表欄位(以 | 分隔,$1 是第一個 | 之前的空字串,$NF 是結尾 | 之後的空字串): + # $2=編號 $7=相依。層 0 比層 1 到 4 多一欄「工作證」,PR 與狀態的絕對欄號因此不同, + # 一律從結尾往回數:倒數第一格是狀態、倒數第二格是 PR,兩種欄位數的表格都對得上。 + # 找列一律比數值,不比字串:範本固定把編號補零到兩位數,但呼叫端或相依欄裡的寫法 + # 不一定補零;比字串會讓兩種寫法各自找不到對方那一列,誤判成「查不到」。 find_wp_row() { # $1=WP 編號(可帶或不帶前導零) -> 印出該列,找不到印空字串 _n=$(printf '%s' "$1" | sed 's/^0*//'); [ -n "$_n" ] || _n=0 printf '%s\n' "$content" | awk -F'|' -v n="$_n" ' @@ -359,7 +364,7 @@ case "$sub" in [ -n "$row" ] || missing_dep "分析頁 $page 上找不到 WP-$wp_number 這一列,核對不了相依。" self_wp=$(printf '%s' "$row" | awk -F'|' '{ w = $2; gsub(/^[ \t]+|[ \t]+$/, "", w); print w }') - deps=$(printf '%s' "$row" | awk -F'|' '{ d = $6; gsub(/^[ \t]+|[ \t]+$/, "", d); print d }') + deps=$(printf '%s' "$row" | awk -F'|' '{ d = $7; gsub(/^[ \t]+|[ \t]+$/, "", d); print d }') case "$deps" in ''|-|無) echo 'status=ready' @@ -392,11 +397,11 @@ case "$sub" in continue fi dep_wp=$(printf '%s' "$dep_row" | awk -F'|' '{ w = $2; gsub(/^[ \t]+|[ \t]+$/, "", w); print w }') - dep_status=$(printf '%s' "$dep_row" | awk -F'|' '{ s = $12; gsub(/^[ \t]+|[ \t]+$/, "", s); print s }') + dep_status=$(printf '%s' "$dep_row" | awk -F'|' '{ s = $(NF-1); gsub(/^[ \t]+|[ \t]+$/, "", s); print s }') if [ "$dep_status" = '已完成' ]; then continue fi - dep_pr=$(printf '%s' "$dep_row" | awk -F'|' '{ print $11 }') + dep_pr=$(printf '%s' "$dep_row" | awk -F'|' '{ print $(NF-2) }') pr_index=$(printf '%s' "$dep_pr" | sed -n 's#.*/pulls/\([0-9][0-9]*\).*#\1#p' | head -n1) if [ -z "$pr_index" ]; then unmet="${unmet}${unmet:+、}${dep_wp}(狀態「${dep_status:-未完成}」,還沒開 PR)"