代码上传到gitlab之前通过cppcheck进行样式规范检查

工作中常用到gitlab进行代码的管理。最近有个需求,要在上传之间进行代码的样式检查。

具体的思路流程如下图:

代码上传到gitlab之前通过cppcheck进行样式规范检查_第1张图片

 

这里使用的cppcheck对c++代码的检查。其他的语言也有相对应的检查工具。旨在对开发人员代码的质量进行一个规范化。

下面是自己写的一个简单脚本,使用gitlab的githook里面pre-receive进行拦截检查。脚本还有许多要改进的地方,后面有时间再更改。

#!/bin/bash
zero_commit="0000000000000000000000000000000000000000"
excludeExisting="--not --all"

RETVAL=0
redome=`date '+%d%H%M%S'`
date_time=`date '+%Y-%m-%d %H:%M:%S'`
project=`pwd|awk -F"/" '{print $NF}'`


#新建一个临时的目录存储临时文件
mkdir -p /tmp/gittmp/${redome}
#记录执行时间和项目名称
echo -e " ${date_time}  ${project} \n please solve it in time,resubmit after checking the changes. \n" >> /tmp/gittmp/${redome}/error.log

#遍历提交的文件
while read oldrev newrev refname; do
    # branch or tag get deleted
    if [ "newrev" = "$zero_commit" -o "oldrev" = "$zero_commit"  ]; then
    	#跳出当前循环
        continue
    fi
	#查询git提交的文件名和忽略的第三方文件夹
    newfiles=`git diff --name-only --diff-filter=AMT ${oldrev} ${newrev}|grep -v -w "otherdir"`|grep -v -w "abcother"

    #循环遍历提交的文件
    for FILE in $newfiles     
    do         
        case $FILE in
        	#禁止提交的文件后缀名称
            *.ipk|*.ipa|*.apk|*.exe|*.db|*.zip|*.rar|*.gz|*.tgz|*.7z|*.log|*.ai|*.psd|*.svn|*.bak|*Thumbs.db|.idea )
                echo "+=============================禁止提交===============================+"
                echo "| FILE:    $FILE"                 
				echo "| REFNAME: $refname"
                echo "| OLDREV:  $oldrev"                 
				echo "| NEWREV:  $newrev"
				echo "|If you have any questions,please contact luohui "
                echo "+====================================================================+"
                RETVAL=1
            ;;

            #需要检查的文件后缀文件
            *.cc|*.cpp|*.c|*.cxx |*.h |*.hpp)
	              #搜索FILE文件是否在里面 
                  object=`git ls-tree --full-name -r $newrev | egrep "(\s)${FILE}\$" | awk '{ print $3 }'`
                  if [ -z {$object} ]; 
                       then continue; 
                  fi 

		
		    #查到对应的文件,则下载到临时目录下。
		    #判断是否有目录结构的文件
	   	  if [ `echo "$FILE"|grep "/"` ];then
				dir_file=`dirname $FILE`
				file_name=`basename $FILE`
				mkdir -p /tmp/gittmp/${redome}/${dir_file}
				
                    git cat-file blob $object > /tmp/gittmp/${redome}/${dir_file}/${file_name}
		    		/home/data/package/cppcheck/cppcheck --language=c++  --error-exitcode=1 /tmp/gittmp/${redome}/${dir_file}/${file_name} 2>>/tmp/gittmp/${redome}/error.log
				#判断cppcheck检查是否规范。
				if [ $? -eq 0 ];then
					#执行成功,跳出当前循环,执行下一个循环。
					continue;
				fi					
				RETVAL=1
			else
		    		#mkdir -p /tmp/gittmp/${redome}
                    git cat-file blob $object > /tmp/gittmp/${redome}/$FILE
		    		/home/data/package/cppcheck/cppcheck --language=c++  --error-exitcode=1 /tmp/gittmp/${redome}/$FILE 2>>/tmp/gittmp/${redome}/error.log
		    		if [ $? -eq 0 ]; then 
			    		continue; 
                    fi 
                    RETVAL=1 
    		fi		    
                             
            ;;         
        esac     
    done 
done 
	
	if (( $RETVAL == 1  ));then
		#打印不规范的文件
		echo "+=================================错误日志===================================="
		echo "`date '+%Y-%m-%d %H-%M-%S'`"
		cat /tmp/gittmp/${redome}/error.log
		echo "+============================================================================="
		last_comm=`git rev-list --max-count=1 --tags HEAD`
		user_mail=`git show -s $last_comm|grep "Author:"|awk -F "<|>" '{print $2}'`
		#发送邮件
		mail -s "[error]git cppcheck,the project name is : $project" $user_mail < /tmp/gittmp/${redome}/error.log
	else
		echo "+=============================Submit Successfully============================="
	fi

exit $RETVAL

 

 

你可能感兴趣的:(shell脚本)