diff --git a/tools/pick-type.sh b/tools/pick-type.sh new file mode 100755 index 0000000..d45cd65 --- /dev/null +++ b/tools/pick-type.sh @@ -0,0 +1,40 @@ +#!/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