|
1 | 1 | #!/bin/bash |
2 | 2 |
|
3 | | -# Get the latest commit message file |
4 | | -TMP_MSG_FILE="$1" |
| 3 | +# Validate that each commit in the PR has the correct role prefix |
| 4 | +# based on the roles modified in that specific commit. |
5 | 5 |
|
6 | | -if [ -z "$TMP_MSG_FILE" ]; then |
7 | | - TMP_MSG_FILE=$(mktemp) |
8 | | - git log -1 --pretty=format:"%B" | head -n1 |
| 6 | +if [ -z "$GITHUB_BASE_REF" ]; then |
| 7 | + echo "Not running in GitHub Actions - skipping check" |
| 8 | + exit 0 |
9 | 9 | fi |
10 | 10 |
|
11 | | -echo "Checking latest commit message:" |
12 | | -cat "$TMP_MSG_FILE" |
| 11 | +echo "Checking all commits in PR against base: origin/${GITHUB_BASE_REF}" |
| 12 | +echo "" |
13 | 13 |
|
14 | | -if [ -n "$GITHUB_BASE_REF" ]; then |
15 | | - CHANGED_ROLES=$(git diff "origin/${GITHUB_BASE_REF}" --name-only || true) |
16 | | -else |
17 | | - CHANGED_ROLES=$(git diff --cached --name-only || true) |
18 | | -fi |
| 14 | +# Get all commits in the PR |
| 15 | +COMMITS=$(git rev-list origin/${GITHUB_BASE_REF}..HEAD) |
19 | 16 |
|
20 | | -CHANGED_ROLES=$(echo "$CHANGED_ROLES" | grep '^roles/' | cut -d'/' -f2 | sort -u | xargs | sed 's/ /|/g') |
21 | | -if [ -z "$CHANGED_ROLES" ]; then |
22 | | - echo "No roles modified - skipping check..." |
| 17 | +if [ -z "$COMMITS" ]; then |
| 18 | + echo "No commits to check" |
23 | 19 | exit 0 |
24 | 20 | fi |
25 | 21 |
|
26 | | -echo -e "\n\nDetected changes in roles: **$CHANGED_ROLES**" |
27 | | -MSG=$(head -n 1 "$TMP_MSG_FILE") |
28 | | -ROLE_COUNT=$(echo "$CHANGED_ROLES" | tr '|' '\n' | wc -l) |
| 22 | +FAILED=0 |
29 | 23 |
|
30 | | -if [ "$ROLE_COUNT" -eq 1 ]; then |
31 | | - # shellcheck disable=SC2016 |
32 | | - ESCAPED_ROLE=$(printf '%s\n' "$CHANGED_ROLES" | sed 's/[]\.*^$()+?{|]/\\&/g') |
33 | | - PATTERN="^[[(]${ESCAPED_ROLE}[])]" |
34 | | -else |
35 | | - PATTERN="^[[(](multiple)[])]" |
36 | | -fi |
| 24 | +# Check each commit individually |
| 25 | +while IFS= read -r COMMIT; do |
| 26 | + MSG=$(git log -1 --pretty=format:"%s" "$COMMIT") |
| 27 | + echo "Checking commit ${COMMIT:0:8}: $MSG" |
| 28 | + |
| 29 | + # Get roles changed in THIS commit only |
| 30 | + CHANGED_ROLES=$(git diff-tree --no-commit-id --name-only -r "$COMMIT" | grep '^roles/' | cut -d'/' -f2 | sort -u | xargs | sed 's/ /|/g') |
| 31 | + |
| 32 | + if [ -z "$CHANGED_ROLES" ]; then |
| 33 | + echo " No roles modified - skipping" |
| 34 | + echo "" |
| 35 | + continue |
| 36 | + fi |
| 37 | + |
| 38 | + echo " Changed roles: $CHANGED_ROLES" |
| 39 | + |
| 40 | + ROLE_COUNT=$(echo "$CHANGED_ROLES" | tr '|' '\n' | wc -l) |
| 41 | + |
| 42 | + if [ "$ROLE_COUNT" -eq 1 ]; then |
| 43 | + # shellcheck disable=SC2016 |
| 44 | + ESCAPED_ROLE=$(printf '%s\n' "$CHANGED_ROLES" | sed 's/[]\.*^$()+?{|]/\\&/g') |
| 45 | + PATTERN="^[[(]${ESCAPED_ROLE}[])]" |
| 46 | + else |
| 47 | + PATTERN="^[[(](multiple)[])]" |
| 48 | + fi |
| 49 | + |
| 50 | + if ! grep -qE "$PATTERN" <<<"$MSG"; then |
| 51 | + echo "" |
| 52 | + echo " **ERROR: Commit message must start with:**" |
| 53 | + if [ "$ROLE_COUNT" -eq 1 ]; then |
| 54 | + echo " [$CHANGED_ROLES]" |
| 55 | + else |
| 56 | + echo " (multiple)" |
| 57 | + fi |
| 58 | + echo "" |
| 59 | + FAILED=1 |
| 60 | + else |
| 61 | + echo " ✓ Valid prefix" |
| 62 | + fi |
| 63 | + echo "" |
| 64 | +done <<< "$COMMITS" |
37 | 65 |
|
38 | | -if ! grep -qE "$PATTERN" <<<"$MSG"; then |
39 | | - echo -e "\n**ERROR: Commit message must start with:**\n" |
40 | | - if [ "$ROLE_COUNT" -eq 1 ]; then echo -e "\t[$CHANGED_ROLES]\n"; fi |
41 | | - if [ "$ROLE_COUNT" -gt 1 ]; then echo -e "\t(multiple)\n\n"; fi |
42 | | - echo -e "Example commit header:\n" |
43 | | - echo -e "\t-[reproducer] fix task something\n" |
44 | | - echo -e "\t-(cifmw_helpers) improve code\n" |
45 | | - echo -e "\t-[multiple] updated default value" |
| 66 | +if [ $FAILED -eq 1 ]; then |
| 67 | + echo "Example commit messages:" |
| 68 | + echo " [reproducer] fix task something" |
| 69 | + echo " (multiple) updated default value" |
46 | 70 | exit 1 |
47 | 71 | fi |
48 | 72 |
|
49 | | -echo "Commit message prefix is valid." |
| 73 | +echo "Each commit message prefix is valid." |
0 commit comments