您的位置:首页 > 其它

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

2009-06-12 22:38 483 查看
最近开发团队发布的版本质量很成问题,追究起来有很多原因,其中之一是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中出现=或者-,将会导致此后的信息丢失。

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



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