74 lines
3.3 KiB
Bash
Executable File
74 lines
3.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Stop hook — ヘルプ/更新履歴の更新もれを知らせる(警告のみ・非ブロック)。
|
|
#
|
|
# フィーチャーブランチに「ユーザー向けのコード変更」が commit 済みなのに、
|
|
# ヘルプ (ui/src/content/help/) と更新履歴 (00-changelog.md) が未更新のとき、
|
|
# 目に見える警告を 1 つ出すだけ。作業はブロックしない(更新するかは開発者が判断)。
|
|
#
|
|
# 設計メモ:
|
|
# - main/master では何もしない(トランク自体には enforce しない)
|
|
# - 判定は base ブランチとの "commit 済み差分" のみ。編集途中(未コミット)では黙る
|
|
# - ヒューリスティックなので、内部リファクタ等で誤検知したら無視してよい
|
|
|
|
# `set -e` は使わない([ ... ] && exit の評価で意図せず抜けるのを避けるため)。
|
|
|
|
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." 2>/dev/null && pwd)"
|
|
[ -n "$ROOT" ] || exit 0
|
|
cd "$ROOT" 2>/dev/null || exit 0
|
|
|
|
git rev-parse --is-inside-work-tree >/dev/null 2>&1 || exit 0
|
|
|
|
BRANCH="$(git rev-parse --abbrev-ref HEAD 2>/dev/null)"
|
|
case "$BRANCH" in
|
|
main|master|HEAD|"") exit 0 ;;
|
|
esac
|
|
|
|
# 差分の基準ブランチを決める。
|
|
BASE=""
|
|
for ref in origin/main main origin/master master; do
|
|
if git rev-parse --verify --quiet "$ref" >/dev/null 2>&1; then
|
|
BASE="$ref"
|
|
break
|
|
fi
|
|
done
|
|
[ -n "$BASE" ] || exit 0
|
|
|
|
# このブランチが base に対して触ったファイル(commit 済みのみ)。
|
|
CHANGED="$(git diff --name-only "$BASE"...HEAD 2>/dev/null)"
|
|
[ -n "$CHANGED" ] || exit 0
|
|
|
|
CHANGELOG="ui/src/content/help/00-changelog.md"
|
|
|
|
changelog_touched=0
|
|
user_facing=0
|
|
while IFS= read -r f; do
|
|
[ -n "$f" ] || continue
|
|
case "$f" in
|
|
"$CHANGELOG") changelog_touched=1 ;;
|
|
esac
|
|
case "$f" in
|
|
*.test.ts|*.test.tsx|*.spec.ts) ;; # テストは対象外
|
|
ui/src/content/help/*) ;; # ヘルプ本文そのものは対象外
|
|
ui/src/i18n/*) ;; # 文言だけの変更は対象外
|
|
ui/src/*|src/*|pieces/*) user_facing=1 ;; # ユーザーに影響しうるコード
|
|
esac
|
|
done <<< "$CHANGED"
|
|
|
|
# ユーザー向け変更が無い、または更新履歴を既に更新済みなら何も言わない。
|
|
[ "$user_facing" -eq 1 ] || exit 0
|
|
[ "$changelog_touched" -eq 0 ] || exit 0
|
|
|
|
MSG="📝 ヘルプ未更新のお知らせ: ブランチ '${BRANCH}' に機能コードの変更がありますが、更新履歴 (${CHANGELOG}) は未更新です。ユーザー向けの変更なら、該当するヘルプ (ui/src/content/help/*.md) と更新履歴に追記してください。内部リファクタ等で不要なら無視して構いません。"
|
|
|
|
# 可視の警告として出すだけ(decision を設定しないので stop はブロックしない)。
|
|
# Stop フックは stdout の JSON `systemMessage` のみを画面に出す(stderr は出ない)ため、
|
|
# 必ず stdout に JSON を書く。
|
|
if command -v python3 >/dev/null 2>&1; then
|
|
printf '{"systemMessage": %s}\n' "$(MSG="$MSG" python3 -c 'import json,os; print(json.dumps(os.environ["MSG"]))')"
|
|
else
|
|
# python3 が無い環境向けフォールバック。" と \ を手でエスケープして stdout に出す。
|
|
esc="$(printf '%s' "$MSG" | sed 's/\\/\\\\/g; s/"/\\"/g')"
|
|
printf '{"systemMessage": "%s"}\n' "$esc"
|
|
fi
|
|
exit 0
|