fix(migrate-wiki): 正推比對涵蓋兩代頁名規則
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
This commit is contained in:
+12
-3
@@ -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"
|
||||
|
||||
# ---- 第三輪:正推配對 ----
|
||||
|
||||
Reference in New Issue
Block a user