废话:虽然说现在git来势凶猛,但是svn还是用得很多的,将自己折腾svn的过程记录下来!
svn提供了一个很方便的hooks功能(之前我的折腾ftp文章里面也有提及这总设计思想),可以为对repository的操作设定相关的动作。详细的介绍去看svn的官方文档,我这里只是介绍有post-commit发送通知邮件。subversion repository 的目录里面有这里conf, dav, db, hooks, locks等目录。其中hooks就是用来存放hooks的地方(又是废话)。目前总共是九种hooks:
- start-commit:开始提交的通知。在开始事务之前执行(通常用来确定用户是否有提交权限)。如果start-commit钩子程序返回非0值,动作(比如提交)就会在创建事务之前停止,stderr的任何输出都会返回到客户端。
- pre-commit:在提交结束之前提醒。post-commit钩子在事务创建新版本之前运行,通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交。如果 pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端。
- post-commit:成功提交的通知。post-commit 钩子在事务完成,创建新版本后执行。大多数人用这个钩子来发送关于提交的描述性电子邮件,或者用来提醒其它工具(例如问题跟踪),发生了提交动作。一些配置也使用这个钩子触发版本库的备份进程。如果 post-commit 钩子返回非零值,提交不会终止,因为它已经完成。然后,所有 stderr 的输出都会返回到客户端,让诊断钩子的失败更容易。
- pre-revprop-change:修订版本属性修改的通知。pre-revprop-change 钩子在修改版本属性修改之前,正常提交范围之外被执行。不象其它钩子,这个钩子默认是拒绝所有的属性修改,钩子必须实际存在,并且返回一个零值,这样才能修改属性。如果 pre-revprop-change 钩子不存在,不可执行,或返回非零值,就不会修改属性,所有的 stderr 的输出会返回到客户端。
- post-revprop-change:修订版本属性修改成功的通知。post-revprop-change 钩子会在修改版本属性修改后立即执行,在提交范围之外。可以从其配对 pre-revprop-change 知道,如果没有实现 pre-revprop-change 钩子,它就不会执行。它通常用来在属性修改后发送邮件通知。如果 post-revprop-change 钩子返回非零值,修改动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
- pre-lock:路径锁定尝试的通知。pre-lock 钩子在每次有人尝试锁定文件时执行。可以防止完全锁定,或者用来创建控制哪些用户可以锁定哪些路径的复杂策略。如果钩子发现已存在锁,也可以决定是否允许用户“窃取”这个锁。如果 pre-lock 钩子返回非零值,锁定动作会终止,任何输出到 stderr 的内容都会返回到客户端。
- post-lock:成功锁定路径的通知。post-lock在路径锁定后执行。通常用来发送锁定事件邮件通知。如果 post-lock 钩子返回非零值,锁定动作不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
- pre-unlock:路径解锁尝试的通知。pre-unlock 钩子在某人企图删除一个文件上的钩子时发生。可以用来创建哪些用户可以解锁哪些文件的策略。制定解锁策略非常重要。如果用户 A 锁定了一个文件,允许用户 B 打开这个锁?如果这个锁已经一周了呢?这种事情可以通过钩子决定并强制执行。如果 pre-unlock 返回非零值,解锁操作会终止,任何输出到 stderr 的内容都会返回到客户端。
- post-unlock:路径成功解锁的通知。post-unlock 在一个或多个路径已经被解锁后执行。通常用来发送解锁事件通知邮件。如果 post-unlock 返回非零值,解锁过程不会终止,因为它已经完成。然而,任何输出到 stderr 的内容都会返回到客户端,让诊断钩子的失败更容易。
以上hooks Subversion的官方文档有更详细的说明。我需要的是变更成功通知,当然是选择post-commit,这里可以选择的根据有两种,commit-email.pl和mailer.py,因为commit-email.pl不能正确的处理no-ascii log message, 同时mailer.py功能比较强大,最重要的还是我比较熟悉python易于调试。我使用的ubuntu 在安装完subversion后装一下subversion-tools,这个包里面有个/usr/share/subversion/hook-scripts/mailer/mailer.py 用来对比两个版本库的不同并且发邮件给指定的邮件列表人员等。
$ cd $repo/hooks
$ cp post-commit.tmpl post-commit
$ chmod a+x post-commit
$ cp /usr/lib/subversion/hook-scripts/mailer/mailer.conf "$REPOS"/conf/mailer.conf
这里提供的模板是一个shell script,这里只要是一个可执行文件就可以了(可以是python,perl甚至是c的可执行文)在post-commit里面添加如下:
#!/bin/sh
REPOS="$1"
REV="$2"
/usr/lib/subversion/hook-scripts/mailer/mailer.py commit $REPOS $REV "$REPOS"/conf/mailer.conf
if [ $? -ne 0 ]; then
echo "failure to mailer.py commit $REPOS $REV" >> /home/trac/SVNRepository/Gala/hooks/test.log
fi
后面if语句是我调试的时候用的。现在的步骤就是修改mailer.conf,其实配置文件里面对配置的说明已经很好了,所以看看注释就可以配置,它官方文档在这里:http://opensource.perlig.de/svnmailer/doc-1.0/#general-sendmail-command时间可以细看!下面是我主要碰到的问题:mailer.conf里面提供发邮件的方式有两总,一个sendmail,一个是smtp。如果你选择的是sendmail方式,你需要把mailer.py修改一下
cmd = self.cmd + [ '-t', self.from_addr ] + self.to_addrs
"""修改成"""
cmd = self.cmd + [ '-f', self.from_addr ] + self.to_addrs
具体是为什么好像我自己也忘了。但是这样容易被服务器当作垃圾邮件拒绝,这样的话你在你用户下面debian一般是/var/mail/$USERNAME里面会收到拒绝的邮件。一般提示smtp协议错误!这里给出了一些smtp返回错误代码的意义:
http://www.5dmail.net/bbs/thread-184743-1-1.html你可以根据这个调试。提示方法如下:
/post-commit /path/to/the/svn/repository 689
689表示源码的一次变更!
如果你选择的是smtp发送邮件,一般没有什么问题,主要是server,username,passwd设置好就没有什么问题了!调试的办法还是一样的。