feat(wiki): 目錄頁專用存取庫、HASH 去除截短與 H 前綴
What:CONTENTS 成為第 15 種頁面類型,解析鏈為 JSC_WIKI_REPO_CONTENTS 到 JSC_WIKI_REPO,刻意不退回型別變數。hash-id 拿掉 8 碼截短與 H 前綴改寫,只留大寫 轉換,輸出完整 40 碼;空輸入改成用法錯誤。新增 page-name.sh、wiki-contents.sh、 migrate-wiki.sh 與 wiki-delete 子命令。 Why:H 前綴會命中 16 個首碼裡的 13 個,還丟掉第 8 碼,把有效熵壓到 28 位元,而且 全庫查不到任何理由紀錄。目錄頁的整列 upsert 原本 14 處只有一處寫成程式,同一段判斷 做 14 次,錯一次就少一筆紀錄。 How:頁名樣式仍收 H 加 7 碼的舊頁,遷移期間讀得到舊頁。wiki-contents.sh 建新頁時 剝掉範本的示範列,否則每個目錄頁第一次建立都會留一列佔位死連結。migrate-wiki.sh 預設只印對照表,--apply 先寫新頁、確認寫成、才刪舊頁;孤兒頁只列不猜,因為 SHA-1 不可逆,新頁名只能靠候選鍵正推。 Who:jsc-gitea
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
#!/usr/bin/env sh
|
||||
# check-wiki-rules — 驗證 wiki repo 解析與 hash-id 規則。
|
||||
# check-wiki-rules — 驗證 wiki repo 解析、hash-id 與頁名樣式規則。
|
||||
# 涵蓋 TYPES 列的每一種頁面類型,每種三項:專用變數優先、退回共用變數、不得跨類型代用。
|
||||
# 全部通過印 OK 並 exit 0;任一項不符印出差異並 exit 1。
|
||||
# 結束碼: 0=全部通過,stdout 印 OK
|
||||
@@ -10,8 +10,9 @@ set -eu
|
||||
dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
|
||||
gitea="$dir/gitea.sh"
|
||||
hash_id="$dir/hash-id"
|
||||
page_name="$dir/page-name.sh"
|
||||
|
||||
TYPES='QUESTION PLAN ANALYZE DELIVER MAINTAIN REPO LOG LEARN ERROR CHECK REPORT SKILLSET TOOLING MONITOR'
|
||||
TYPES='QUESTION PLAN ANALYZE DELIVER MAINTAIN REPO LOG LEARN ERROR CHECK REPORT SKILLSET TOOLING MONITOR CONTENTS'
|
||||
|
||||
fail() {
|
||||
printf '%s\n' "$1" >&2
|
||||
@@ -84,12 +85,57 @@ fi
|
||||
[ "$code" -eq 2 ] || fail "unknown type: want exit=2 got exit=$code"
|
||||
[ -z "$got" ] || fail "unknown type: want no output got=$got"
|
||||
|
||||
# hash-id:首碼 0-9/A/B/C 改成 H 加前 7 碼;其餘首碼原樣輸出 8 碼大寫。
|
||||
check_hash 'case-2' 'H5172CB7'
|
||||
check_hash 'case-11' 'HA9A6662'
|
||||
check_hash 'case-1' 'HB6EC7FD'
|
||||
check_hash 'case-12' 'HCCA8D42'
|
||||
check_hash 'case-3' 'D3E5AA27'
|
||||
check_hash 'case-7' 'D794C002'
|
||||
# hash-id:完整 40 碼大寫十六進位,不截短、不加前綴。
|
||||
check_hash 'case-2' '5172CB7A273D9C64ADBAAC70F321F2EDCD49C495'
|
||||
check_hash 'case-11' 'A9A6662D94D9CC4BE593F3846DABE9AA147333E8'
|
||||
check_hash 'case-1' 'B6EC7FD12D959BFFB08AC7F8B279B5255D55AA4C'
|
||||
check_hash 'case-12' 'CCA8D4284394EBBA49F6493004ECAAE54FD74E0F'
|
||||
check_hash 'case-3' 'D3E5AA27999009B42908E5BB7C1636BC14087D9C'
|
||||
check_hash 'case-7' 'D794C0028687E7F4F3AEFF703276964E618F2EE3'
|
||||
|
||||
# hash-id 空輸入回 2。靜靜回傳空字串的 SHA-1 會生出一個看起來合法的頁名,
|
||||
# 內容就寫到沒有人讀的那一頁。
|
||||
if got=$(printf '' | "$hash_id" 2>/dev/null); then
|
||||
code=0
|
||||
else
|
||||
code=$?
|
||||
fi
|
||||
[ "$code" -eq 2 ] || fail "hash-id empty input: want exit=2 got exit=$code output=$got"
|
||||
[ -z "$got" ] || fail "hash-id empty input: want no output got=$got"
|
||||
|
||||
# page-name.sh:四種合法尾段各一筆,不合法的一批。
|
||||
check_page_ok() {
|
||||
sh "$page_name" check "$1" >/dev/null 2>&1 || fail "page-name $1: want exit=0"
|
||||
}
|
||||
check_page_bad() {
|
||||
if sh "$page_name" check "$1" >/dev/null 2>&1; then
|
||||
code=0
|
||||
else
|
||||
code=$?
|
||||
fi
|
||||
[ "$code" -eq 1 ] || fail "page-name $1: want exit=1 got exit=$code"
|
||||
}
|
||||
|
||||
check_page_ok 'CHECK_D3E5AA27999009B42908E5BB7C1636BC14087D9C'
|
||||
check_page_ok 'LOG_FB8DF0B5'
|
||||
check_page_ok 'PLAN_CONTENTS'
|
||||
|
||||
# H 開頭的舊頁名。舊演算法十六個首碼裡有十三個會改寫成 H 加前 7 碼,
|
||||
# 既有舊頁名多數長這樣。判成不合法,先驗頁名的技能就讀不到它們。
|
||||
check_page_ok 'LOG_H1A2B3C4'
|
||||
check_page_ok 'CHECK_H87EC88F'
|
||||
check_page_ok 'LOG_H87095D0'
|
||||
|
||||
# CONTENTS 只解存取庫,自己沒有頁。放行就會建出規格上不存在的那一頁。
|
||||
check_page_bad 'CONTENTS_CONTENTS'
|
||||
check_page_bad 'CONTENTS_D3E5AA27999009B42908E5BB7C1636BC14087D9C'
|
||||
|
||||
check_page_bad 'NOSUCH_CONTENTS'
|
||||
check_page_bad 'PLAN_d3e5aa27'
|
||||
check_page_bad 'PLAN_H87EC88'
|
||||
check_page_bad 'PLAN'
|
||||
|
||||
# regex 子命令要印得出東西,頁名樣式的正本才只有這一份。
|
||||
[ -n "$(sh "$page_name" regex)" ] || fail 'page-name regex: want a pattern'
|
||||
|
||||
printf '%s\n' 'OK'
|
||||
|
||||
Reference in New Issue
Block a user