2026-07-25 19:01:08 +00:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
# Branch and PR title naming-standard checker.
|
2026-07-26 18:05:26 +00:00
|
|
|
# v2: exits 1 on violation. Consumers that want warn-only set
|
|
|
|
|
# continue-on-error: true on the job (or stay on @v1).
|
2026-07-25 19:01:08 +00:00
|
|
|
set -euo pipefail
|
|
|
|
|
|
|
|
|
|
BRANCH="${HEAD_BRANCH:-}"
|
|
|
|
|
TITLE="${PR_TITLE:-}"
|
|
|
|
|
AUTHOR="${PR_AUTHOR:-}"
|
|
|
|
|
|
|
|
|
|
# Break-glass: dfritz is exempt from all naming checks.
|
|
|
|
|
if [ "${AUTHOR}" = "dfritz" ]; then
|
|
|
|
|
echo "check-naming: dfritz break-glass — exempt"
|
|
|
|
|
exit 0
|
|
|
|
|
fi
|
|
|
|
|
|
2026-07-26 18:05:26 +00:00
|
|
|
FAILED=0
|
2026-07-25 19:01:08 +00:00
|
|
|
BRANCH_KIND="invalid"
|
|
|
|
|
BRANCH_BUG=""
|
|
|
|
|
|
|
|
|
|
# ---- branch form ----
|
|
|
|
|
# <role>/bug-<id>/<kebab>
|
|
|
|
|
if echo "${BRANCH}" | grep -qE "^(dev|ux|ops|security|perf|architect|support)/bug-[a-z0-9]+/[a-z0-9][a-z0-9-]*$"; then
|
|
|
|
|
BRANCH_KIND="role-bug"
|
|
|
|
|
BRANCH_BUG=$(echo "${BRANCH}" | sed -E 's|^[^/]+/(bug-[a-z0-9]+)/.*|\1|')
|
|
|
|
|
# chore/<kebab>
|
|
|
|
|
elif echo "${BRANCH}" | grep -qE "^chore/[a-z0-9][a-z0-9-]*$"; then
|
|
|
|
|
BRANCH_KIND="chore"
|
|
|
|
|
else
|
2026-07-26 18:05:26 +00:00
|
|
|
echo "FAIL[check-naming]: branch '${BRANCH}' does not match convention"
|
2026-07-25 19:01:08 +00:00
|
|
|
echo " expected: <role>/bug-<id>/<kebab> (role: dev|ux|ops|security|perf|architect|support)"
|
|
|
|
|
echo " or: chore/<kebab>"
|
2026-07-26 18:05:26 +00:00
|
|
|
FAILED=1
|
2026-07-25 19:01:08 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# ---- title form ----
|
|
|
|
|
TITLE_BUG=""
|
|
|
|
|
if echo "${TITLE}" | grep -qE "^\[bug-[a-z0-9]+\] ."; then
|
|
|
|
|
TITLE_BUG=$(echo "${TITLE}" | sed -E 's|^\[(bug-[a-z0-9]+)\].*|\1|')
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
if [ "${BRANCH_KIND}" = "role-bug" ]; then
|
|
|
|
|
if [ -z "${TITLE_BUG}" ]; then
|
2026-07-26 18:05:26 +00:00
|
|
|
echo "FAIL[check-naming]: title missing [${BRANCH_BUG}] prefix for branch '${BRANCH}'"
|
|
|
|
|
FAILED=1
|
2026-07-25 19:01:08 +00:00
|
|
|
elif [ "${TITLE_BUG}" != "${BRANCH_BUG}" ]; then
|
2026-07-26 18:05:26 +00:00
|
|
|
echo "FAIL[check-naming]: bug-id mismatch — branch carries '${BRANCH_BUG}' but title carries '${TITLE_BUG}'"
|
|
|
|
|
FAILED=1
|
2026-07-25 19:01:08 +00:00
|
|
|
fi
|
|
|
|
|
elif [ "${BRANCH_KIND}" = "chore" ] && [ -n "${TITLE_BUG}" ]; then
|
2026-07-26 18:05:26 +00:00
|
|
|
echo "FAIL[check-naming]: chore branch should not carry a [bug-id] title prefix"
|
|
|
|
|
FAILED=1
|
2026-07-25 19:01:08 +00:00
|
|
|
fi
|
|
|
|
|
|
2026-07-26 18:05:26 +00:00
|
|
|
if [ "${FAILED}" -eq 0 ]; then
|
2026-07-25 19:01:08 +00:00
|
|
|
echo "check-naming: ok"
|
|
|
|
|
fi
|
|
|
|
|
|
2026-07-26 18:05:26 +00:00
|
|
|
exit "${FAILED}"
|