0%

SVN 钩子脚本

SVN 钩子脚本(hook script)是由版本事件触发的程序,例如提交新版本。预处理脚本(pre-hooks)在事件之前触发,可以收集事件信息或做一些校验工作(不能修改版本信息),甚至阻止事件发生。后处理脚本(post-hooks)在事件后触发,可以收集事件信息或做一些校验工作(不能修改版本信息)。每种脚本都传递了足够的信息来判断当前发生的操作、被操作对象和操作的用户名等。

钩子脚本的类型

  • start-commit,提交开始时触发(Notification of the beginning of a commit)。
  • pre-commit,提交完成之前触发(Notification just prior to commit completion)。
  • post-commit,提交成功之后触发(Notification of a successful commit)。
  • pre-revprop-change,尝试修改版本属性之前触发(Notification of a revision property change attempt)。
  • post-revprop-change,成功修改版本属性之后触发(Notification of a successful revision property change)。
  • pre-lock,尝试对某个路径加锁之前触发(Notification of a path lock attempt)。
  • post-lock,成功对某个路径加锁之后触发(Notification of a successful path lock)。
  • pre-unlock,尝试对某个路径解锁之前触发(Notification of a path unlock attempt)。
  • post-unlock,成功对某个路径解锁之后触发(Notification of a successful path unlock)。

服务端钩子脚本

位置在 SVN 存储库目录下的 hooks 目录下,必须为可执行程序,例如:在Windows 系统上可以是 pre-commit.exe, pre-commit.bat, pre-commit.cmd 等,Unix 系统上 pre-commit(添加可执行属性) 等。

注:SVN 存储库目录是使用 svnadmin create 创建的服务端目录,不是 svn checkout 的客户端目录。目录结构如下:

hooks 目录下有很多后缀名为 .tmpl 的模板文件,里面有当前钩子类型的触发的条件、传递的参数和如何使用等详细信息。

将后缀名移除即可启用钩子文件,例如将 pre-commit.tmpl 重命名为 pre-commit.exepre-commit.bat(Windows 系统下),pre-commit (Unix 系统下为添加可执行属性 chmod u+x pre-commit)。

常用钩子脚本

pre-commit

  • 参数:pre-commit REPOS-PATH TXN-NAME
  • 描述:在提交业务(commit transaction)变成下个新版本(new revision)之前触发。一般用来阻止不合法的提交,例如:检查提交消息、提交内容和用户权限等。
  • 返回值:如果返回值为 0,则允许提交。返回值不为 0,提交将被中止。中止的信息可以输出到 stderr 中传递给客户端。
  • 参数1:REPOS-PATH,表示 SVN 存储库目录路径。
  • 参数2:TXN-NAME,这次提交业务(transaction)的名称。这个参数可以传递给 svnlook 来获取更多有用的信息,例如:提交用户名,信息,文件路径等。
  • 注意:不能在 post-commit 脚本中对版本或提交业务做修改。
  • 文档:https://svnbook.red-bean.com/en/1.8/svn.ref.reposhooks.pre-commit.html
  • 更多有用的信息可以参考 hooks 目录下的 post-commit.tmpl 文件。
  • 例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/sh

REPOS="$1"
TXN="$2"

# 检查提交消息是否为空
SVNLOOK=/usr/local/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
grep "[a-zA-Z0-9]" > /dev/null || exit 1

# 运行python脚本并传递参数
python check_file_names.py "$REPOS" "$TXN"

# 没问题,允许提交
exit 0

post-commit

  • 参数:post-commit REPOS-PATH REVISION TXN-NAME
  • 描述:在提交业务(commit transaction)成功提交并创建新版本(new revision)后触发。一般用来发出邮件、通知其他工具和备份操作等。
  • 返回值:返回值不为 0 并不会影响提交,但是可以输出到 stderr 中传递信息给客户端。
  • 参数1:REPOS-PATH,表示 SVN 存储库目录路径。
  • 参数2:REVISION,新的版本号。
  • 参数2:TXN-NAME,这次提交业务(transaction)的名称。
  • 注意:不能在 post-commit 脚本中对版本或提交业务做修改。
  • 更多有用的信息可以参考 hooks 目录下的 post-commit.tmpl 文件。
  • 文档:https://svnbook.red-bean.com/en/1.8/svn.ref.reposhooks.post-commit.html
  • 例子:
1
2
3
4
5
6
7
8
#!/bin/sh

REPOS="$1"
REV="$2"
TXN_NAME="$3"

# 发送邮件
mailer.py commit "$REPOS" "$REV" /path/to/mailer.conf

更多例子

参考这篇文章 SVN hooks Tutorials & Guide

svnlook 常用命令

  • svnlook log REPOS_PATH -t TXN_NAME,打印本次提交业务的消息。
  • svnlook changed REPOS_PATH -t TXN_NAME,打印本次提交业务的文件列表。 U 开头表示修改,A 添加,D 删除。
  • svnlook tree REPOS_PATH PATH_IN_REPOS --full-paths,打印 PATH_IN_REPOS 下的目录和文件列表,--full-paths 表示全路径。

TortoiseSVN 客户端脚本

打开 TortoiseSVN -> Settings -> Hook Scripts 点击 Add...

选择钩子脚本类型,选择要检查的路径和执行命令即可。

更多参考客户端钩子脚本

参考文档