2009年3月20日星期五

【原】svn服务器与客户端hooks脚本的使用

——主要谈提交前阻止空信息(pre-commit)和提交后自动发邮件(post-commit)这两个功能

本文用到的所有代码及工具下载:svn-hooks.rar
——包括pre-commit.bat,Post-commit.bat,blat.exe,maillist.txt等。

关于svn几个常用的hooks网上写的不少,相关代码被改的五花八门,很难有可以直接拿来用的(拿来主义总不像想象中的那么顺利...)。我这里只写Windows平台的,也不用python或者perl之类的需要装解释器的脚本,麻烦,只用bat,能达到目的不就行了嘛。

总的来说服务器脚本更实用一些,除了传入参数之外,更多参数可以通过svnlook命令来获得,所以能得到更多的信息来组织邮件内容;而客户端脚本虽说有传入参数比较多,但有些重要参数还是无法获得,所以并不好用。比如提交后自动发邮件的脚本,有些版本库我想实现只有管理员提交才发邮件,而其他人提交则不发邮件的功能。本来我想在管理员所用的客户端上加post-commit脚本,但很无奈版本库和提交文件列表两项参数无法获取(可能有绕弯的方法但我没找到),所以后来就在服务器脚本里加了对提交者的判断,从而达到了过滤的目的,也比较easy。
  • 提交前阻止空信息(pre-commit.bat)
这个比较简单,用svnlook log可以查询到log内容,判断它为空或者少于n个字符都可以返回错误并反馈到客户端,可参照附件Server目录下的pre-commit.bat。
  • 提交后自动发邮件(post-commit.bat)
主要实现思路是把提交版本的相关信息合成一封html邮件,再利用blat(一个著名的无界面邮件客户端)将邮件发送给配置好的邮件列表,相关附件为blat.exe、maillist.txt和Server目录下的Post-commit.bat。blat.exe最好放到系统盘System32目录下,这样在使用时就不用带绝对路径了,用之前首先要初始化一下,调用blat -install <server> <username> <try> <port>,<server>是smtp服务器的url,<username>是登录用户名,<try>是尝试重发次数,<port>是smtp发送端口,比如blat -install 192.168.1.254 xxx@crearo.com,后面两个参数如果不需要改可以默认。

最终发邮件时调用:blat "%LOG_FILE%" -tf %MAIL_LIST% -f %SENDER% -s "[svn] %REPOS_CP%, rev %REV%, %AUTHOR%" -base64 -charset Gb2312,这是针对发送邮件不需要认证的的命令。如果服务器需要进行用户认证,那么就要加上-u <username> -pw <password>,即用户名和密码。经过我的调研发现,Gmail不能用,因为它需要SSL认证,要用也可以,需要配合stunnel一起使用,太麻烦了;163邮箱需要认证,因此要带上用户名和密码;而创世内部邮箱无需认证,所以最终还是选用了公司邮箱,其他邮箱没有再作调研。最后snv自动发送的邮件截图如下:


其实除了发邮件,还可以根据自己的需要添加其他功能脚本,比如向公司内部即时通信软件发消息等,沟通效率会更高。这就可以任由你来发挥了,呵呵。

svn hooks科普教材:
http://www.worldhello.net/doc/svn_hooks/svn_hooks.mm.htm

4 条评论:

  1. 学习了,下次研究研究,也试试,呵呵~~

    回复删除
  2. svn hooks科普教材不错,所有hooks都介绍全了。hooks看来还蛮好玩的。

    回复删除
  3. pre-commit.bat和post-commit.bat这两个脚本都是svn服务器自己跑起来的吗?

    回复删除
  4. 服务器的脚本是这样的,所谓的钩子脚本就是能够捕获pre-commit、post-commit这种事件并调用相应处理。客户端的脚本是TSVN自己处理的。

    回复删除