fix(gitea): 寫入前先確認
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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 '
|
||||
|
||||
Executable
+44
@@ -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
|
||||
Reference in New Issue
Block a user