ccf34b1913
This adds pylint testing via make check, using the framework from Anaconda. False positives can be added to ./tests/pylint/pylint-false-positives
140 lines
4.0 KiB
Bash
Executable File
140 lines
4.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# This script will check the project for any pylint warning and errors using a set
|
|
# of options minimizing false positives, in combination with filtering of any
|
|
# warning regularexpressions listed in pylint-false-positives.
|
|
#
|
|
# If any warnings are found they will be stored in pylint-log and printed
|
|
# to stdout and this script will exit with a status of 1, if no (non filtered)
|
|
# warnings are found it exits with a status of 0
|
|
|
|
# XDG_RUNTIME_DIR is "required" to be set, so make one up in case something
|
|
# actually tries to do something with it
|
|
if [ -z "$XDG_RUNTIME_DIR" ]; then
|
|
export XDG_RUNTIME_DIR="$(mktemp -d)"
|
|
trap "rm -rf \"$XDG_RUNTIME_DIR\"" EXIT
|
|
fi
|
|
|
|
# If $top_srcdir is set, assume this is being run from automake and we don't
|
|
# need to keep a separate log
|
|
export pylint_log=0
|
|
if [ -z "$top_srcdir" ]; then
|
|
export pylint_log=1
|
|
fi
|
|
|
|
# Unset TERM so that things that use readline don't output terminal garbage
|
|
unset TERM
|
|
|
|
# Don't try to connect to the accessibility socket
|
|
export NO_AT_BRIDGE=1
|
|
|
|
# Force the GDK backend to X11. Otherwise if no display can be found, Gdk
|
|
# tries every backend type, which includes "broadway," which prints an error
|
|
# and keeps changing the content of said error.
|
|
export GDK_BACKEND=x11
|
|
|
|
# If $top_srcdir has not been set by automake, import the test environment
|
|
if [ -z "$top_srcdir" ]; then
|
|
top_srcdir="$(dirname "$0")/../.."
|
|
. ${top_srcdir}/tests/testenv.sh
|
|
fi
|
|
|
|
. ${top_srcdir}/tests/lib/testlib.sh
|
|
|
|
srcdir="${top_srcdir}/tests/pylint"
|
|
builddir="${top_builddir}/tests/pylint"
|
|
|
|
# Need to add the pylint module directory to PYTHONPATH as well.
|
|
export PYTHONPATH="${PYTHONPATH}:${srcdir}"
|
|
|
|
# Save analysis data in the pylint directory
|
|
export PYLINTHOME="${builddir}/.pylint.d"
|
|
[ -d "$PYLINTHOME" ] || mkdir "$PYLINTHOME"
|
|
|
|
export FALSE_POSITIVES="${srcdir}"/pylint-false-positives
|
|
|
|
# W0212 - Access to a protected member %s of a client class
|
|
export NON_STRICT_OPTIONS="--disable=W0212"
|
|
|
|
# E1103 - %s %r has no %r member (but some types could not be inferred)
|
|
export DISABLED_ERR_OPTIONS="--disable=E1103"
|
|
|
|
# W0110 - map/filter on lambda could be replaced by comprehension
|
|
# W0123 - Use of eval
|
|
# W0141 - Used builtin function %r
|
|
# W0142 - Used * or ** magic
|
|
# W0511 - Used when a warning note as FIXME or XXX is detected.
|
|
# W0603 - Using the global statement
|
|
# W0613 - Unused argument %r
|
|
# W0614 - Unused import %s from wildcard import
|
|
# I0011 - Locally disabling %s (i.e., pylint: disable)
|
|
# I0012 - Locally enabling %s (i.e., pylint: enable)
|
|
# I0013 - Ignoring entire file (i.e., pylint: skip-file)
|
|
export DISABLED_WARN_OPTIONS="--disable=W0110,W0123,W0141,W0142,W0511,W0603,W0613,W0614,I0011,I0012,I0013"
|
|
|
|
usage () {
|
|
echo "usage: `basename $0` [--strict] [--help] [files...]"
|
|
exit $1
|
|
}
|
|
|
|
# Separate the module parameters from the files list
|
|
ARGS=
|
|
FILES=
|
|
while [ $# -gt 0 ]; do
|
|
case $1 in
|
|
--strict)
|
|
export NON_STRICT_OPTIONS=
|
|
;;
|
|
--help)
|
|
usage 0
|
|
;;
|
|
-*)
|
|
ARGS="$ARGS $1"
|
|
;;
|
|
*)
|
|
FILES=$@
|
|
break
|
|
esac
|
|
shift
|
|
done
|
|
|
|
exit_status=0
|
|
|
|
if [ -s pylint-log ]; then
|
|
rm pylint-log
|
|
fi
|
|
|
|
# run pylint one file / module at a time, otherwise it sometimes gets
|
|
# confused
|
|
if [ -z "$FILES" ]; then
|
|
# Test any file that either ends in .py or contains #!/usr/bin/python in
|
|
# the first line. Scan everything except old_tests
|
|
FILES=$(findtestfiles \( -name '*.py' -o \
|
|
-exec /bin/sh -c "head -1 {} | grep -q '#!/usr/bin/python'" \; \) -print | \
|
|
egrep -v '(|/)old_tests/')
|
|
fi
|
|
|
|
num_cpus=$(getconf _NPROCESSORS_ONLN)
|
|
# run pylint in paralel
|
|
echo $FILES | xargs --max-procs=$num_cpus -n 1 "$srcdir"/pylint-one.sh $ARGS || exit 1
|
|
|
|
for file in $(find -name 'pylint-out*'); do
|
|
cat "$file" >> pylint-log
|
|
rm "$file"
|
|
done
|
|
|
|
fails=$(find -name 'pylint*failed' -print -exec rm '{}' \;)
|
|
if [ -z "$fails" ]; then
|
|
exit_status=0
|
|
else
|
|
exit_status=1
|
|
fi
|
|
|
|
if [ -s pylint-log ]; then
|
|
echo "pylint reports the following issues:"
|
|
cat pylint-log
|
|
elif [ -e pylint-log ]; then
|
|
rm pylint-log
|
|
fi
|
|
|
|
exit "$exit_status"
|