diff options
Diffstat (limited to 'check')
-rwxr-xr-x | check | 143 |
1 files changed, 143 insertions, 0 deletions
@@ -0,0 +1,143 @@ +#!/bin/bash + +# Copyright 2015 Intel Corporation. +# +# 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. + +# VSPERF code checker + +PYLINT="pylint" +PYLINT_RC='pylintrc' +PYLINT_RATING_GATE="10" +FILE_REGEX="(vsperf|.*\.py)" +FIND_OPTIONS="-regextype posix-egrep -iregex (./)?$FILE_REGEX" +FILE_LIST="/tmp/vsperf_check_list.txt" + +# 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 files. +If TARGET is not specified, then all python files from current VSPERF +repository will be checked. +Files listed in EXCLUDE_MODULES defined in conf/00_common.conf will be skipped. +File will pass check if its pylint rating is greater or equal to $PYLINT_RATING_GATE. +Otherwise gained pylint rating will be displayed. + + + -h, --help Script usage + -m, --modified Script will check python files, which have + been modified within current repository. +Examples: + ./check + + Check all python files in current VSPERF repository except EXCLUDE_MODULES + + ./check vsperf + + Check just one file. + + ./check -m + + Check all modified files in current VSPERF repository + + ./check vnfs/qemu core tools/pkt_gen + + Check all python files in given directories + +EOM +} + +# compare pylint result with predefined gate +function rating_is_ok() { + # bc is not part of basic Centos installation + # so let us do integer comparison only + int_rating=`echo $1 | sed -e 's/\..*$//'` + [ $int_rating -ge $PYLINT_RATING_GATE ] +} + +##### MAIN ##### +# check if help is requested +if [ "x$1" == "x-h" -o "x$1" == "x--help" ] ; then + usage + exit 0 +fi + +# check if pylint is available +if ! which $PYLINT &>/dev/null ; then + echo "$PYLINT is not available, thus check can't be executed" + exit 1 +fi + +# check if we were run within vsperf directory +if [ ! -x ./vsperf 2> /dev/null ] ; then + echo "`basename $0` must be run from vsperf root directory" + exit 2 +fi + +# get list of excluded modules +EXCLUDED_MODULES=`grep "^ *EXCLUDE_MODULES" conf/00_common.conf | tr '"' "'"` + +# get list of files to be checked +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 "^${FILE_REGEX}$" > $FILE_LIST +elif [ "x$*" == "x" ] ; then + # list is empty, check all python files + find . -type f $FIND_OPTIONS > $FILE_LIST +else + for item in $* ; do + if [ -d $item ] ; then + find $item -type f $FIND_OPTIONS >> $FILE_LIST + elif [ -f $item ] ; then + echo $item >> $FILE_LIST + else + echo "$item doesn't exist, thus check was aborted" + exit 3 + fi + done +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`"'" + # and check if it should be excluded or not + if ( echo $EXCLUDED_MODULES | grep -w $pyfile_basename > /dev/null ) ; then + printf "%-70s \e[32m%-6s\e[0m\n" $pyfile "EXCLUDED" + continue + fi + # run pylint and extract final rating + rating=`$PYLINT --rcfile $PYLINT_RC $pyfile 2>/dev/null | tail -n3 | grep rated | sed -e 's/^.*rated at \([0-9.]*\).*$/\1/'` + # evaluate and display aquired rating + if rating_is_ok $rating ; then + printf "%-70s \e[32m%-6s\e[0m\n" $pyfile "OK" + else + printf "%-70s \e[31m%-6s\e[0m\n" $pyfile $rating + fi + done +else + echo "Nothing to check." + exit 4 +fi + +# clean up +rm $FILE_LIST &> /dev/null + +exit 0 +##### MAIN end ##### |