麻雀虽小,五脏俱全:分析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中调用业务逻辑主类,
分析文件后,循环展示。

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

9、后续工作

可以作出一些统计信息,包括每天最活跃用户、最活跃文件的排名。
还可以记录用户、文件的活跃历史,形成曲线。

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

对界面进行美化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/453458.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php如果实现日历的制作,教大家制作简单的php日历

最近的一个项目中&#xff0c;需要将数据用日历方式显示&#xff0c;网上有很多的JS插件&#xff0c;后面为了自己能有更大的控制权&#xff0c;决定自己制作一个日历显示。如下图所示&#xff1a;一、计算数据1、new一个Calendar类2、初始化两个下拉框中的数据&#xff0c;年份…

Spark之 使用SparkSql操作mysql和DataFrame的Scala实现

通过读取文件转换成DataFrame数据写入到mysql中 package com.zy.sparksqlimport java.util.Propertiesimport org.apache.spark.SparkContext import org.apache.spark.rdd.RDD import org.apache.spark.sql.{DataFrame, Row, SparkSession} import org.apache.spark.sql.types…

web服务器之iis,apache,tomcat三者之间的比较

IIS-Apache-Tomcat的区别 IIS与Tomcat的区别 IIS是微软公司的Web服务器。主要支持ASP语言环境. Tomcat是Java Servlet 2.2和JavaServer Pages 1.1技术的标准实现&#xff0c;是基于Apache许可证下开发的SJP语言环境容器,严格得说不能算是一个WEB服务器,而是Apache服务适配器。 …

iOS CAGradientLayer颜色渐变

Gradient&#xff1a;本身就是梯度的意思&#xff0c;所以在这里就是作为渐变色来理解 CAGradientLayer用于处理渐变色的层结构CAGradientLayer的渐变色可以做隐式动画大部分情况下&#xff0c;CAGradientLayer时和CAShapeLayer配合使用,CAShapeLayer这里就不介绍了CAGradientL…

编程要养成的好习惯

1.- DRY: Don’t repeat yourself. DRY 是一个最简单的法则&#xff0c;也是最容易被理解的。但它也可能是最难被应用的&#xff08;因为要做到这样&#xff0c;我们需要在泛型设计上做相当的努力&#xff0c;这并不是一件容易的事&#xff09;。它意味着&#xff0c;当我们在…

flink整合java,Flink使用SideOutPut替换Split实现分流

基于apache flink的流处理实时模型44元包邮(需用券)去购买 >以前的数据分析项目(版本1.4.2)&#xff0c;对从Kafka读取的原始数据流&#xff0c;调用split接口实现分流.新项目决定使用Flink 1.7.2&#xff0c;使用split接口进行分流的时候&#xff0c;发现接口被标记为depra…

虚机中访问外网;NAT中的POSTROUTING是怎么搞的?

看下docker中是怎么配置的网络 在虚机中访问外网&#xff1a;设定了qemu&#xff0c;在主机上添加路由&#xff1a;sudo iptables -t nat -I POSTROUTING -s 192.168.1.110 -j SNAT --to-source 192.168.0.108 设置了这句话就可以访问外网了。 设置了两个虚拟机&#xff1a; ta…

Fragment结合ViewPager之懒加载

什么是懒加载&#xff1f;为什么要用懒加载&#xff1f;### 1、什么是懒加载 懒加载就是当ViewPager和Fragment结合在一起使用时&#xff0c;Fragment呈现在用户面前时才加载数据&#xff0c;当其从未被呈现在用户面前时&#xff0c;不会执行加载数据的代码。这就是我所理解的懒…

WCF和webservice的区别

微软论坛的斑竹回答如下&#xff1a; 脑内&#xff1a;果然是高大上啊 1.WebService&#xff1a;严格来说是行业标准&#xff0c;不是技术&#xff0c;使用XML扩展标记语言来表示数据&#xff08;这个是夸语言和平台的关键&#xff09;。微 软的Web服务实现称为ASP.NET Web Ser…

职场不得不明白的十大定律

帕金森定律 美国著名历史学家诺斯古德•帕金森通过长期调查研究&#xff0c;写了一本名叫《帕金森定律》的书&#xff0c;他在书中阐述了机构人员膨胀的原因及后果&#xff1a;一个不称职的官员&#xff0c;可能有三条出路。第一是申请退职&#xff0c;把位子让给能干的人&am…

