Subversion
服务器
mailer
指南
Subversion
服务器为我们提供了很多的
hook
,可以让我们在有人对仓库进行动作的时候进行一些相应的处理,这些
hooks
都放在仓库目录下的
hooks
子目录下面,具体
hook
的含义可以参考
Subversion
的帮助的第
5
章的
Hook Scripts
。(
Subversion
的在线官方文档
http://svnbook.red-bean.com/
,有多种语言版本),那么我们怎么用这些
hooks
来帮我们更加有效的利用
Subversion
呢。常用的一个方面是当有人提交新版本的时候能够自动的发送邮件给指定的一群人,方便交流和管理。在
Subversion 1.3
版本之前也有人用
pre-commit
来让
svnserve
也能根据目录来实现写权限,不过现在
1.3
版本的
svnserve
已经能够
使用
mod_authz_svn
相同的首选策略文件。
下面我们以
post-commit
为例,实现有人提交新版本的时候能够自动的发送邮件给指定的一群人。当有用户提交新版本的时候,会触发
post-commit
这个
hook script
,它会接受到
仓库路径和当前提交版本的版本号这
2
个参数。接下来,我们怎么利用这个
script
来做我们所需要的事情呢,通过使用
mailer.py
这个
python
脚本就可以实现我们的需求了。首先
check out
这个文件,
http://svn.collab.net/repos/svn/trunk/tools/hook-scripts/mailer
,一般来说安装好
python 2.3
和
Subversion
的
python binding
之后就可以运行这个脚本了。
首先我们看看这个脚本如何使用,不带参数执行该脚本,结果如下:
USAGE: mailer.py commit REPOS REVISION [CONFIG-FILE]
mailer.py propchange REPOS REVISION AUTHOR PROPNAME [CONFIG-FILE]
mailer.py propchange2 REPOS REVISION AUTHOR PROPNAME ACTION
[CONFIG-FILE]
mailer.py lock REPOS AUTHOR [CONFIG-FILE]
mailer.py unlock REPOS AUTHOR [CONFIG-FILE]
第
2
个参数是对应不同的
hook
的,各参数对应的
hook
如下
参数
|
hook
|
Commit
|
*commit
|
Propchange
|
*revprop-change
|
Propchange2
|
post-revprop-change
|
Lock
|
*lock
|
Unlock
|
*unlock
|
这里我们用的是post-commit hook,于是我们选择用commit参数。REPOS REVISION由hook提供,我们只需要指定CONFIG-FILE文件,如果没有指定该文件,mailer将会依次在REPOS/conf/、mailer所在目录查找。
我们只要在post-commit hook中加上 mailer commit “$1” “$2” mailer.conf或者如果你的服务器架设在windows下的话,用python c:\repos\hooks\mailer.py commit %1 %2 c:\repos\hooks\mailer.conf,mailer.py的路径最好用绝对路径,因为svnserve在hook启动时候的路径是svnserve所在目录。这样我们就可以让Subversion server在有人commit之后尝试发送邮件给我们了。这里为什么要用尝试,因为还有另外一份很重要的文件需要我们修改后才能正常发送邮件。
这个重要的文件就是mailer.conf文件,在先前我们check out的文件夹下面有一个简单的例子mailer.conf.example,我们逐行解释一下。注意,不要随便注释某些参数,可能会导致脚本无法运行。
[general]
#mail_command = /usr/sbin/sendmail
# mailer模块发送邮件的方式有3种,Pipe,SMTP,stdout
#mail_command将指定Pipe方式发送给mail_command指定的程序
#smtp_hostname = localhost
#smtp_hostname将指定SMTP方式发送给smtp_hostname指定的服务器
# Username and password for SMTP servers requiring authorisation
#smtp_username = example
#smtp_password = example
#如果既没有指定Pipe方式也没有指定SMTP方式,则发送到stdout
[defaults]
#这里定义一些默认的行为
diff = /usr/bin/diff -u -L %(label_from)s -L %(label_to)s %(from)s %(to)s
#diff程序以及参数等
commit_subject_prefix =
#commit动作的邮件的标题前缀
propchange_subject_prefix =
# propchange动作的邮件的标题前缀
lock_subject_prefix =
# lock动作的邮件的标题前缀
unlock_subject_prefix =
# unlock动作的邮件的标题前缀
from_addr =
invalid@example.com#邮件的from addresses
to_addr =
invalid@example.com#邮件的接收地址,用空格分隔,这里也可以用mapping_specification来表示
reply_to =
#邮件的回复地址
generate_diffs = add copy modify
#diff的设置,这里设置什么时候来使用diff,有效地设置是add,copy,modify,delete
#如果不想用diff,可以其他无效的单词来设置,如“no”,如果为空,
#则相当于add,copy,modify,delete同时有效
suppress_deletes = yes
#如果generate_diffs为空,delete选项无效 (不建议使用这种方式)
#suppress_adds = yes
#如果generate_diffs为空,add选项无效 (不建议使用这种方式)
show_nonmatching_paths = yes
#是否显示不匹配的路径。
# truncate_subject = 200
#邮件主题的截取长度,0为关闭,如果注释,则为0
# --------------------------------------------------------------------------
[maps]
#maps section定义一些选项的映射关系,
#可以通过option_name_to_remap = mapping_specification的形式来定义选项的取值。
#可以remap的option_name 为defaults section中除diff外其他的key值
#注意mapping_specification不要用大写字母开头,会导致无效。
#一个简单的例子如下
#[for game]
#for_paths = game
#to_addr = game
#[maps]
#to_addr = [mailing-lists]
#[ mailing-lists]
#game =
a@abc.comb@abc.com c<
c@abc.com>
#其他的section均为用户自定义的group
#自定义的group可重定义defaults section中间定义的选项的取值
#如何匹配这些group是由
# for_repos
# for_paths
#这2个选项的定义来决定的
#一个简单的例子如下:
#仓库的结构如下
# REPOS/
# clients/
# gsvn/
# rapidsvn/
# winsvn/
# 可以用正则表达式来匹配某些目录,同时定义一个字符串变量NAME,
# %(NAME)s就可以获得该变量的值,如:
# for_paths = clients/(?P<client>[^/]*)($|/)
# to_addr = commits@%(client)s.tigris.org
#一个预定义的变量为author,它缺省由mailer.py的AUTHOR定义或者是
#该版本的author,如果没有定义前面2个的值,author的值为"no_author"
配置好这个文件之后,我们的邮件系统就可以正式投入运营啦,通过一些手段,我们也可以把这个文件放入一个仓库中便于进行有效的管理。