SVN提交代码时实现强制按固定格式填写Log的方法
SVN本身并不提供这种强制填写Log的功能,而是通过一系列的钩子程序(称为hook脚本),在提交之前(pre-commit)、提交过程中(start-commit)、提交之后(post-commit)调用预定的钩子程序来完成一些附加的功能。
本次我们要实现的是在提交到版本库之前检查用户是否已经按固定格式填写了Log,要使用pre-commit这个钩子程序。打开SVN的repository目录下的hook子目录,有一个“pre-commit.tmpl”文件。这个文件是一个模板文件,它告诉了我们如何实现提交前控制。内容如下:
# The pre-commit hook is invoked before a Subversion txn is # committed. Subversion runs this hook by invoking a program
# (script, executable, binary, etc.) named 'pre-commit' (for which # this file is a template), with the following ordered arguments: #
# [1]REPOS-PATH (the path to this repository)
# [2]TXN-NAME (the name of the txn about to be committed) #
# The default working directory for the invocation is undefined, so # the program should set one explicitly if it cares. #
# If the hook program exits with success, the txn is committed; but # if it exits with failure (non-zero), the txn is aborted, no commit # takes place, and STDERR is returned to the client. The hook
# program can use the 'svnlook' utility to help it examine the txn.
在一个提交事务执行之前,SVN会调用指定的hook脚本,并向该脚本传递了两个参数:REPOS-PATH(仓库路径)和TXN-NAME(本次事务的事务号)。可以在该脚本中进行一些检查(比如检查Log信息是否填写),如果满足条件则返回0;否则返回其它非0结果,进而提交失败。可以通过svnlook命令来检查是否已经写了Log。
目标:检查提交代码时是否按照以下格式填写了Log NGRBUG-xxx: yyy 或者 NGRDEV-xxx: (yyy) zzz
其中,xxx为JIRA编号,yyy为JIRA的标题,zzz为具体的提交说明。
下面分别就SVN服务器搭建在Windows上和Linux上两种情况下列出pre-commit脚本的内容。
1. SVN服务器搭建在Windows上
在hook目录下创建pre-commit.bat文件,内容如下:
setlocal set REPOS=%1 set TXN=%2 set /a MIN_LOG_LEN=1 svnlook log \"%REPOS%\" -t \"%TXN%\" | egrep \"NGRBUG-[0-9]{1,}: .{% MIN_LOG_LEN%,}\" || svnlook log \"%REPOS%\" -t \"%TXN%\"| egrep \"NGRDEV-[0-9]{1,}: \\(.{%MIN_LOG_LEN%,}\\) .{%MIN_LOG_LEN%,}\" if %errorlevel% gtr 0 goto err exit 0 :err echo 请按正确的格式填写Log!>&2 echo 格式:NGRBUG-xxx: xxx或者NGRDEV-xxx: (xxx) xxx。>&2 echo 注意:冒号后和小括号后有空格。>&2 exit 1 说明: 1)svnlook log \"%REPOS%\" -t \"%TXN%\"的返回值是用户填写的Log信息。
2)Windows下的finstr命令对正则表达式支持的不够好,这里在Windows中引入Linux的工具包,使用Linux正则表达式来验证Log信息字符串是否符合要求。 2. SVN服务器搭建在Linux上
在hooks目录下创建pre-commit文件,内容如下:
#!/bin/sh REPOS=$1 TXN=$2 MIN_LOG_LEN=1 SVNLOOK=/project/csvn/bin/svnlook $SVNLOOK log $REPOS -t $TXN | egrep \"NGRBUG-[0-9]{1,}: .{$MIN_LOG_LEN,}\" ||$SVNLOOK log $REPOS -t $TXN | egrep \"NGRDEV-[0-9]{1,}: \\(.{$MIN_LOG_LEN,}\\) .{$MIN_LOG_LEN,}\" if [ $? -eq 0 ]; then exit 0 else echo “请按正确的格式填写Log!”>&2 echo “格式:NGRBUG-xxx: xxx或者NGRDEV-xxx: (xxx) xxx。”>&2 echo “注意:冒号后和小括号后有空格。”>&2 exit 1 fi 说明: 1) SVNLOOK变量的取值根据svnlook命令的路径进行设定。 2)更改pre-commit的运行权限:chmod +x pre-commit。
3)目前发现中文的出错提示信息显示格式有点问题,可改为英文。