From b53cfeaf3465dfb0d7be395b521b80b111fc3d44 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Wed, 2 Sep 2026 12:16:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(migrate-wiki):=20=E6=AD=A3=E6=8E=A8?= =?UTF-8?q?=E6=AF=94=E5=B0=8D=E6=B6=B5=E8=93=8B=E5=85=A9=E4=BB=A3=E9=A0=81?= =?UTF-8?q?=E5=90=8D=E8=A6=8F=E5=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit What:候選鍵的舊 HASH 改成兩種都算——第一代只取 SHA-1 前 8 碼大寫,第二代在其上 把首碼落在 0-9ABC 的改寫成 H 加前 7 碼。兩種都進對照表,任一種配得上就算配對成功。 Why:原本只算第二代,所以第一代那些首碼落在 0-9ABC 的頁一律配不到,被誤判成孤兒 留在原地。實測同一個鍵在第一代是 1C516D85、第二代是 H1C516D8,兩張頁至今並存, 只算第二代就會漏掉第一代那一張。 How:實地重跑對照表,可搬頁數從 35 增為 48,孤兒從 14 減為 2。剩下兩頁一頁是更早的 {型別}_{日期}_{HASH} 命名、頁名不符任何已知樣式,一頁反推不到候選鍵,兩頁都照原則 只列不猜。首碼落在 D、E、F 的鍵兩代同值,只印一行,不會重複。 Who:jsc-gitea --- tools/migrate-wiki.sh | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/tools/migrate-wiki.sh b/tools/migrate-wiki.sh index 1151d01..7f19f49 100755 --- a/tools/migrate-wiki.sh +++ b/tools/migrate-wiki.sh @@ -66,15 +66,21 @@ while [ "$#" -gt 0 ]; do esac done -old_hash() { # 舊演算法:SHA-1 前 8 碼大寫;首碼落在 0-9ABC 就改成 H 加前 7 碼 +old_hash() { # 舊演算法:一個候選鍵可能對到兩種舊頁名,兩種都印出來,一行一個 + # 這裡刻意印兩種,因為頁名規則改過兩次,兩代的頁至今並存: + # 第一代 只取 SHA-1 前 8 碼大寫。 + # 第二代 在第一代之上,首碼落在 0-9ABC 就改成 H 加前 7 碼。 + # 只算第二代的話,第一代那些首碼落在 0-9ABC 的頁一律配不到,會被誤判成孤兒 + # 留在原地。實例:同一個鍵在第一代是 1C516D85、第二代是 H1C516D8,兩張頁都在。 + # 首碼落在 D、E、F 的鍵兩代同值,這時只印一行。 if command -v sha1sum >/dev/null 2>&1; then raw=$(printf '%s' "$1" | sha1sum | awk '{print $1}') else raw=$(printf '%s' "$1" | shasum -a 1 | awk '{print $1}') fi h=$(printf '%s' "$raw" | cut -c1-8 | tr a-f A-F) - case "$h" in [0-9ABC]*) h="H$(printf '%s' "$h" | cut -c1-7)" ;; esac printf '%s\n' "$h" + case "$h" in [0-9ABC]*) printf 'H%s\n' "$(printf '%s' "$h" | cut -c1-7)" ;; esac } rc=0 @@ -218,7 +224,10 @@ sort -u "$work/keys" > "$work/keys.uniq" : > "$work/hashes" while IFS= read -r k <&3; do [ -n "$k" ] || continue - printf '%s\t%s\n' "$(old_hash "$k")" "$k" >> "$work/hashes" + # old_hash 一個鍵可能印兩行(兩代頁名規則),每一行都要能配得到同一個鍵 + old_hash "$k" | while IFS= read -r h; do + printf '%s\t%s\n' "$h" "$k" >> "$work/hashes" + done done 3< "$work/keys.uniq" # ---- 第三輪:正推配對 ----