麻雀雖小,五臟俱全:分析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.pswp.cn/news/453458.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453458.shtml
英文地址,請注明出處:http://en.pswp.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…