Skip to content

Release 2.1

Release 2.1 #27

name: Changelog Check
on:
pull_request:
branches:
- main
- master
push:
branches:
- main
- master
- dev
env:
# Directory containing the KiCad project files (replaced by init script)
BOARD_NAME_ANCHOR: hardware
jobs:
validate-hardware-changelog:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v5
- name: Validate Hardware Changelog Format
shell: bash
run: |
CHANGELOG_FILE="${{ env.BOARD_NAME_ANCHOR }}/CHANGELOG.md"
if [ ! -f "${CHANGELOG_FILE}" ]; then
echo "Error: CHANGELOG.md not found in directory"
exit 1
fi
echo "Validating CHANGELOG.md format..."
# Check if [Unreleased] section exists
if ! grep -q "\[Unreleased\]" "${CHANGELOG_FILE}"; then
echo "Error: [Unreleased] section not found in CHANGELOG.md"
exit 1
fi
# Extract [Unreleased] section content
UNRELEASED_CONTENT=$(awk '/\[Unreleased\]/,/^## \[/' "${CHANGELOG_FILE}" | sed '1d;$d')
if [ -z "${UNRELEASED_CONTENT}" ]; then
echo "Warning: [Unreleased] section is empty"
exit 0
fi
echo "Checking [Unreleased] section content..."
# Valid section headers
VALID_SECTIONS=("### Added" "### Changed" "### Fixed" "### Removed")
# Check for valid section headers
FOUND_SECTIONS=false
for section in "${VALID_SECTIONS[@]}"; do
if echo "${UNRELEASED_CONTENT}" | grep -q "^$section"; then
FOUND_SECTIONS=true
echo "✓ Found section: $section"
fi
done
if [ "${FOUND_SECTIONS}" = false ]; then
echo "Error: No valid sections found in [Unreleased]"
echo "Expected sections: Added, Changed, Fixed, Removed"
exit 1
fi
# Validate entry format: must start with "- " (dash + space/tab) and contain issue reference "(#number)"
ERROR_COUNT=0
LINE_NUMBER=0
echo ""
echo "Validating entry format..."
while IFS= read -r line; do
LINE_NUMBER=$((LINE_NUMBER + 1))
# Skip empty lines and section headers
if [[ -z "$line" ]] || [[ "$line" =~ ^### ]]; then
continue
fi
# Check if line is an entry (starts with -)
if [[ "$line" =~ ^[[:space:]]*- ]]; then
# Check for issue reference in format (#number)
if ! [[ "$line" =~ \(#[0-9]+\) ]]; then
echo "✗ Line $LINE_NUMBER: Missing or invalid issue reference (expected format: (#123))"
echo " Content: $line"
ERROR_COUNT=$((ERROR_COUNT + 1))
else
echo "✓ Line $LINE_NUMBER: Valid entry"
fi
elif [[ "$line" =~ ^[[:space:]]*[^-] ]]; then
# Line has content but doesn't start with -
echo "✗ Line $LINE_NUMBER: Entry must start with '- ' (dash + space)"
echo " Content: $line"
ERROR_COUNT=$((ERROR_COUNT + 1))
fi
done <<< "${UNRELEASED_CONTENT}"
echo ""
if [ ${ERROR_COUNT} -gt 0 ]; then
echo "=========================================="
echo "Changelog validation FAILED"
echo "=========================================="
echo "Found ${ERROR_COUNT} error(s)"
echo ""
echo "Requirements:"
echo "1. All entries must be grouped under: Added, Changed, Fixed, or Removed"
echo "2. Each entry must start with '- ' (dash + space or tab)"
echo "3. Each entry must contain an issue reference in format (#number)"
echo ""
echo "Example:"
echo "## [Unreleased]"
echo ""
echo "### Added"
echo "- New feature description (#123)"
echo "- Another feature (#124)"
echo ""
echo "### Fixed"
echo "- Bug fix description (#125)"
echo ""
exit 1
else
echo "=========================================="
echo "Changelog validation PASSED"
echo "=========================================="
echo "All entries in [Unreleased] are properly formatted"
fi
- name: Check for duplicate issue numbers
shell: bash
run: |
CHANGELOG_FILE="${{ env.BOARD_NAME_ANCHOR }}/CHANGELOG.md"
echo "Checking for duplicate issue numbers in [Unreleased] section..."
# Extract issue numbers from [Unreleased] section
UNRELEASED_CONTENT=$(awk '/\[Unreleased\]/,/^## \[/' "${CHANGELOG_FILE}" | sed '1d;$d')
if [ -z "${UNRELEASED_CONTENT}" ]; then
echo "No content to check"
exit 0
fi
# Extract all issue numbers
ISSUE_NUMBERS=$(echo "${UNRELEASED_CONTENT}" | grep -oP '\(#\K[0-9]+(?=\))' || true)
if [ -z "${ISSUE_NUMBERS}" ]; then
echo "No issue numbers found"
exit 0
fi
# Check for duplicates
DUPLICATES=$(echo "${ISSUE_NUMBERS}" | sort | uniq -d)
if [ -n "${DUPLICATES}" ]; then
echo "Warning: Duplicate issue numbers found in [Unreleased] section:"
echo "${DUPLICATES}" | while read -r issue; do
echo " - Issue #$issue appears multiple times"
done
echo ""
echo "This is not an error, but you may want to review if this is intentional"
else
echo "✓ No duplicate issue numbers found"
fi