php控制器教程,laravel基础教程 -- 控制器

HTTP 控制器简介控制器允许你将相应的路由业务逻辑封装在控制器类中进行有效的管理&#xff0c;这样你不必将所有的路由逻辑集中到routes.php文件中&#xff0c;导致代码的臃肿与难以维护。所有的控制器类都被存储在app/Http/Controllers目录中.基本控制器一个基本的控制器应该…

org.apache.jasper.JasperException: Unable to compile class for JSP:

报错信息&#xff1a; org.apache.jasper.JasperException: Unable to compile class for JSP: An error occurred at line: 1 in the generated java file The type java.io.ObjectInputStream cannot be resolved. It is indirectly referenced from required .class filesSt…

i++和++i

关于自增自减运算&#xff0c;很多书籍没有把问题讲清楚,在C语言里是这样的&#xff1a; 1.后置运算&#xff1a;k表示先运算&#xff0c;后自加。 意思是遇到k了&#xff0c;我先把当前的k的值拿来参加运算&#xff0c;后面再去管它的自加。 那么&#xff0c;“后面”后到什么…

什么样的项目经历会让面试官眼前一亮

很多同学都问过我类似的问题&#xff1a; 咱们《C语言也能干大事》中讲的自己动手写windows优化大师、自己动手写计算器等东西只是写着玩的小玩具而已&#xff0c;这些能用来以后找工作时写到简历中的作品吗&#xff1f;看别人的简历写的“图书管理系统”、“教务选课系统”多有…

matlab采样频谱,Matlab对采样数据进行频谱分析

使用Matlab对采样数据进行频谱分析1、采样数据导入Matlab采样数据的导入至少有三种方法。第一就是手动将数据整理成Matlab支持的格式&#xff0c;这种方法仅适用于数据量比较小的采样。第二种方法是使用Matlab的可视化交互操作&#xff0c;具体操作步骤为&#xff1a;File --&g…

链表和顺序表的一些区别

顺序表与链表是非常基本的数据结构&#xff0c;它们可以被统称为线性表。 线性表&#xff08;Linear List&#xff09;是由 n&#xff08;n≥0&#xff09;个数据元素&#xff08;结点&#xff09;a[0]&#xff0c;a[1]&#xff0c;a[2]…&#xff0c;a[n-1] 组成的有限序列。…

ANCS推送简介

总体原理 ANCS通过蓝牙BLE 4.0实现&#xff0c;仅支持iPhone 4S及以上且系统版本在IOS 7以上的手机&#xff0c;同时在外设端需要支持蓝牙4.0协议。 1、外设端进行广播&#xff0c;手机打开蓝牙&#xff0c;搜索外设&#xff0c;连接外设&#xff0c;之后进行绑定&#xff08;这…

好记性不如烂笔头,记录几个常用的Linux操作

作者&#xff1a;老王Shell公共函数库Linux系统里有一些公共的Shell函数库可供使用&#xff0c;最重要的是/etc/rc.d/init.d/functions&#xff0c;在/etc/init.d目录下有很多脚本都用到了这个函数库&#xff0c;里面提供了很多有用的方法&#xff0c;比如&#xff1a;killproc…

用matlab简单电路模型,基于MATLAB的电路模型仿真应用

基于MATLAB的电路模型仿真应用实验指导书一、实验目的1、掌握采用M文件及SIMULINK对电路进行仿真的方法。2、熟悉POWERSYSTEM BLOCKSET 模块集的调用、设置方法。3&#xff0e;进一步熟悉M脚本文件编写的方法和技巧。二、实验原理1、通过M文件实现电路仿真的一般仿真步骤为&…

春节期间小游戏同时在线人数最高达2800万人/小时

微信官方发布2018年春节期间微信数据报告&#xff1a;除夕至初五&#xff0c;总共有2,297亿条微信消息&#xff0c;28亿条微信朋友圈成功发出&#xff0c;音视频通话总时长175亿乙分钟。其中&#xff0c;90后用广的消息发送量占总量的42.5%&#xff0c;80后用户25.9%&#xff0…