#!/usr/bin/env sh # base-branch.sh — 決定 PR 的基底分支。 # 用法: base-branch.sh [caller-base] # 規則: 呼叫方傳入的分支最優先;呼叫方沒傳,才依序試 develop、main、master。 # 先 git fetch --prune origin,再確認選中的分支存在於遠端。 # 「有沒有傳」看參數個數,不看參數內容:呼叫方寫 base-branch.sh "$SOURCE_BRANCH" # 而變數沒設定時,那是空字串,不是沒傳。若當成沒傳就會悄悄退回 develop, # 把單一工作包直接合進 develop——這支腳本存在的目的就是擋這件事。 # 輸出: 選中的分支名(一行)。 # 護欄: 參數過多回傳 2;抓不到遠端回傳 3;呼叫方指定的分支不在遠端回傳 4; # develop、main、master 都不在遠端回傳 5;呼叫方傳入空字串回傳 6。 # 錯誤訊息一律印繁中到 stderr。 set -u if [ "$#" -gt 1 ]; then echo "用法: base-branch.sh [caller-base]" >&2 exit 2 fi ARGC=$# CALLER=${1:-} if [ "$ARGC" -eq 1 ] && [ -z "$CALLER" ]; then echo "錯誤: 呼叫方傳入空字串當基底分支。請確認來源分支變數有值,或整個參數不要傳。" >&2 exit 6 fi if ! git fetch --prune origin >/dev/null 2>&1; then echo "錯誤: 無法向 origin 取得遠端分支。請確認遠端可以連線,再重試。" >&2 exit 3 fi remote_has() { [ -n "$(git ls-remote --heads origin "refs/heads/$1" 2>/dev/null)" ] } if [ "$ARGC" -eq 1 ]; then if remote_has "$CALLER"; then printf '%s\n' "$CALLER" exit 0 fi echo "錯誤: 呼叫方指定的基底分支 $CALLER 不在 origin 上。請確認分支名,不要自行改用其他分支。" >&2 exit 4 fi for candidate in develop main master; do if remote_has "$candidate"; then printf '%s\n' "$candidate" exit 0 fi done echo "錯誤: origin 上找不到 develop、main、master。請由呼叫方指定基底分支。" >&2 exit 5