#!/usr/bin/env sh # slugify.sh — 把分支類型與描述轉成 ASCII 分支名 slug。 # 用法: slugify.sh {type} {phrase} # 規則: 全部轉小寫,非 a-z0-9 的字元換成連字號, # 連續連字號合併成一個,並去除開頭與結尾的連字號。 # 輸出: {type}/{slug}(例如: slugify.sh feat "export report" → feat/export-report) # 結束碼: 0=stdout 印出 {type}/{slug},直接拿去當分支名。 # 1=參數少於兩個。補上 type 與 phrase 再重跑。 # 2=type 或 phrase 含非 ASCII 字元。先把描述翻成英文短語再重跑, # 不要自己動手拼分支名。 # 3=phrase slug 化之後是空字串(裡面一個 a-z0-9 都沒有)。換一句英文短語再重跑。 # 錯誤訊息都印到 stderr,其中 2 與 3 印繁體中文。 set -u if [ "$#" -lt 2 ]; then echo "用法: slugify.sh {type} {phrase}" >&2 exit 1 fi TYPE="$1" shift PHRASE="$*" slug=$(printf '%s' "$PHRASE" | tr '[:upper:]' '[:lower:]' | sed -e 's/[^a-z0-9]/-/g' -e 's/-\{2,\}/-/g' -e 's/^-//' -e 's/-$//') if printf '%s%s' "$TYPE" "$PHRASE" | LC_ALL=C grep -q '[^ -~]'; then echo "錯誤: 分支名只允許 ASCII。請先把標題翻譯成英文短語,再交給 slugify.sh。" >&2 exit 2 fi if [ -z "$slug" ]; then echo "錯誤: 標題 slug 化後是空字串,組不出分支名。請先把標題翻譯成英文短語,再交給 slugify.sh。" >&2 exit 3 fi printf '%s/%s\n' "$TYPE" "$slug"