这个“dog food”的来由是这样的,参与的封闭开发项目进度很赶,源代码需要交付,“code style”限定严格,并且还有大量现有代码格式有待校正。边看边改容易漏掉,所以leader写了一个grep版的提示格式错误的脚本,提示所有风格不符的行号,然后对照逐一修改,一方面提示很多,.svn文件夹也有大量提示,另一方面对于“不允许出现连续的空行”检查不出来;于是乎,就尝试造个狗粮吧^_^
以下参考了很多人在网上的博文、帖子,实在是抱歉因为自己自顾索取的陋习,没有将出处记录下来,如有冒犯请告之
先贴下比较有用的几行,在其他的shell脚本中应该也能用到,其它见脚本全文吧
( 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 (” 中间加空格
脚本全文
2
3 list_alldir(){
4 for file in $1 /*
5 do
6 # echo "cur:$file"
7 if [ - d $file ]
8 then
9 echo " dir:$file "
10 list_alldir $file
11 elif [ -f $file ]
12 then
13 # echo "file:$file"
14 if [ " ${file##*.} " = " c " - o " ${file##*.} " = " h " - o " ${file##*.} " = " wmls " ]
15 then
16 f = `basename $file `
17 # echo "code:$file; f:$f"
18 # step 1. cut off surplus blank lines
19 sed - n ' / [^[:blank:]] / , / ^[[:blank:]] *$/ p' $file > $tmp_dir / $f
20 # step 2. replace \t to 4 whitespace
21 sed - i 's / \t / / g' $tmp_dir / $f
22 # step 3. try to handle " ;", "( ", " )", "while(", "for(", "switch(",
23 sed - i 's / ; / ; / g' $tmp_dir / $f
24 sed - i 's / ( / ( / g' $tmp_dir / $f
25 sed - i 's / ) / ) / g' $tmp_dir / $f
26 sed - i 's / while ( / while ( / g' $tmp_dir / $f
27 sed - i 's / for ( / for ( / g' $tmp_dir / $f
28 sed - i 's / switch ( / switch ( / g' $tmp_dir / $f
29
30 # TODO OR MAYBE IMPOSSIBLE: "[#]if(", "A+B" and -,/,\,%,=,==,+=,-=,/=,\=,%=,<<,>>,&, etc, is too hard, give up!!!
31 m1 = `md5sum $file | awk '{print $1 }'`
32 m2 = `md5sum $tmp_dir / $f | awk '{print $1 }'`
33 # echo "m1:$m1"
34 # echo "m2:$m2"
35 if [ " $m1 " != " $m2 " ]
36 then
37 echo " !!!!++++get a file : $f ++++!!!! "
38 d = `dirname $file `
39 mkdir - p $tmp_dir / $d
40 cp - R $tmp_dir / $f $tmp_dir / $d /
41 else
42 rm -f $tmp_dir / $f
43 fi
44 fi
45 fi
46 done
47 }
48
49 cur = `pwd`
50 stamp = `date +% Y % m % d_ % H % M % S`
51 tmp_dir = $cur / $stamp
52 echo " tmp_dir:$tmp_dir "
53 mkdir $tmp_dir
54
55 if [ $ # -gt 0 ]
56 then
57 list_alldir " $1 "
58 else
59 list_alldir " . "
60 fi