coreboot-kgpe-d16/util/lint/lint-extended-015-final-newlines
Martin Roth 0ad5fbd48d util: Update all shebangs to use /usr/bin/env
Instead of hardcoding paths to the executables, use the version in the
path.  This allows the scripts to work on more systems, and allows the
binary version to be changed more easily if needed.

Signed-off-by: Martin Roth <martin@coreboot.org>
Change-Id: Ifcc56aa21092cd3866eacb6a02d198110ec6051d
Reviewed-on: https://review.coreboot.org/c/coreboot/+/48904
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Angel Pons <th3fanbus@gmail.com>
2021-01-25 08:57:40 +00:00

70 lines
1.9 KiB
Bash
Executable file

#!/usr/bin/env sh
#
# SPDX-License-Identifier: GPL-2.0-only
# DESCR: Check that files end with a single newline
LC_ALL=C export LC_ALL
PIDS=""
INCLUDED_DIRS_AND_FILES='util/* src/* payloads/* configs/* Makefile *.inc'
EXCLUDED_DIRS='src/vendorcode/\|cbfstool/lzma/\|cbfstool/lz4/\|Documentation/\|build/\|3rdparty/\|\.git/\|coreboot-builds/\|util/nvidia/cbootimage/'
EXCLUDED_FILES='\.jpg$\|\.cksum$\|\.bin$\|\.vbt$\|\.hex$\|\.ico$\|\.o$\|\.bz2$\|\.xz$\|^.tmpconfig\|\.pyc$\|_shipped$\|sha256$\|\.png$\|\.patch$'
# Use git ls-files if the code is in a git repo, otherwise use find.
if [ -n "$(command -v git)" ] && \
[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" = "true" ]
then
FIND_FILES="git ls-files"
else
FIND_FILES="find"
fi
HAVE_FILE=$(command -v file 1>/dev/null 2>&1; echo $?)
is_eligible_executable() {
if [ "$HAVE_FILE" -ne 0 ]; then
return 1
fi
if { LC_ALL=C; file --brief "$filename" | grep -Eqw \
"^(Bourne shell|POSIX shell|Perl|Python) script"; };
then
return 0
else
return 1
fi
}
test_for_final_newline() {
while read filename; do
# Only check regular files and script executables
if [ -f "$filename" ] && { [ ! -x "$filename" ] || \
is_eligible_executable "$filename"; };
then
# Verify that there is a newline at the end
# $() strips trailing newlines
if [ -n "$(tail -c 1 "$filename")" ]; then
echo "$filename has no final newline."
# Verify that the file ends with only a single newline
# and that the file isn't empty
elif [ -z "$(tail -c 2 "$filename")" ] && \
[ -n "$(head -n 5 "$filename")" ]; then
echo "$filename has multiple final newlines."
fi
fi
done
}
for directory in $INCLUDED_DIRS_AND_FILES ; do
${FIND_FILES} ${directory} | sed 's|^\./||' | sort | \
grep -v "$EXCLUDED_DIRS" | \
grep -v "$EXCLUDED_FILES" | \
test_for_final_newline &
PIDS="$PIDS $!"
done
# wait for tests to finish.
for pid in $PIDS; do
wait "$pid"
done