日期:2014-05-18  浏览次数:20700 次

麻雀虽小,五脏俱全:分析CVS活动情况的小工具(有源码供学习)
最近开发团队发布的版本质量很成问题,追究起来有很多原因,其中之一是CVS的使用不合理,
于是想做个一小工具,分析CVS上每天的活动,以便掌握团队成员对CVS的使用情况。
也许有现成的开源项目可以完成这项任务,但懒得去找了,自己写一个吧。

声明:由于只是一个内部使用的工具,没有掺杂太多的设计理念在其中,
不过我写的代码,总体来讲质量还是过得去的,新手参考一下也无不可。


1、确定需求
希望掌握每天CVS上,谁、在什么时间、对什么文件、做了什么。


2、可行性研究
需要研究CVS的什么指令可以获取CVS的活动情况
在阅读CVS的手册后,基本确定:
history和log两个指令可以满足要求。
具体指令说明请参见:
history:http://ximbiot.com/cvs/manual/cvs-1.11.23/cvs_16.html#SEC144
log: http://ximbiot.com/cvs/manual/cvs-1.11.23/cvs_16.html#SEC150


3、技术预演
参照手册上的说明,试验history和log两个指令的输出,以及参数对输出的影响,
最终确定使用如下两条指令格式:
cvs log -d '>YYYY-MM-DD' -N -S 模块名
  -d 表示限制时间,>YYYY-MM-DD 表示大于该指定时间,该参数在实际运行时被替换为当天日期
  -N 表示不输出文件的tag(因为我们的代码会经常用tag做标记,所以输出tag会很乱)
  -S 指定模块名,实际上就是CVS Repository下的一个目录名

cvs history -xAMRT -D'YYYY-MM-DD' -a -p 模块名
  -x 限定输出包含的活动类型,AMRT代表增加、修改、删除和远程标记文件(rtag)。
  -D 限定只输出YYYY-MM-DD之后的活动
  -a 输出所有用户的活动
  -p 指定模块名,等同与log的 -S(注意,-x的T参数不受此参数影响)

   
4、分析指令结果,提取有效信息
history指令输出结果:
增删改:
A 2009-06-05 00:46 +0000 wub 1.1 IActiveAlmService.java ITIMSROOT/svr/src/itims/svr/asa/alm == <remote>
修改类型 修改发生的时间 谁 版本 涉及的文件 文件所在路径 其它信息

TAG:
T 2009-06-11 01:39 +0000 jinxfei research [new-tag-on-new-tag:HEAD]
rtag 标记发生的时间 谁 标记的文件或者目录 标记名:分支

log指令的输出结果:
RCS file: /cvsroot/itimsDev/ITIMSROOT/svr/src/itims/svr/asa/AbsAsaService.java,v
Working file: ITIMSROOT/svr/src/itims/svr/asa/AbsAsaService.java
head: 1.10
branch:
locks: strict
access list:
keyword substitution: kv
total revisions: 10; selected revisions: 2
description:
----------------------------
revision 1.10
date: 2009/06/11 01:40:40; author: yyj; state: Exp; lines: +0 -2
测试提交1
----------------------------
revision 1.9
date: 2009/06/11 01:40:19; author: yyj; state: Exp; lines: +2 -2
测试提交
=============================================================================


其中,有价值的信息包括:
文件名,每次revision的时间、用户、文件状态、提交时的说明


5、确定方案
由于CVS指令输出的结果比较技术,我们需要将其进行规整,最好能够以HTML方式进行展示。
log和history的输出内容看问题角度不同,
log的输出结果可以整理成以文件为主的一张表格,反映每天有多少文件被谁修改过。
history的输出结果可以整理成以用户为主的一张表格,反映每天谁修改了多少文件。

首先,需要定时执行cvs的两条指令,结果导出到文本文件中,作为后续分析的基础,
这可以通过Crontab来进行调度(Window上可以用计划任务)。
然后,需要针对两种指令结果,实现信息抽取和格式化的业务逻辑,生成用于展示的JavaBean。
最后,编写界面,做信息展示。包含一个导航界面和两个分析结果展示界面。


6、实现:shell脚本抽取信息
shell文件内容如下:
#####################
#先确保cron执行环境和当前用户一致,/home/itims请换成自己用户的home目录,.bash_profile在各个平台上可能也有差异
. /home/itims/.bash_profile
#计算当前的年月日
todayStr=`date +%Y-%m-%d`
#日志输出的目录
cvsLogPath=/home/itims/trail/cvs_236_expr/cvslog
#CVS模块名
cvsModule=ITIMSROOT

cvs log -d '>'$todayStr -N -S $cvsModule >$cvsLogPath/cvs_log_$todayStr.log 2>&1
cvs history -xAMRT -D$todayStr -a -p $cvsModule >$cvsLogPath/cvs_history_$todayStr.log 2>&1
#####################


安排在每日23:30执行
在unix命令行输入:
crontab -e
然后增加如下行:
30 23 * * * /home/itims/trail/cvs_236_expr/dailyLog.sh
以上脚本路径请自己替换。


7、实现:java编写业务逻辑
  7.1 编写分析History指令日志片段(每一行)的类
  7.2 编写JUNIT单元测试(输入字符串,输出JavaBean)
  7.3 编写分析Log指令日志片段(见前面的样本)的类,使用正则表达式定位相关信息
  7.4 编写JUNIT单元测试
  7.5 编写业务逻辑主类,接收文件名参数,读取文件,并从发送给分析类进行解析

8、实现:jsp编写展示界面
由于页面比较简单,且为内部使用,不用Action,直接在JSP中调