麻雀虽小,五脏俱全:分析CVS活动情况的小工具(有源码供学习)
生活随笔
收集整理的這篇文章主要介紹了
麻雀虽小,五脏俱全:分析CVS活动情况的小工具(有源码供学习)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最近開發(fā)團(tuán)隊(duì)發(fā)布的版本質(zhì)量很成問題,追究起來有很多原因,其中之一是CVS的使用不合理,
于是想做個(gè)一小工具,分析CVS上每天的活動(dòng),以便掌握團(tuán)隊(duì)成員對CVS的使用情況。
也許有現(xiàn)成的開源項(xiàng)目可以完成這項(xiàng)任務(wù),但懶得去找了,自己寫一個(gè)吧。
聲明:由于只是一個(gè)內(nèi)部使用的工具,沒有摻雜太多的設(shè)計(jì)理念在其中,
不過我寫的代碼,總體來講質(zhì)量還是過得去的,新手參考一下也無不可。
1、確定需求
希望掌握每天CVS上,誰、在什么時(shí)間、對什么文件、做了什么。
2、可行性研究
需要研究CVS的什么指令可以獲取CVS的活動(dòng)情況
在閱讀CVS的手冊后,基本確定:
history 和 log 兩個(gè)指令可以滿足要求。
具體指令說明請參見:
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、技術(shù)預(yù)演
參照手冊上的說明,試驗(yàn)history和log兩個(gè)指令的輸出,以及參數(shù)對輸出的影響,
最終確定使用如下兩條指令格式:
cvs log -d '>YYYY-MM-DD' -N -S 模塊名
? ? -d? 表示限制時(shí)間,>YYYY-MM-DD? 表示大于該指定時(shí)間,該參數(shù)在實(shí)際運(yùn)行時(shí)被替換為當(dāng)天日期
? ? -N? 表示不輸出文件的tag(因?yàn)槲覀兊拇a會經(jīng)常用tag做標(biāo)記,所以輸出tag會很亂)
? ? -S? 指定模塊名,實(shí)際上就是CVS Repository下的一個(gè)目錄名
cvs history -xAMRT -D'YYYY-MM-DD' -a -p 模塊名
? ? -x? 限定輸出包含的活動(dòng)類型,AMRT代表增加、修改、刪除和遠(yuǎn)程標(biāo)記文件(rtag)。
? ? -D? 限定只輸出YYYY-MM-DD之后的活動(dòng)
? ? -a? 輸出所有用戶的活動(dòng)
? ? -p? 指定模塊名,等同與log的 -S(注意,-x的T參數(shù)不受此參數(shù)影響)
? ?
4、分析指令結(jié)果,提取有效信息
history指令輸出結(jié)果:
增刪改:
A 2009-06-05 00:46 +0000 wub? 1.1? IActiveAlmService.java? ITIMSROOT/svr/src/itims/svr/asa/alm? ? == <remote>
修改類型 修改發(fā)生的時(shí)間? 誰? 版本 涉及的文件? ? ? ? ? ? ? 文件所在路徑? ? ? ? ? ? ? ? ? ? ? ? ? ? 其它信息
TAG:
T? ? ? ? 2009-06-11 01:39 +0000 jinxfei research? ? ? ? ? ? ? ? ? ? ? [new-tag-on-new-tag:HEAD]
rtag? ? 標(biāo)記發(fā)生的時(shí)間? ? ? ? ? 誰? ? 標(biāo)記的文件或者目錄? ? ? ? ? ? ? 標(biāo)記名:分支
log指令的輸出結(jié)果:
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
測試提交
=============================================================================
其中,有價(jià)值的信息包括:
文件名,每次revision的時(shí)間、用戶、文件狀態(tài)、提交時(shí)的說明
5、確定方案
由于CVS指令輸出的結(jié)果比較技術(shù),我們需要將其進(jìn)行規(guī)整,最好能夠以HTML方式進(jìn)行展示。
log和history的輸出內(nèi)容看問題角度不同,
log的輸出結(jié)果可以整理成以文件為主的一張表格,反映每天有多少文件被誰修改過。
history的輸出結(jié)果可以整理成以用戶為主的一張表格,反映每天誰修改了多少文件。
首先,需要定時(shí)執(zhí)行cvs的兩條指令,結(jié)果導(dǎo)出到文本文件中,作為后續(xù)分析的基礎(chǔ),
這可以通過Crontab來進(jìn)行調(diào)度(Window上可以用計(jì)劃任務(wù))。
然后,需要針對兩種指令結(jié)果,實(shí)現(xiàn)信息抽取和格式化的業(yè)務(wù)邏輯,生成用于展示的JavaBean。
最后,編寫界面,做信息展示。包含一個(gè)導(dǎo)航界面和兩個(gè)分析結(jié)果展示界面。
6、實(shí)現(xiàn):shell腳本抽取信息
shell文件內(nèi)容如下:
#####################
#先確保cron執(zhí)行環(huán)境和當(dāng)前用戶一致,/home/itims請換成自己用戶的home目錄,.bash_profile在各個(gè)平臺上可能也有差異
. /home/itims/.bash_profile
#計(jì)算當(dāng)前的年月日
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執(zhí)行
在unix命令行輸入:
crontab -e
然后增加如下行:
30 23 * * * /home/itims/trail/cvs_236_expr/dailyLog.sh
以上腳本路徑請自己替換。
7、實(shí)現(xiàn):java編寫業(yè)務(wù)邏輯
? ? 7.1 編寫分析History指令日志片段(每一行)的類
? ? 7.2 編寫JUNIT單元測試(輸入字符串,輸出JavaBean)
? ? 7.3 編寫分析Log指令日志片段(見前面的樣本)的類,使用正則表達(dá)式定位相關(guān)信息
? ? 7.4 編寫JUNIT單元測試
? ? 7.5 編寫業(yè)務(wù)邏輯主類,接收文件名參數(shù),讀取文件,并從發(fā)送給分析類進(jìn)行解析
8、實(shí)現(xiàn):jsp編寫展示界面
由于頁面比較簡單,且為內(nèi)部使用,不用Action,直接在JSP中調(diào)用業(yè)務(wù)邏輯主類,
分析文件后,循環(huán)展示。
? 7、8兩部分的實(shí)現(xiàn)源代碼,包含在我的資源中可以下載。
9、后續(xù)工作
可以作出一些統(tǒng)計(jì)信息,包括每天最活躍用戶、最活躍文件的排名。
還可以記錄用戶、文件的活躍歷史,形成曲線。
另外,在使用正則表達(dá)式匹配log內(nèi)容的時(shí)候,如果用戶提交的message中出現(xiàn)=或者-,將會導(dǎo)致此后的信息丟失。
這需要微調(diào)正則表達(dá)式來作出更精確的匹配。
對界面進(jìn)行美化。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
于是想做個(gè)一小工具,分析CVS上每天的活動(dòng),以便掌握團(tuán)隊(duì)成員對CVS的使用情況。
也許有現(xiàn)成的開源項(xiàng)目可以完成這項(xiàng)任務(wù),但懶得去找了,自己寫一個(gè)吧。
聲明:由于只是一個(gè)內(nèi)部使用的工具,沒有摻雜太多的設(shè)計(jì)理念在其中,
不過我寫的代碼,總體來講質(zhì)量還是過得去的,新手參考一下也無不可。
1、確定需求
希望掌握每天CVS上,誰、在什么時(shí)間、對什么文件、做了什么。
2、可行性研究
需要研究CVS的什么指令可以獲取CVS的活動(dòng)情況
在閱讀CVS的手冊后,基本確定:
history 和 log 兩個(gè)指令可以滿足要求。
具體指令說明請參見:
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、技術(shù)預(yù)演
參照手冊上的說明,試驗(yàn)history和log兩個(gè)指令的輸出,以及參數(shù)對輸出的影響,
最終確定使用如下兩條指令格式:
cvs log -d '>YYYY-MM-DD' -N -S 模塊名
? ? -d? 表示限制時(shí)間,>YYYY-MM-DD? 表示大于該指定時(shí)間,該參數(shù)在實(shí)際運(yùn)行時(shí)被替換為當(dāng)天日期
? ? -N? 表示不輸出文件的tag(因?yàn)槲覀兊拇a會經(jīng)常用tag做標(biāo)記,所以輸出tag會很亂)
? ? -S? 指定模塊名,實(shí)際上就是CVS Repository下的一個(gè)目錄名
cvs history -xAMRT -D'YYYY-MM-DD' -a -p 模塊名
? ? -x? 限定輸出包含的活動(dòng)類型,AMRT代表增加、修改、刪除和遠(yuǎn)程標(biāo)記文件(rtag)。
? ? -D? 限定只輸出YYYY-MM-DD之后的活動(dòng)
? ? -a? 輸出所有用戶的活動(dòng)
? ? -p? 指定模塊名,等同與log的 -S(注意,-x的T參數(shù)不受此參數(shù)影響)
? ?
4、分析指令結(jié)果,提取有效信息
history指令輸出結(jié)果:
增刪改:
A 2009-06-05 00:46 +0000 wub? 1.1? IActiveAlmService.java? ITIMSROOT/svr/src/itims/svr/asa/alm? ? == <remote>
修改類型 修改發(fā)生的時(shí)間? 誰? 版本 涉及的文件? ? ? ? ? ? ? 文件所在路徑? ? ? ? ? ? ? ? ? ? ? ? ? ? 其它信息
TAG:
T? ? ? ? 2009-06-11 01:39 +0000 jinxfei research? ? ? ? ? ? ? ? ? ? ? [new-tag-on-new-tag:HEAD]
rtag? ? 標(biāo)記發(fā)生的時(shí)間? ? ? ? ? 誰? ? 標(biāo)記的文件或者目錄? ? ? ? ? ? ? 標(biāo)記名:分支
log指令的輸出結(jié)果:
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
測試提交
=============================================================================
其中,有價(jià)值的信息包括:
文件名,每次revision的時(shí)間、用戶、文件狀態(tài)、提交時(shí)的說明
5、確定方案
由于CVS指令輸出的結(jié)果比較技術(shù),我們需要將其進(jìn)行規(guī)整,最好能夠以HTML方式進(jìn)行展示。
log和history的輸出內(nèi)容看問題角度不同,
log的輸出結(jié)果可以整理成以文件為主的一張表格,反映每天有多少文件被誰修改過。
history的輸出結(jié)果可以整理成以用戶為主的一張表格,反映每天誰修改了多少文件。
首先,需要定時(shí)執(zhí)行cvs的兩條指令,結(jié)果導(dǎo)出到文本文件中,作為后續(xù)分析的基礎(chǔ),
這可以通過Crontab來進(jìn)行調(diào)度(Window上可以用計(jì)劃任務(wù))。
然后,需要針對兩種指令結(jié)果,實(shí)現(xiàn)信息抽取和格式化的業(yè)務(wù)邏輯,生成用于展示的JavaBean。
最后,編寫界面,做信息展示。包含一個(gè)導(dǎo)航界面和兩個(gè)分析結(jié)果展示界面。
6、實(shí)現(xiàn):shell腳本抽取信息
shell文件內(nèi)容如下:
#####################
#先確保cron執(zhí)行環(huán)境和當(dāng)前用戶一致,/home/itims請換成自己用戶的home目錄,.bash_profile在各個(gè)平臺上可能也有差異
. /home/itims/.bash_profile
#計(jì)算當(dāng)前的年月日
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執(zhí)行
在unix命令行輸入:
crontab -e
然后增加如下行:
30 23 * * * /home/itims/trail/cvs_236_expr/dailyLog.sh
以上腳本路徑請自己替換。
7、實(shí)現(xiàn):java編寫業(yè)務(wù)邏輯
? ? 7.1 編寫分析History指令日志片段(每一行)的類
? ? 7.2 編寫JUNIT單元測試(輸入字符串,輸出JavaBean)
? ? 7.3 編寫分析Log指令日志片段(見前面的樣本)的類,使用正則表達(dá)式定位相關(guān)信息
? ? 7.4 編寫JUNIT單元測試
? ? 7.5 編寫業(yè)務(wù)邏輯主類,接收文件名參數(shù),讀取文件,并從發(fā)送給分析類進(jìn)行解析
8、實(shí)現(xiàn):jsp編寫展示界面
由于頁面比較簡單,且為內(nèi)部使用,不用Action,直接在JSP中調(diào)用業(yè)務(wù)邏輯主類,
分析文件后,循環(huán)展示。
? 7、8兩部分的實(shí)現(xiàn)源代碼,包含在我的資源中可以下載。
9、后續(xù)工作
可以作出一些統(tǒng)計(jì)信息,包括每天最活躍用戶、最活躍文件的排名。
還可以記錄用戶、文件的活躍歷史,形成曲線。
另外,在使用正則表達(dá)式匹配log內(nèi)容的時(shí)候,如果用戶提交的message中出現(xiàn)=或者-,將會導(dǎo)致此后的信息丟失。
這需要微調(diào)正則表達(dá)式來作出更精確的匹配。
對界面進(jìn)行美化。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的麻雀虽小,五脏俱全:分析CVS活动情况的小工具(有源码供学习)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MFC中的Document-View结构
- 下一篇: 项目经理沟通的四个好习惯