31e0d42a1d
Instead of checking each directory in series, kick off the checks in parallel and then wait for them to finish. Failures print out with file information, so mixing output isn't a problem. This reduces the time it takes to run on lumberingbuilder by 60%. This could probably be sped up even more by splitting up src/mainboard into smaller sections. This method does skip a few control files at the top level - .gitignore, .checkpatch.conf, gnat.adc, etc. These could be added to the list of files to check, but I didn't think it was needed. Change-Id: I171977e713a9956cf4142cfc0a199e10040abb35 Signed-off-by: Martin Roth <gaumless@gmail.com> Reviewed-on: https://review.coreboot.org/27011 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Patrick Georgi <pgeorgi@google.com>
80 lines
2.4 KiB
Bash
Executable file
80 lines
2.4 KiB
Bash
Executable file
#!/bin/sh
|
|
# This file is part of the coreboot project.
|
|
#
|
|
# Copyright (C) 2016 Google Inc.
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; version 2 of the License.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# 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/\|util/romcc/\|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
|