雖然有點(diǎn)機(jī)械, 但自動(dòng)的, 強(qiáng)制的永無遺漏地檢查CVS的提交注釋還是有效的.
配置CVS服務(wù)器的這一功能有一些小地方需要注意.
1. 軟件版本
cvsnt: Concurrent Versions System (CVSNT) 2.5.01 (Travis) Build 1976 (client/server)
tortoise cvs: 1.8.31
WinCVS: 2.0.2.4(build 4)
2. 在CVSROOT目錄下的 commitinfo 文件中, 這樣指定
^Relative_Project_Path C:/ActivePerl/bin/perl.exe "D:/ABC/CVSROOT/check_comment.pl" -comment %m
這里%m 是由CVS服務(wù)器在調(diào)用perl命令行之前替換為你提供的注釋
其中Relative_Project_Path 要使用/而不是\, 既使是在windows系統(tǒng)上. 這是個(gè)正則表達(dá)式.
3. 如果使用命令行
cvs ci -m "" file.txt
則上面的%m 不會(huì)產(chǎn)生一個(gè)參數(shù). 這樣 check_comment.pl 就只看到一個(gè)參數(shù)(@ARGV 只一個(gè)元素), 這在寫腳本時(shí)要注意.
但命令行上使用
cvs ci -m " " file.txt
就可以使得%m 產(chǎn)生一個(gè)參數(shù), 其內(nèi)容為一個(gè)空格. 所以check_comment.pl 不僅要檢查沒有參數(shù)的情況, 還要檢查參數(shù)為全空白字符(包括<TAB>換行等)的情況.
4. 但Tortoise CVS中, 僅輸入空格或換行提交, CVS服務(wù)器端仍得不到%m 對(duì)應(yīng)的參數(shù). 這說明Tortoise CVS在客戶端就作了處理. 同樣, 下面的輸出說明 Tortoise CVS的輸出窗口中給出的命令行并不能直接copy到DOS 命令窗口中執(zhí)行:
看綠線劃出的-m 參數(shù), 后面沒有跟 "", 從命令行的角度看, MainApp.cs 會(huì)作為注釋的內(nèi)容而不是被提交的文件名. 不能簡(jiǎn)單地相信Tortoise CVS輸出窗口中給出的命令.
上面是檢查注釋為空時(shí)提交失敗的輸出, 故意弄的醒目一些.
5. 使用WinCVS
WinCVS 會(huì)在你根本不輸出注釋時(shí), 自動(dòng)產(chǎn)生一個(gè) "no message"作為注釋送給cvs 服務(wù)器, 所以檢查注釋的腳本還得額外地檢查WinCVS的這種縱容程序員不寫注釋的行為. 因?yàn)檫@個(gè)原因, WinCVS永遠(yuǎn)不會(huì)產(chǎn)生無注釋的提交.
另外, 在perl腳本中*********與下面的Empty or blank... 文本之間我僅有一個(gè)空行, 但WinCVS卻在處理輸出時(shí), 額外地為每行都添加一個(gè)空行. 這一點(diǎn)實(shí)在很惱人.
不過WinCVS會(huì)對(duì)送到標(biāo)準(zhǔn)錯(cuò)誤輸出的內(nèi)容使用黃色, 這一點(diǎn)比Tortoise CVS好.
在既輸出到標(biāo)準(zhǔn)輸出, 也輸出到標(biāo)準(zhǔn)錯(cuò)誤輸出時(shí), 即使你在perl腳本中先輸出到STDOUT, 再即使你還使用了$| = 1來強(qiáng)制刷新到設(shè)備, WinCVS還是會(huì)先顯示錯(cuò)誤消息, 之后才是送至STDOUT的消息.
如果象下面這樣散布著對(duì)STDOUT, STDERR的輸出:
local $| = 1; print "STDOUT 1\n"; print STDERR "1234"; print "STDOUT 2\n"; print STDERR "xyz\n";
|
則在WinCVS的輸出窗口中, 仍然是先輸出所有的 STDERR消息, 然后才是 STDOUT消息. 但所有STDERR消息和STDOUT消息的相對(duì)順序還是能保證的.
送至STDOUT的消息也是每一行額外加一個(gè)空白行.
6. 使用命令行 cvs ci file.txt
你不指定-m 注釋, cvs會(huì)強(qiáng)制打開notepad(在windows上)讓你輸入注釋, 不要以為看到notepad中已經(jīng)有內(nèi)容就可以偷懶啥也不寫然后繼續(xù)提交, 送至服務(wù)器端的注釋仍然是空的, notepad中的既有內(nèi)容僅是模板.
這說明cvs的設(shè)計(jì)者很重視開發(fā)者對(duì)每次提交都要寫注釋.
7. [失敗經(jīng)驗(yàn)]注意 commitinfo 中的正則表達(dá)式匹配規(guī)則: 第一個(gè)匹配成功就執(zhí)行過濾程序, 其余的不檢查
^Project/src/CPP
^Project/src
對(duì)第二個(gè), 再想執(zhí)行通用的檢查就不行了, 因?yàn)镃PP目錄下的check in動(dòng)作會(huì)先找到第一個(gè)匹配的條目, 執(zhí)行相應(yīng)的命令, 不會(huì)再繼續(xù)檢查其余的條目是否匹配.