最近开发团队发布的版本质量很成问题,追究起来有很多原因,其中之一是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=ITIMSROOTcvs 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中出现=或者-,将会导致此后的信息丢失。
这需要微调正则表达式来作出更精确的匹配。对界面进行美化。

解决方案 »

  1.   

    收藏一下没分了吗? 为啥只有20分?我给你转1000可用分去吧,不过csdn会扣100.
      

  2.   

    要有新文章了,一定要顶jinxfei.
      

  3.   

    这几天正在找怎么用cvs了,要仔细看看!!!以后有问题还请多多指教
      

  4.   

    咋不用SVN泥统一版本号,原子提交
      

  5.   

    来学习学习,但我用的是SVN,
      

  6.   

    不属有一个statcvs吗? 很好用啊
      

  7.   

    支持一下
    不过我cvs还不熟
      

  8.   

    虽然咱不怎么明白lz说的cvs是个什么东东
    咱也没有用过
    但是咱知道要支持正版,支持原创,嘿嘿
    咱也学习,不过还真是期待自己也像lz那么强大啊!
      

  9.   

    支持一下 
    不过我cvs还不熟
      

  10.   

    楼主的帖子都很火,我要找找vcs相关的东西!!!