Posted on 2009-01-21 12:47
E.ven 閱讀(1373)
評論(0) 編輯 收藏
互聯網上有很多相關的文章,但是說明的不夠明了,我參考這些文章來配置的時候,走了不少彎路?,F在將這兩種方式整理一下。
第一種方式 通過svnnotify來發送郵件
/usr/bin/svnnotify --repos-path "$1" --revision "$2" --to real@admin.net --from real@admin99.net --handler "HTML::ColorDiff" --with-diff --smtp mail.admin99.net --charset zh_CN:GB2312 -g zh_CN --svnlook /usr/local/subversion/bin/svnlook --subject-prefix '[SVN更新]'
svnnotify有很多參數,可以通過svnnotify --help 或者man svnnotify 查看
好多文章中在介紹這種方式的時候,沒有加上svnlook的絕對路徑,我實在是很納悶,可能是他們的subversiong在安裝的時候沒有加上 --prefix=/yourpath 參數,把subversion安裝在了默認路徑,我的subversion是安裝在/usr/local/subversion之下的,svnnotify在默認的/usr/bin下找不到svnlook,所以,在郵件通知中無法出現log信息,diff信息等等。加上這個參數之后,問題解決。
還有更搞笑的是,很多關于這個的文章把 -l 參數當作svn 記錄日志文件的參數,寒~~ -_-!! 可能是把svnnotify和commit-email.pl搞混了,在svnnotify中,這個參數是 --language 。
這種方式還有另外一個問題,中文轉碼的問題,經過N次嘗試之后,log信息中的中文,diff信息中的中文仍然顯示的是亂碼,最后因為時間緊迫,不得不先放棄這種方式。
第二種方式 通過commit-email.pl 來發送郵件
/usr/local/subversion/bin/commit-email.pl "$1" "$2" --from real@admin99.net -h admin99.net -s "[SVN 更新]" --diff y svnhejia@51hejia.com
默認情況下,在subversion的bin目錄下,沒有commit-email.pl這個文件,是我從src中copy過來的。
關于commit-email.pl所能用的參數,可以通過直接執行/usr/local/subversion/bin/commit-email.pl 來查看,當然這個時候是執行不了了,提示錯誤是參數太少,然后給你列出來一些參數。參數不多。
--diff y 是表示在郵件中加入diff信息,這個當然是要的
后面跟的郵件地址,是接收郵件的地址,有人說可以在后面寫上N個地址,用空格分開就行,事實上我測試的時候,這種方式根本就收不到郵件了,時間緊迫,不能詳細測試。最后不得不在郵件服務器上做了一個組郵件地址。
關于中文問題,通過在commit-email.pl中更改字符集,基本上可以很完美的解決diff信息中的中文問題。
但是對于log信息中的中文,至今尚未找到合適的解決辦法。
這個問題的關鍵應該是在于,svn客戶端在提交更新的時候,輸入的log信息,使用的是非ascii編碼(應該是unicode) ,commit-email.pl(還不缺認問題是不是出在commit-email.pl還是出在svn本身)在處理非ascii編碼時,將其轉換成了諸如 ?\230?\181?\139?\232?\175?\149?\228?\186?\140 這樣的不可讀的數字形式。
在互聯網上找到一篇文章,是06年寫的,提到了一種解決這個的辦法,不過我測試下來沒有成功,還是貼出來吧,不定誰的就可以成功了
my @difflines; (行487) 的前面加上:
for (my $i=0; $i<@body; ++$i){
my @rsa = split( /\?\\/, $body[$i] );
$body[$i] = "";
foreach my $val (@rsa) {
$val =~ /(^[0-9]{3})(.*)/;
if(defined $1 and $1 gt 0){
#print "\n[".$1 . "," . $2."]";
$body[$i] .= chr($1) . $2;
}
else{
$body[$i] .= $val;
}
}
}
把之前 push 到 @body 變量的所有內容重新進行處理,發現 ?\ 后面跟三個數字就替換為相應的字符。