fix(gitea): 寫入前先確認

This commit is contained in:
Jeffery
2026-08-28 17:55:51 +08:00
parent e464047774
commit d4466dfba8
6 changed files with 67 additions and 10 deletions
+9
View File
@@ -31,6 +31,9 @@
set -eu
script_dir=$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)
confirm_write() {
sh "$script_dir/write-confirm.sh" "$1" "$2"
}
resolve_wiki_repo() { # TYPE -> JSC_WIKI_REPO_{TYPE} -> JSC_WIKI_REPO
type=$(printf '%s' "${1:?TYPE required}" | tr a-z A-Z)
@@ -190,6 +193,7 @@ sys.stdout.write(json.load(sys.stdin).get("html_url") or "")
printf '%s\n' "$url" ;;
wiki-put)
or="${1:?owner/repo required}"; page="${2:?page required}"; file="${3:?content file required}"
confirm_write "寫入 wiki 頁" "$page"
tmp=$(mktemp)
python3 -c '
import json,sys,base64
@@ -207,6 +211,7 @@ print(json.dumps({"title":title,"content_base64":base64.b64encode(content).decod
pr-create)
or="${1:?owner/repo required}"; head="${2:?head required}"; base="${3:?base required}"
title="${4:?title required}"; body_file="${5:?body file required}"
confirm_write "建立 PR" "$or#$title"
tmp=$(mktemp)
python3 -c '
import json,sys
@@ -249,6 +254,7 @@ sys.stdout.write(p.get("body") or "")
or="${1:?owner/repo required}"; idx="${2:?pr index required}"
title="${3:?title required}"; body_file="${4:?body file required}"
[ -f "$body_file" ] || { echo "找不到描述檔: $body_file" >&2; exit 2; }
confirm_write "更新 PR" "$or#$idx"
tmp=$(mktemp)
python3 -c '
import json,sys
@@ -301,6 +307,7 @@ for c in d:
kind="${3:?kind required}"; cid="${4:?comment id required}"; body_file="${5:?body file required}"
[ -f "$body_file" ] || { echo "找不到回覆檔: $body_file" >&2; exit 2; }
case "$kind" in issue|review|inline) ;; *) echo "kind must be issue, review, or inline" >&2; exit 2 ;; esac
confirm_write "回覆留言" "$or#$idx/$kind#$cid"
tmp=$(mktemp)
python3 -c '
import json,sys
@@ -320,6 +327,7 @@ print(json.dumps({"body":open(sys.argv[1],encoding="utf-8").read()}))
pr-depend)
or="${1:?owner/repo required}"; idx="${2:?pr index required}"
dep_or="${3:?dep owner/repo required}"; dep_idx="${4:?dep index required}"
confirm_write "設定 PR 依賴" "$or#$idx -> $dep_or#$dep_idx"
tmp=$(mktemp)
python3 -c '
import json,sys
@@ -333,6 +341,7 @@ print(json.dumps({"owner":o,"repo":r,"index":int(sys.argv[2])}))
echo "OK $or#$idx depends on $dep_or#$dep_idx" ;;
repo-set)
or="${1:?owner/repo required}"; desc="${2:?description required}"; site="${3:-}"
confirm_write "更新 repo 資訊" "$or"
tmp=$(mktemp)
python3 -c '
import json,sys
+4
View File
@@ -133,6 +133,10 @@ for l in json.load(sys.stdin).get("labels") or []:
*) echo "[jsc][議題][ERR]:不認得的選項「$1」。" >&2; usage ;;
esac
done
confirm_target="議題「$title」"
[ -n "$labels" ] && confirm_target="$confirm_target,標籤:$labels"
[ -n "$milestone" ] && confirm_target="$confirm_target,里程碑:$milestone"
sh "$script_dir/write-confirm.sh" "建立議題" "$confirm_target"
payload=$(mktemp)
trap 'rm -f "$payload"' EXIT
python3 -c '
+44
View File
@@ -0,0 +1,44 @@
#!/usr/bin/env sh
# write-confirm.sh — Gitea 寫入前的人工確認。
#
# 為什麼要有這支腳本:wiki 與議題都是對外寫入。先確認,才能避免把
# 錯頁、錯內容、錯標籤直接送出去。
#
# 用法:
# write-confirm.sh <動作> <目標>
#
# 規則:
# - JSC_GITEA_CONFIRM=yes:直接放行。
# - JSC_GITEA_CONFIRM=no:直接拒絕。
# - 互動式執行:要求輸入「確認」。
# - 沒有互動終端:拒絕,避免默默寫出錯資料。
set -eu
action="${1:-}"
target="${2:-}"
[ -n "$action" ] || { echo '[jsc][Gitea][ERR]:缺少動作名稱。' >&2; exit 2; }
[ -n "$target" ] || { echo '[jsc][Gitea][ERR]:缺少目標名稱。' >&2; exit 2; }
case "${JSC_GITEA_CONFIRM:-}" in
yes|YES|1|true|TRUE)
exit 0 ;;
no|NO|0|false|FALSE)
echo "[jsc][Gitea][ERR]:已取消寫入「$target」。" >&2
exit 2 ;;
esac
if [ -t 0 ]; then
printf '[jsc][Gitea] 即將%s「%s」。輸入「確認」繼續:' "$action" "$target" >&2
IFS= read -r answer || exit 2
case "$answer" in
確認)
exit 0 ;;
*)
echo "[jsc][Gitea][ERR]:已取消寫入「$target」。" >&2
exit 2 ;;
esac
fi
echo "[jsc][Gitea][ERR]:寫入「$target」需要先確認;請改用互動式執行,或先設 JSC_GITEA_CONFIRM=yes。" >&2
exit 2