diff --git a/tools/gitea.sh b/tools/gitea.sh index aaf3fce..b5b952a 100755 --- a/tools/gitea.sh +++ b/tools/gitea.sh @@ -15,6 +15,8 @@ # gitea.sh wiki-url / # 印出 wiki 頁絕對網址(取自 API 的 html_url);跨存取庫連結用 # gitea.sh pr-create / <body-file> # 建立 PR,印出 PR URL # gitea.sh pr-status <owner>/<repo> <pr-index> # 印出「{state} {merged} {mergeable}」 +# gitea.sh pr-get <owner>/<repo> <pr-index> # 印出 PR 的標題、base 分支與描述,供比對用 +# gitea.sh pr-edit <owner>/<repo> <pr-index> <title> <body-file> # 更新 PR 的標題與描述 # gitea.sh pr-comments <owner>/<repo> <pr-index> # 印出所有留言(issue 留言、審查評語、行內留言),依時間排序 # gitea.sh pr-depend <owner>/<repo> <pr-index> <dep-owner>/<dep-repo> <dep-index> # 把 PR 掛上前置 PR 依賴;依賴未關閉前 Gitea 會阻擋合併 @@ -219,6 +221,42 @@ import json,sys p=json.load(sys.stdin) print("%s %s %s" % (p.get("state","?"), str(p.get("merged")).lower(), str(p.get("mergeable")).lower())) ' ;; + pr-get) + # 印出 PR 的標題、base 分支與描述,供呼叫端比對本機資料是否已經跟 PR 不一致。 + # 格式固定三段,描述放最後一段,因為只有它會多行: + # 第 1 行 title<TAB>{標題} + # 第 2 行 base<TAB>{base 分支} + # 第 3 行 body (單獨一個字,當描述的起始標記) + # 第 4 行起 描述原文,一直到檔尾 + # 呼叫端取標題用 head -n1 | cut -f2-,取 base 用 sed -n 2p | cut -f2-, + # 取描述用 tail -n +4,全程不必解析 JSON。 + or="${1:?owner/repo required}"; idx="${2:?pr index required}" + if ! out=$(req GET "/repos/$or/pulls/$idx"); then + printf '%s\n' "$out" >&2; exit 4 + fi + printf '%s' "$out" | python3 -c ' +import json,sys +p=json.load(sys.stdin) +print("title\t%s" % (p.get("title") or "")) +print("base\t%s" % ((p.get("base") or {}).get("ref") or "")) +print("body") +sys.stdout.write(p.get("body") or "") +' ;; + pr-edit) + # 更新 PR 的標題與描述。描述從檔案讀,才裝得下多行內容與全形標點。 + 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; } + tmp=$(mktemp) + python3 -c ' +import json,sys +print(json.dumps({"title":sys.argv[1],"body":open(sys.argv[2],encoding="utf-8").read()})) +' "$title" "$body_file" > "$tmp" + if ! out=$(req PATCH "/repos/$or/pulls/$idx" "$tmp"); then + rm -f "$tmp"; printf '%s\n' "$out" >&2; exit 4 + fi + rm -f "$tmp" + echo "OK $or#$idx" ;; pr-comments) # 印出 PR 的所有留言,每行「{時間}<TAB>{作者}<TAB>{類型}<TAB>{內容單行化}」。 # 三個來源都要讀:issue 留言、review 本體的評語、review 內逐行的程式碼留言。