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:
Executable
+44
@@ -0,0 +1,44 @@
|
||||
#!/usr/bin/env sh
|
||||
# page-name.sh — wiki 頁名樣式的唯一正本。
|
||||
#
|
||||
# 為什麼要有這支腳本:頁名樣式散在多支腳本與技能裡各寫一份,改一次規則就得
|
||||
# 到處找。集中成一支,比對的人與比對的程式讀的是同一條式子。
|
||||
#
|
||||
# 用法:
|
||||
# page-name.sh regex # 印出合法頁名的 ERE
|
||||
# page-name.sh check <page> # 驗證單一頁名
|
||||
#
|
||||
# 規則:
|
||||
# 合法頁名是 {前綴}_{尾段}。前綴取十四種內容型別之一。
|
||||
# 尾段四選一:CONTENTS 是目錄頁;40 碼大寫十六進位是內容頁;
|
||||
# 8 碼大寫十六進位,以及 H 加 7 碼大寫十六進位,留給還沒搬過來的舊頁。
|
||||
#
|
||||
# 為什麼舊頁收兩種樣式:舊演算法算出前 8 碼後,首碼落在 0-9ABC 就改寫成 H 加前 7 碼。
|
||||
# 十六個首碼裡有十三個會命中,既有舊頁名絕大多數長成 H 開頭那一種。只收純 8 碼,
|
||||
# 等於把八成的舊頁判成不合法,先驗頁名的技能就再也讀不到它們。
|
||||
#
|
||||
# 為什麼 CONTENTS 不能當前綴:CONTENTS 只用來解目錄頁的存取庫,它自己沒有頁。
|
||||
# 放行 CONTENTS_CONTENTS 或 CONTENTS_{HASH},會建出一個規格上不存在的頁。
|
||||
# 結束碼: 0=合法 1=不合法 2=用法錯誤
|
||||
set -eu
|
||||
|
||||
PREFIXES='QUESTION|PLAN|ANALYZE|DELIVER|MAINTAIN|REPO|LOG|LEARN|ERROR|CHECK|REPORT|SKILLSET|TOOLING|MONITOR'
|
||||
RE="^($PREFIXES)_(CONTENTS|[0-9A-F]{8}|H[0-9A-F]{7}|[0-9A-F]{40})\$"
|
||||
|
||||
cmd="${1-}"
|
||||
case "$cmd" in
|
||||
regex)
|
||||
[ "$#" -eq 1 ] || { echo 'usage: page-name.sh regex' >&2; exit 2; }
|
||||
printf '%s\n' "$RE" ;;
|
||||
check)
|
||||
page="${2-}"
|
||||
[ "$#" -eq 2 ] && [ -n "$page" ] || { echo 'usage: page-name.sh check <page>' >&2; exit 2; }
|
||||
if printf '%s\n' "$page" | grep -Eq "$RE"; then
|
||||
exit 0
|
||||
fi
|
||||
echo "[jsc][gitea][ERR]:頁名不合規則:$page" >&2
|
||||
exit 1 ;;
|
||||
*)
|
||||
echo 'usage: page-name.sh regex | page-name.sh check <page>' >&2
|
||||
exit 2 ;;
|
||||
esac
|
||||
Reference in New Issue
Block a user