Files
git/tools/pick-type.sh
jiantw83 bd277b6e55 feat(tools): 新增 commit 型別優先序腳本
型別優先序原本抄在技能內文裡。改一次要跟著改好幾份,很容易對不起來。
現在把順序收進腳本,讓它成為唯一真實來源。

- 參數與標準輸入都收,commit 標題整行餵進來也認得出型別。
- 沒收到輸入回傳 2,輸入裡沒有階梯表型別回傳 3,呼叫端據此分流。
- 錯誤訊息一律印繁體中文到 stderr。
2026-08-31 11:05:49 +08:00

41 lines
1.7 KiB
Bash
Executable File

#!/usr/bin/env sh
# pick-type.sh — 從一組 commit 型別中選出優先度最高的一個。
# 用法: pick-type.sh {型別或 commit 標題}...
# git log --format=%s {範圍} | pick-type.sh
#
# 說明: 優先序固定為 revert > fix > feat > perf > refactor > test > docs > style > chore。
# 這支腳本是該優先序的唯一真實來源,SKILL.md 不再抄一份。
# 帶參數就讀參數,一個參數算一項;沒帶參數就讀標準輸入,一行算一項。
# 每一項只取冒號、左括號、驚嘆號之前的字,所以 commit 標題整行餵進來也認得出型別。
# 認不得的項目直接略過,不影響其他項目。
#
# 輸出: 勝出的型別(一行,例如: feat)。
# 結束碼: 0 選出型別;2 沒有收到任何輸入;3 輸入裡沒有階梯表內的型別。
# 錯誤訊息一律印繁中到 stderr。
set -u
if [ "$#" -gt 0 ]; then
RAW=$(printf '%s\n' "$@")
else
RAW=$(cat)
fi
if [ -z "$(printf '%s' "$RAW" | tr -d '[:space:]')" ]; then
echo "錯誤: 沒有收到任何型別。請把 git log 取出的型別集合當參數傳入,或從標準輸入餵進來。" >&2
exit 2
fi
NORM=$(printf '%s\n' "$RAW" \
| sed -e 's/[(:!].*$//' -e 's/[[:space:]]//g' \
| tr '[:upper:]' '[:lower:]')
for candidate in revert fix feat perf refactor test docs style chore; do
if printf '%s\n' "$NORM" | grep -qx "$candidate"; then
printf '%s\n' "$candidate"
exit 0
fi
done
echo "錯誤: 輸入裡沒有階梯表內的型別。請確認 commit 訊息符合 {類型}({範圍}): {訊息} 格式,型別限 revert、fix、feat、perf、refactor、test、docs、style、chore。" >&2
exit 3