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

jinxfei 2009-06-11 07:42:15
加精
最近开发团队发布的版本质量很成问题,追究起来有很多原因,其中之一是CVS的使用不合理,
于是想做个一小工具,分析CVS上每天的活动,以便掌握团队成员对CVS的使用情况。
也许有现成的开源项目可以完成这项任务,但懒得去找了,自己写一个吧。

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


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


2、可行性研究
需要研究CVS的什么指令可以获取CVS的活动情况
在阅读CVS的手册后,基本确定:
historylog两个指令可以满足要求。
具体指令说明请参见:
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中出现=或者-,将会导致此后的信息丢失。
这需要微调正则表达式来作出更精确的匹配。

对界面进行美化。


...全文
237 90 打赏 收藏 转发到动态 举报
写回复
用AI写文章
90 条回复
切换为时间正序
请发表友善的回复…
发表回复
holmens 2011-03-24
  • 打赏
  • 举报
回复
源码在哪边??、
sebatinsky 2009-06-18
  • 打赏
  • 举报
回复
不知道想说什么,十年之后,我有这样的成就否?
tianxin163 2009-06-17
  • 打赏
  • 举报
回复
支持顶一个!
logofive 2009-06-16
  • 打赏
  • 举报
回复
强大,学习~~~
ranmer 2009-06-16
  • 打赏
  • 举报
回复
很详细, 支持
Zero2One 2009-06-15
  • 打赏
  • 举报
回复
不错的案例,收藏
tohmin 2009-06-15
  • 打赏
  • 举报
回复
很详细, 支持
condor_MK7 2009-06-15
  • 打赏
  • 举报
回复
学习下
btlfe 2009-06-15
  • 打赏
  • 举报
回复
mark
zhuoyue 2009-06-15
  • 打赏
  • 举报
回复
不懂,学习一下
越过越咸 2009-06-14
  • 打赏
  • 举报
回复
fhdfhdfh
vipyjb 2009-06-14
  • 打赏
  • 举报
回复
楼主真的好强哦
小弟 2009-06-14
  • 打赏
  • 举报
回复
谢谢楼主,分享了
metaboy 2009-06-14
  • 打赏
  • 举报
回复
顶起!
womaizi 2009-06-14
  • 打赏
  • 举报
回复
不懂
liqiang_cna 2009-06-14
  • 打赏
  • 举报
回复
学习了
zf111122 2009-06-14
  • 打赏
  • 举报
回复
好东西
收藏下
WYhack 2009-06-14
  • 打赏
  • 举报
回复
楼主的帖子都很火,我要找找vcs相关的东西!!!
mycatbj 2009-06-14
  • 打赏
  • 举报
回复
好 h我也顶一下
zeweizhang 2009-06-14
  • 打赏
  • 举报
回复
顶起!
加载更多回复(69)

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