diff options
author | 2018-06-28 20:53:52 +0000 | |
---|---|---|
committer | 2018-06-28 20:53:52 +0000 | |
commit | c84b13a3b4259dfb450cde4ed3e9a0be6d3328bf (patch) | |
tree | a1597e2a0a295250e3b201e3c014ce04450e1727 /check | |
parent | 24d2216cc14e1022ffee04bcfe4bba8fa0357ba0 (diff) | |
parent | 389ec03b1e691911d0b58a186dc19f4bc18626a7 (diff) |
Merge "ci: Support for pylint and yamllint" into stable/fraser
Diffstat (limited to 'check')
-rwxr-xr-x | check | 223 |
1 files changed, 223 insertions, 0 deletions
@@ -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 +# |