#!/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 #