From 655012713c553bbf3e04a6a3c28031071be15a17 Mon Sep 17 00:00:00 2001 From: Andrew Duffy Date: Mon, 23 Feb 2026 11:29:01 -0500 Subject: [PATCH 1/2] add CI check for file names Signed-off-by: Andrew Duffy --- .github/workflows/validate-proposals.yml | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/validate-proposals.yml diff --git a/.github/workflows/validate-proposals.yml b/.github/workflows/validate-proposals.yml new file mode 100644 index 0000000..351e973 --- /dev/null +++ b/.github/workflows/validate-proposals.yml @@ -0,0 +1,39 @@ +name: Validate Proposals + +on: + pull_request: + branches: + - develop + +jobs: + validate-naming: + name: Validate proposal naming convention + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Validate proposal file names + run: | + exit_code=0 + + # Find all files in proposals/ directory (if it exists) + if [ -d "proposals" ]; then + for file in proposals/*; do + # Skip if no files match (glob returns literal pattern) + [ -e "$file" ] || continue + + filename=$(basename "$file") + + # Check if file matches the expected pattern: NNNN-*.md + if ! echo "$filename" | grep -qE '^[0-9]{4}-[a-zA-Z0-9_-]+\.md$'; then + echo "ERROR: Invalid filename: $filename" + echo " Expected format: NNNN-name.md (e.g., 0007-my-proposal.md)" + exit_code=1 + else + echo "OK: $filename" + fi + done + fi + + exit $exit_code From 6925614f048117aa701f2edb1c0f0c8591ca1b34 Mon Sep 17 00:00:00 2001 From: Andrew Duffy Date: Mon, 23 Feb 2026 11:40:29 -0500 Subject: [PATCH 2/2] extract out to script Signed-off-by: Andrew Duffy --- .github/workflows/validate-proposals.yml | 24 +----------- scripts/validate-proposals.sh | 50 ++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 23 deletions(-) create mode 100755 scripts/validate-proposals.sh diff --git a/.github/workflows/validate-proposals.yml b/.github/workflows/validate-proposals.yml index 351e973..32b186a 100644 --- a/.github/workflows/validate-proposals.yml +++ b/.github/workflows/validate-proposals.yml @@ -14,26 +14,4 @@ jobs: uses: actions/checkout@v4 - name: Validate proposal file names - run: | - exit_code=0 - - # Find all files in proposals/ directory (if it exists) - if [ -d "proposals" ]; then - for file in proposals/*; do - # Skip if no files match (glob returns literal pattern) - [ -e "$file" ] || continue - - filename=$(basename "$file") - - # Check if file matches the expected pattern: NNNN-*.md - if ! echo "$filename" | grep -qE '^[0-9]{4}-[a-zA-Z0-9_-]+\.md$'; then - echo "ERROR: Invalid filename: $filename" - echo " Expected format: NNNN-name.md (e.g., 0007-my-proposal.md)" - exit_code=1 - else - echo "OK: $filename" - fi - done - fi - - exit $exit_code + run: ./scripts/validate-proposals.sh diff --git a/scripts/validate-proposals.sh b/scripts/validate-proposals.sh new file mode 100755 index 0000000..4325d9f --- /dev/null +++ b/scripts/validate-proposals.sh @@ -0,0 +1,50 @@ +#!/usr/bin/env bash +set -euo pipefail + +validate_file() { + local filename="$1" + + # Check if file matches the expected pattern: NNNN-*.md + if ! echo "$filename" | grep -qE '^[0-9]{4}-[a-zA-Z0-9_-]+\.md$'; then + echo "ERROR: Invalid filename: $filename" + echo " Expected format: NNNN-name.md (e.g., 0007-my-proposal.md)" + return 1 + fi + + return 0 +} + +exit_code=0 +valid_ids="" + +# Find all files in proposals/ directory (if it exists) +if [ -d "proposals" ]; then + for file in $(ls proposals/ | sort); do + file="proposals/$file" + # Skip if no files match (glob returns literal pattern) + [ -e "$file" ] || continue + + filename=$(basename "$file") + + if validate_file "$filename"; then + echo "OK: $filename" + # Collect ID and filename for duplicate checking + id="${filename:0:4}" + valid_ids="${valid_ids}${id} ${filename}"$'\n' + else + exit_code=1 + fi + done + + # Check for duplicate IDs + duplicate_ids=$(echo "$valid_ids" | awk '{print $1}' | sort | uniq -d) + if [ -n "$duplicate_ids" ]; then + for dup_id in $duplicate_ids; do + files=$(echo "$valid_ids" | grep "^$dup_id " | awk '{print $2}' | tr '\n' ' ') + echo "ERROR: Duplicate ID $dup_id found in: $files" + done + exit_code=1 + fi +fi + +exit $exit_code