Chinaunix首页 | 论坛 | 博客
  • 博客访问: 167732
  • 博文数量: 45
  • 博客积分: 2510
  • 博客等级: 少校
  • 技术积分: 454
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-19 13:35
文章分类

全部博文(45)

文章存档

2011年(1)

2009年(44)

我的朋友

分类:

2009-10-20 17:31:43

互联网上有很多相关的文章,但是说明的不够明了,我参考这些文章来配置的时候,走了不少弯路。现在将这两种方式整理一下。

第一种方式 通过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 变量的所有内容重新进行处理,发现 ?\ 后面跟三个数字就替换为相应的字符。

阅读(2912) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~