分类: Python/Ruby
2011-09-14 13:46:54
转载于:http://bigwhite.blogbus.com/logs/92616077.html
很多公司的过程中都有阶段性统计新增或修改的有效代码行数这一环节,这里先不论统计出的结果用于做什么,就统计本身而言,常常存在诸多问题,比如统计过程耗时且繁琐、统计结果中估算成分较大,不精确等。这些问题以前也一直困扰着我们,并且长时间没有想出很好的解决办法。
今天脑子里突然冒出一个想法:能否根据svn diff得到的结果分析出来有效代码量呢? svn diff的结果一般是这样的,分为几类:
纯新增代码,如:
+void foo() {
+ ... ...
+}
纯删除代码,如:
-void foo() {
- ... ...
-}
修改的代码,如:
-void foo(void);
+void foo(int);
我们所要统计的所谓有效代码更多是指纯新增的代码和修改的代码,纯删除的代码可忽略不计。这样一来实际有效代码行数 = 纯新增代码行数 + 修改代码行数;而修改的代码在svn diff结果中体现为一减一加,实际修改行数是等于其+的行数的。也就是说有效代码行数就是svn diff结果中所有前缀为+的行的行数。svn diff输出格式相对规整,通过解析得到这个行数并非难事。最简单的方法就是使用Shell脚本 了。
脚本全部内容这里就不列出来了, 可以下载。其核心代码只有以下两行:
svn diff -r$start_revision:$end_revision $target $USERNAME $PASSWD > $TEMPFILE
add_lines_count=`grep "^+" $TEMPFILE|grep -v "^+++"|sed 's/^.//'|sed '/^$/d'|wc -l`
首先我们使用svn diff命令将两个修订号之间的差异重定向到一个临时文件中,然后使用grep、sed和wc的组合完成行数的计算:其中首先过滤出以+开头的行,但去除其中+++开头的行,得到的是所有只以一个+开头的行。再利用set 's/^.//'删除每行行首的那个+,用set '/^$/d'删除所有空行,最后利用wc -l计算总行数。
也就是说通过上面脚本运行后得到的有效代码行数是不包括空行的,但是包含注释代码。
有了这个脚本,以后的版本有效代码量统计就相当精确了,而且也无需每个人都参与统计,大大减少了工作量,甚至可以将这个工作做成自动化完成。