48 lines
1.2 KiB
Bash
48 lines
1.2 KiB
Bash
|
#!/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
|