#!/usr/bin/env bash set -eu # n.b. this might be printed multiple times if any violating header files are # in different parallelism groups inside pre-commit. We cannot do anything about # this. explanation=$(cat <<'EOF' We found some header files that don't conform to the style guide. The Lix style guide requests that header files: - Begin with `#pragma once` so they only get parsed once - Contain a doxygen comment (`/**` or `///`) containing `@file`, for example, `///@file`, which will make doxygen generate docs for them. When adding that, consider also adding a `@brief` with a sentence explaining what the header is for. For more details: https://wiki.lix.systems/link/3#bkmrk-header-files EOF ) check_file() { grep -q "$1" "$2" || (echo "Missing pattern $1 in file $2" >&2; return 1) } patterns=( # makes a file get included only once even if it is included multiple times '^#pragma once$' # as used in ///@file, makes the file appear to doxygen '@file' ) fail=0 for pattern in "${patterns[@]}"; do for file in "$@"; do check_file "$pattern" "$file" || fail=1 done done if [[ $fail != 0 ]]; then echo "$explanation" >&2 exit 1 else echo OK fi