#!/usr/bin/env bash # Branch, PR body, and commit contract checker. # v2: exits 1 on violation. Consumers that want warn-only set # continue-on-error: true on the job (or stay on @v1). set -euo pipefail BRANCH="${HEAD_BRANCH:-}" TITLE="${PR_TITLE:-}" AUTHOR="${PR_AUTHOR:-}" BODY="${PR_BODY:-}" BASE="${BASE_SHA:-}" HEAD="${HEAD_SHA:-}" # Gitea renders HTML comments as hidden. Validate the visible body so required # tracking and attribution cannot exist only in comment source. VISIBLE_BODY=$(printf '%s\n' "${BODY}" | awk ' { line=$0 fence_pos=1 while (fence_pos <= 3 && substr(line, fence_pos, 1) == " ") fence_pos++ fence_char=substr(line, fence_pos, 1) fence_run=0 if (fence_char == "`" || fence_char == "~") { while (substr(line, fence_pos + fence_run, 1) == fence_char) fence_run++ } if (in_fence) { print line if (fence_char == active_fence_char && fence_run >= active_fence_run) in_fence=0 next } if (fence_run >= 3) { in_fence=1 active_fence_char=fence_char active_fence_run=fence_run print line next } visible="" pos=1 while (pos <= length(line)) { if (in_comment) { rest=substr(line, pos) comment_end=index(rest, "-->") if (comment_end == 0) { pos=length(line) + 1 break } visible=visible " " pos += comment_end + 2 in_comment=0 continue } if (substr(line, pos, 1) == "`") { ticks=1 while (substr(line, pos + ticks, 1) == "`") ticks++ close_pos=pos + ticks found_close=0 while (close_pos <= length(line)) { if (substr(line, close_pos - 1, 1) != "`" && substr(line, close_pos, ticks) == substr(line, pos, ticks) && substr(line, close_pos + ticks, 1) != "`") { found_close=1 break } close_pos++ } if (found_close) { visible=visible substr(line, pos, close_pos + ticks - pos) pos=close_pos + ticks continue } } if (substr(line, pos, 4) == "