Skip to content

docs

docs #212

name: Parser Reference Guard
on:
pull_request:
types: [opened, synchronize, reopened, labeled, unlabeled]
jobs:
parser-reference-guard:
if: >
!contains(github.event.pull_request.labels.*.name, 'ignore-parser-reference-guard') &&
(github.event.action == 'opened' ||
github.event.action == 'synchronize' ||
github.event.action == 'reopened' ||
github.event.label.name == 'ignore-parser-reference-guard' ||
github.event.label.name == 'require-parser-reference-update')
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Verify parser references were updated when needed
env:
BASE_SHA: ${{ github.event.pull_request.base.sha }}
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
PR_LABELS: ${{ join(github.event.pull_request.labels.*.name, ',') }}
run: |
set -euo pipefail
CHANGED_FILES=$(git diff --name-only "$BASE_SHA" "$HEAD_SHA")
echo "Changed files:"
echo "$CHANGED_FILES"
echo "PR labels: ${PR_LABELS:-<none>}"
FORCE_LABEL="require-parser-reference-update"
IGNORE_LABEL="ignore-parser-reference-guard"
if [[ ",${PR_LABELS}," == *",${FORCE_LABEL},"* && \
",${PR_LABELS}," == *",${IGNORE_LABEL},"* ]]; then
echo "Conflicting labels: ${FORCE_LABEL} and ${IGNORE_LABEL}. Remove one."
exit 1
fi
if [[ ",${PR_LABELS}," == *",${IGNORE_LABEL},"* ]]; then
echo "${IGNORE_LABEL} label present; skipping guard."
exit 0
fi
C_DOC="docs/c_parser.md"
FORTRAN_DOC="docs/fortran_parser.md"
C_DOC_CHANGED=false
FORTRAN_DOC_CHANGED=false
C_PARSER_CHANGED=false
FORTRAN_PARSER_CHANGED=false
SHARED_PARSER_CHANGED=false
if grep -Fxq "$C_DOC" <<< "$CHANGED_FILES"; then
C_DOC_CHANGED=true
fi
if grep -Fxq "$FORTRAN_DOC" <<< "$CHANGED_FILES"; then
FORTRAN_DOC_CHANGED=true
fi
while IFS= read -r changed_file; do
case "$changed_file" in
c_parser/*|x2py/c_parser/*|tests/parser/c/*|tests/data/c/*|tests/parser/test_c_standard_type_probe.py)
C_PARSER_CHANGED=true
;;
fortran_parser/*|x2py/fortran_parser/*|tests/parser/fortran/*|tests/data/fortran/*)
FORTRAN_PARSER_CHANGED=true
;;
tests/parser/test_declaration_and_interface_edges.py|\
tests/parser/test_error_handling.py|\
tests/parser/test_fortran_fixture_suite.py|\
tests/parser/test_fortran_json_sanity.py|\
tests/parser/test_fortran_parser_regression_contracts.py|\
tests/parser/test_fortran_type_probe.py|\
tests/parser/test_function_header_parsing.py|\
tests/parser/test_parser_developer_tutorial.py|\
tests/parser/test_parser_public_entrypoints.py|\
tests/parser/test_procedure_and_type_parsing.py|\
tests/parser/test_project_scope_models.py|\
tests/parser/test_scope_handling.py)
FORTRAN_PARSER_CHANGED=true
;;
tests/parser/conftest.py|\
tests/parser/test_cli.py|\
tests/parser/test_preprocessing_cli.py|\
x2py/preprocessing.py)
SHARED_PARSER_CHANGED=true
;;
esac
done <<< "$CHANGED_FILES"
if [[ ",${PR_LABELS}," == *",${FORCE_LABEL},"* ]]; then
if [ "$C_DOC_CHANGED" = true ] || [ "$FORTRAN_DOC_CHANGED" = true ]; then
echo "${FORCE_LABEL} label present and at least one parser reference changed."
else
echo "${FORCE_LABEL} label present, but no parser reference changed."
echo "Update ${C_DOC} or ${FORTRAN_DOC}, or remove ${FORCE_LABEL}."
exit 1
fi
fi
FAILED=false
if [ "$C_PARSER_CHANGED" = true ] && [ "$C_DOC_CHANGED" != true ]; then
echo "C parser-related files changed without updating ${C_DOC}."
FAILED=true
fi
if [ "$FORTRAN_PARSER_CHANGED" = true ] && [ "$FORTRAN_DOC_CHANGED" != true ]; then
echo "Fortran parser-related files changed without updating ${FORTRAN_DOC}."
FAILED=true
fi
if [ "$SHARED_PARSER_CHANGED" = true ] && \
[ "$C_DOC_CHANGED" != true ] && \
[ "$FORTRAN_DOC_CHANGED" != true ]; then
echo "Shared parser workflow files changed without updating a parser reference."
echo "Update ${C_DOC} or ${FORTRAN_DOC}, whichever behavior changed."
FAILED=true
fi
if [ "$FAILED" = true ]; then
echo "Use ${IGNORE_LABEL} only when the parser reference is already accurate."
exit 1
fi
if [ "$C_DOC_CHANGED" = true ]; then
echo "${C_DOC} changed."
fi
if [ "$FORTRAN_DOC_CHANGED" = true ]; then
echo "${FORTRAN_DOC} changed."
fi
echo "Parser reference guard passed."