feat(gitea): 新增 pr-get 與 pr-edit 兩個 PR 子指令
What:`tools/gitea.sh` 新增 `pr-get` 與 `pr-edit`。`pr-get` 印出一支 PR 的標題、base 分支與描述,前三行固定 `title`、`base`、`body` 三個標記,第 4 行起是描述原文;`pr-edit` 從檔案讀描述,一次更新標題與描述。
Why:分支已經有 PR 時,每次認可之後都要比對標題、描述與前置 PR 依賴三項,有差才更新。原本只有 `pr-create` 與 `pr-status`,讀不到既有 PR 的標題與描述,比不了就只能重開一支 PR 或整支蓋掉,兩種都會把審查中的討論打斷。
How:`pr-get` 把唯一會多行的描述放在輸出最後一段,呼叫端用 `head -n1`、`sed -n 2p`、`tail -n +4` 就取得到三個欄位,全程不必解析 JSON。`pr-edit` 的描述走檔案而不走參數,多行內容與全形標點才裝得下;描述檔不存在回 `2`,API 呼叫失敗回 `4`,成功印 `OK {owner}/{repo}#{編號}`。
Who:`jsc-git:pr` 的既有 PR 校準步驟,以及任何要先比對 PR 現況再決定改不改的呼叫端。
This commit is contained in:
@@ -15,6 +15,8 @@
|
||||
# gitea.sh wiki-url <owner>/<repo> <page> # 印出 wiki 頁絕對網址(取自 API 的 html_url);跨存取庫連結用
|
||||
# gitea.sh pr-create <owner>/<repo> <head> <base> <title> <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 內逐行的程式碼留言。
|
||||
|
||||
Reference in New Issue
Block a user