最近開發團隊發布的版本質量很成問題,追究起來有很多原因,其中之一是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中出現=或者-,將會導致此后的信息丟失。
這需要微調正則表達式來作出更精確的匹配。
對界面進行美化。
于是想做個一小工具,分析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中出現=或者-,將會導致此后的信息丟失。
這需要微調正則表達式來作出更精確的匹配。
對界面進行美化。