读书人

利用shell脚本更正代码风格 - Eating

发布时间: 2012-12-24 10:43:14 作者: rapoo

利用shell脚本修正代码风格 - Eating my own dog food

?

这个“dog food”的来由是这样的,参与的封闭开发项目进度很赶,源代码需要交付,“code style”限定严格,并且还有大量现有代码格式有待校正。边看边改容易漏掉,所以leader写了一个grep版的提示格式错误的脚本,提示所有风格不符的行号,然后对照逐一修改,一方面提示很多,.svn文件夹也有大量提示,另一方面对于“不允许出现连续的空行”检查不出来;于是乎,就尝试造个狗粮吧^_^

以下参考了很多人在网上的博文、帖子,实在是抱歉因为自己只顾索取的陋习,没有将出处记录下来,如有冒犯请告之

先贴下比较有用的几行,在其他的shell脚本中应该也能用到,其它见脚本全文吧

?

(0)获得文件路径及文件名    d=`dirname $file`;    f=`basename $file`(1)判断文件后缀    if [ "${file##*.}" = "c" -o "${file##*.}" = "h" -o "${file##*.}" = "wmls" ](2)去掉连续空行    sed -n '/[^[:blank:]]/,/^[[:blank:]]*$/p' $file > $tmp_dir/$f(3)获得文件md5值    m1=`md5sum $file | awk '{print $1}'`

用法:

? Linux下,放置到任意目录

命令行运行??sh? QARobot.sh??期望检查的目标路径,?不会直接操作目标路径

??如sh QARobot.sh /home/paxdata/broadpos/scriptlib/

会开始检查所有?.c? .h? .wmls?文件,有不符合的,? [脚本编译后的.c注意不要包含在父路径里面,]

如果有不符合的文件,?会在当前脚步所在文件夹内创建一个?日期_时间?的文件夹,里面是保存过的文件

里面有所有的修改过的文件,同时还有安装文件夹结构的一份备份,可以使用?beyondcompare之类的工具和svn代码对比

目前替换的有:

多个连续空行

\t -> 4空格

" ;" -> “;”???????????去前置空格

"( " -> “(”, ??????????去后置空格

" )" -> “)”, ??????????去前置空格

"while(" -> “while (”??中间加空格

"for(" -> “for (”, ??????中间加空格

"switch(" -> “switch (”??中间加空格

脚本全文

?

#!/bin/shlist_alldir(){    for file in $1/*    do        #echo "cur:$file"        if [ -d $file ]        then            echo "dir:$file"            list_alldir $file        elif [ -f $file ]        then            #echo "file:$file"            if [ "${file##*.}" = "c" -o "${file##*.}" = "h" -o "${file##*.}" = "wmls" ]            then                f=`basename $file`                #echo "code:$file;    f:$f"                               # step 1. cut off surplus blank lines                sed -n '/[^[:blank:]]/,/^[[:blank:]]*$/p' $file > $tmp_dir/$f                                # step 2. replace \t to 4 whitespace                sed -i 's/\t/    /g' $tmp_dir/$f                               # step 3. try to handle " ;", "( ", " )", "while(", "for(", "switch(",                 sed -i 's/ ;/;/g' $tmp_dir/$f                sed -i 's/( /(/g' $tmp_dir/$f                sed -i 's/ )/)/g' $tmp_dir/$f                sed -i 's/while(/while (/g' $tmp_dir/$f                sed -i 's/for(/for (/g' $tmp_dir/$f                sed -i 's/switch(/switch (/g' $tmp_dir/$f                                # TODO OR MAYBE IMPOSSIBLE: "[#]if(", "A+B" and -,/,\,%,=,==,+=,-=,/=,\=,%=,<<,>>,&, etc, is too hard, give up!!!                m1=`md5sum $file | awk '{print $1}'`                m2=`md5sum $tmp_dir/$f | awk '{print $1}'`                #echo "m1:$m1"                #echo "m2:$m2"                if [ "$m1" != "$m2" ]                then                    echo "!!!!++++get a file : $f ++++!!!!"                    d=`dirname $file`                    mkdir -p $tmp_dir/$d                    cp -R $tmp_dir/$f $tmp_dir/$d/                else                    rm -f $tmp_dir/$f                fi            fi        fi    done}cur=`pwd`stamp=`date +%Y%m%d_%H%M%S`tmp_dir=$cur/$stampecho "tmp_dir:$tmp_dir"mkdir $tmp_dirif [ $# -gt 0 ]then    list_alldir "$1"else    list_alldir "."fi
?

?

读书人网 >编程

热点推荐