aboutsummaryrefslogtreecommitdiffstats
path: root/check
diff options
context:
space:
mode:
Diffstat (limited to 'check')
-rwxr-xr-xcheck223
1 files changed, 223 insertions, 0 deletions
diff --git a/check b/check
new file mode 100755
index 0000000..0428fa6
--- /dev/null
+++ b/check
@@ -0,0 +1,223 @@
+#!/bin/bash
+
+# Copyright 2017-2018 Intel Corporation, Tieto
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Auto project python & yaml formatting checker
+# This script is based on the file ./check from OPNFV vswitchperf
+# project.
+
+#
+# Configuration
+#
+PYLINT="pylint"
+PYLINT_RC='pylintrc'
+PYTHON_FILE_REGEX="\.py$"
+YAMLLINT="yamllint"
+YAMLLINT_RC='yamllintrc'
+YAML_FILE_REGEX="\.yaml$"
+FILE_LIST="/tmp/auto_check_list.txt"
+
+CHECK_PYTHON=0
+CHECK_YAML=0
+
+#
+# Support Functions
+#
+# print usage if requested
+function usage() {
+ cat <<EOM
+Usage: $0 [TARGET]...
+
+Performs code check for defined TARGETs. Target can be file or directory.
+In case that directory is specified, then it will be searched recursively
+for all python and yaml files.
+If TARGET is not specified, then all python and yaml files from current AUTO
+repository will be checked.
+
+
+ -h, --help Script usage
+ -b, --black Suppress colours. Output will be black&white.
+ -m, --modified Script will check python and yaml files, which have
+ been modified within current repository.
+
+Examples:
+ ./check
+
+ Check all python and yaml files in current AUTO repository
+
+ ./check INFO.yaml
+
+ Check just one file.
+
+ ./check -m
+
+ Check all modified files in current AUTO repository
+
+ ./check lib/auto/testcase lib/auto/util
+
+ Check all python and yaml files in given directories
+
+EOM
+}
+
+# get list of files to be checked
+function get_file_list() {
+ # store file regex and shift params to get list of original ./check options
+ TMP_FILE_REGEX=$1
+ shift
+
+ rm $FILE_LIST &> /dev/null
+ if [ "x$1" == "x-m" -o "x$1" == "x--modified" ] ; then
+ # check of modified files requested
+ git status --porcelain | cut -b4- | egrep -i "${TMP_FILE_REGEX}" | sort > $FILE_LIST
+ elif [ "x$*" == "x" ] ; then
+ # list is empty, check all python files
+ git ls-tree --name-only -r HEAD | egrep -i "${TMP_FILE_REGEX}" | sort > $FILE_LIST
+ else
+ for item in $* ; do
+ if [ -d $item ] ; then
+ git ls-tree --name-only -r HEAD $item | egrep -i "${TMP_FILE_REGEX}" | sort >> $FILE_LIST
+ elif [ -f $item ] ; then
+ echo $item | egrep -i "${TMP_FILE_REGEX}" >> $FILE_LIST
+ else
+ echo "$item doesn't exist, thus check was aborted"
+ exit 1
+ fi
+ done
+ fi
+}
+
+function check_lint_binary() {
+ # check if lint binary is available
+ if ! which $1 &>/dev/null ; then
+ echo "$1 is not available, thus check can't be executed"
+ return 1
+ fi
+ return 0
+}
+
+
+function check_python() {
+ echo "Execution of pylint checks:"
+
+ if ! check_lint_binary $PYLINT ; then
+ CHECK_PYTHON=1
+ return
+ fi
+
+ # check if there is anything to check
+ if [ -s $FILE_LIST ] ; then
+ for pyfile in `cat $FILE_LIST | sort` ; do
+ # get base name
+ pyfile_basename="'"`basename $pyfile .py`"'"
+ # run pylint and extract final rating
+ output=`$PYLINT --rcfile $PYLINT_RC $pyfile 2>/dev/null`
+ rating=`echo -e $output | tail -n3 | grep rated | sed -e 's/^.*rated at \(-\?[0-9.]*\).*$/\1/'`
+ # evaluate and display aquired rating
+ if [ "x$rating" == "x" ] ; then
+ # rating is not available for files without python statements
+ printf " %-70s %-6s\n" $pyfile "NA"
+ elif [ "$rating" == "10" ] ; then
+ printf " %-70s ${GREEN}%-6s${BLACK}\n" $pyfile "OK"
+ else
+ CHECK_PYTHON=1
+ echo -e "$output" | awk '/^\*+ Module|^[A-Z]\:/'
+ printf " %-70s ${RED}%-6s${BLACK}\n" $pyfile $rating
+ fi
+ done
+ else
+ echo " Nothing to check."
+ fi
+}
+
+function check_yaml() {
+ echo "Execution of yaml checks:"
+
+ if ! check_lint_binary $YAMLLINT ; then
+ CHECK_YAML=1
+ return
+ fi
+
+ # check if there is anything to check
+ if [ -s $FILE_LIST ] ; then
+ for yamlfile in `cat $FILE_LIST | sort` ; do
+ output=`$YAMLLINT -c $YAMLLINT_RC $yamlfile 2>/dev/null`
+ if [ $? -eq 0 ] ; then
+ printf " %-70s ${GREEN}%-6s${BLACK}\n" $yamlfile "OK"
+ else
+ CHECK_YAML=1
+ echo "$output"
+ printf " %-70s ${RED}%-6s${BLACK}\n" $yamlfile "FAILED"
+ fi
+ done
+ else
+ echo " Nothing to check."
+ fi
+}
+
+#
+# Main
+#
+# check if help is requested
+if [ "x$1" == "x-h" -o "x$1" == "x--help" ] ; then
+ usage
+ exit 0
+fi
+
+# set colours
+if [ "x$1" == "x-b" -o "x$1" == "x--black" ] ; then
+ shift
+ RED=""
+ GREEN=""
+ BLACK=""
+else
+ RED="\e[31m"
+ GREEN="\e[32m"
+ BLACK="\e[0m"
+fi
+
+# check if we were run within auto directory
+if [ ! -x ./check 2> /dev/null ] ; then
+ echo "`basename $0` must be run from auto root directory"
+ exit 1
+fi
+
+# run python checks
+get_file_list $PYTHON_FILE_REGEX $*
+check_python
+
+echo
+
+# run yaml checks
+get_file_list $YAML_FILE_REGEX $*
+check_yaml
+
+# clean up
+rm $FILE_LIST &> /dev/null
+
+# return success or failure based on pylint and yamllint checks
+# NOTE: As of now, failure of pylint checks is not propagated into exit code.
+# This will be turned on again after the rating of existing python
+# files will be improved.
+# if [ $CHECK_PYTHON -eq 0 -a $CHECK_YAML -eq 0 ] ; then
+if [ $CHECK_YAML -eq 0 ] ; then
+ exit 0
+else
+ exit 1
+fi
+
+#
+# The End
+#