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

根据实用性,本文主要谈及提交前阻止空信息(pre-commit)和提交后自动发邮件(post-commit)这两个功能,这些功能对于team规范工作流程和提高工作效率有很大帮助,所以我个人是极为推崇的,也希望能给大家带来启发。

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

关于svn几个常用的hooks网上写的不少,相关代码被改的五花八门,我想在这里规整一下,并且加入自己的一些理解和扩展功能,避免大家再走弯路。我这里只写出Windows平台的bat脚本,linux下同理。

总的来说服务器脚本更实用一些,除了传入参数之外,更多参数可以通过svnlook命令来获得,所以能得到更多的信息来组织邮件内容;而客户端脚本虽说有传入参数比较多,但有些重要参数还是无法获得,所以并不好用(具体参数可以参考tsvn帮助文档,或者看我写的一个“半成品”示例脚本^_^)。比如提交后自动发邮件的脚本,有些版本库我想实现只有管理员提交才发邮件,而其他人提交则不发邮件的功能。本来我想在管理员所用的客户端上加post-commit脚本,但很无奈版本库和提交文件列表两项参数无法获取(可能有绕弯的方法但我没找到,有人知道可以告诉我),所以后来就在服务器脚本里加了对提交者的条件判断,也算达到了过滤的目的。

t 提交前阻止空信息(pre-commit)
这个比较简单,用svnlook log可以查询到log内容,判断它为空或者少于n个字符都可以返回错误并反馈到客户端,可参照附件Server目录下的pre-commit.bat。主要代码段:

1SET REPOS=%1
2SET TXN=%2
3
4svnlook log -t "%TXN%" "%REPOS%" | findstr ".........." > nul
5if %errorlevel% gtr 0 goto err
6exit 0
7:err
8echo 日志是跟踪版本的重要信息,必须输入,且长度不得小于10个字符。 1>&2
9exit 1


t 提交后自动发邮件(post-commit)
主要实现思路是把提交版本的相关信息合成一封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邮箱需要认证,因此要带上用户名和密码;而我们公司内部邮箱无需认证,所以最终还是选用了公司邮箱,其他邮箱没有再作调研。主要代码段:

post-commit.bat


最后snv自动发送的邮件截图如下:

 

其实除了发邮件功能之外,还可以根据自己的需要添加其他功能脚本,比如向公司内部即时通信软件发消息等,沟通效率会更高。我们公司的IM工具是我们团队开发的,不具备通用性,这里就不贴出来了。以上介绍只起到抛砖引玉的作用,如果能想到更好的应用,大家都可以自由发挥,而且也非常欢迎能与我们探讨,呵呵。

最后,提供一个svn hooks科普教材:
http://www.worldhello.net/doc/svn_hooks/svn_hooks.mm.htm

posted @ 2009-05-27 11:52  Terry Wang  阅读(4671)  评论(3编辑  收藏  举报