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