Posted on 2009-01-21 12:47
E.ven 阅读(1351)
评论(0) 编辑 收藏
互联网上有很多相关的文章,但是说明的不够明了,我参考这些文章来配置的时候,走了不少弯路。现在将这两种方式整理一下。
第一种方式 通过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 变量的所有内容重新进行处理,发现 ?\ 后面跟三个数字就替换为相应的字符。