您的位置:首页 > 其它

麻雀虽小,五脏俱全:分析CVS活动情况的小工具(有源码供学习)

2012-02-10 21:14 369 查看
最近开发团队发布的版本质量很成问题,追究起来有很多原因,其中之一是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中调用业务逻辑主类,

分析文件后,循环展示。

  7、8两部分的实现源代码,包含在我的资源中可以下载

9、后续工作

可以作出一些统计信息,包括每天最活跃用户、最活跃文件的排名。

还可以记录用户、文件的活跃历史,形成曲线。

另外,在使用正则表达式匹配log内容的时候,如果用户提交的message中出现=或者-,将会导致此后的信息丢失。

这需要微调正则表达式来作出更精确的匹配。

对界面进行美化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息