一、概述

我们经常提到的svn hooks(钩子)是一组“外挂”脚本程序, 是svn提供的一组由svn事件触发的特别有用的程序。 这些程序在服务器端执行,
可以提供svn之外的一些附加功能。  钩子可以调用批处理文件、可执行文件或者一些类似于perl、python等的脚本。
svn服务端有9种钩子,
分别是:
A. 关于锁定的2种  
   a1. pre-lock
   a2. post-lock
B. 关于解锁的2种  
   b1. pre-unlock
   b2. post-unlock
C. 关于提交的3种  
   c1. start-commit
   c2. pre-commit
   c3. post-commit
D. 关于属性的2种  
   d1. pre-revprop-change
   d2. post-revprop-change 

路径/application/svndata/sadoc/hooks

svn9种相关的hook所触发的时机相关的信息如下

版本集成之SVN钩子hooks_自定义

当前版本的hook的相关参数信息如下所示:

版本集成之SVN钩子hooks_自定义_02

二、案例

1、代码提交增加备注

/application/svndata/sadoc/hooks/pre-commit.tmpl #想启动就去掉.tmpl

#   [1] REPOS-PATH   (the path to this repository)
#   [2] TXN-NAME     (the name of the txn about to be committed)

我们看到在一个提交事务执行之前,该hook脚本会被调用。然后向该脚本传递两个参数:REPOS-PATH和TXN-NAME,一个是用户要提交的URL,一个是本次事务的一个事务号。如果提交成功则返回0,否则返回其它非0结果。那么我们的钩子程序就是要在事务提交之前,拦截这些请求,然后通过svnlook命令来检查是否已经写了log。

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

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | \
   grep "[a-zA-Z0-9]" > /dev/null || exit 1
 "$REPOS" "$TXN" commit-access-control.cfg || exit 1

cd /application/svndata/sadoc/hooks/
cp pre-commit.tmpl pre-commit

新建文件并提交
Commit failed (details follow):
Commit blocked by pre-commit hook (exit code 255) with no output.
If you want to break the lock, use the 'Check For Modifications' dialog or the repository browser.

##使用系统默认的不需要额外给pre-commit文件授权限
##如果使用自定义,必须得给文件授权先+x

2、自定义无注释提交报错

先注释掉
SVNLOOK log -t “$TXN” “$REPOS” |
grep “[a-zA-Z0-9]” > /dev/null || exit 1
和
 “R E P O S " " REPOS" "REPOS""TXN” commit-access-control.cfg || exit 1
#####追加以下代码
########################################################################
SVNLOOK=/usr/bin/svnlook
$SVNLOOK log -t "$TXN" "$REPOS" | grep "^jrzl" &>/dev/null
if [ $? != 0 ]
then
   echo -e "注释格式错误" 1>&2
   echo -e "标准格式:jrzl-修改某某缺陷-qingchen-202200306" 1>&2
   exit 1
fi

LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | wc -c`
if [ "$LOGMSG" -lt 20 ]
then
   echo -e "注释信息少于20个字符,拒绝提交" 1>&2
   echo -e "标准格式:jrzl-修改某某缺陷-qingchen-202200306" 1>&2
   exit 1
fi
########################################################################
当不给pre-commit改权限时
Commit failed (details follow):
Commit blocked by pre-commit hook (exit code 255) with no output.
If you want to break the lock, use the 'Check For Modifications' dialog or the repository browser.

给pre-commit授权先x
chmod +x pre-commit

Commit failed (details follow):
Commit blocked by pre-commit hook (exit code 1) with output:
注释格式错误
标准格式:jrzl-修改某某缺陷-qingchen-202200306
If you want to break the lock, use the 'Check For Modifications' dialog or the repository browser.

3、抄录删除权限控制

USER=`$SVNLOOK author -t $TXN $REPOS`
ADMINLIST=admin,zhangsan  # 这里是拥有删除权限的用户,逗号隔开
if [ "`echo $ADMINLIST|grep -w $USER|wc -l`" -eq 0 ];then
        if [ `$SVNLOOK changed -t $TXN $REPOS |grep "^D "|wc -l` -gt 0 ];then
                echo "你没有权限删除,请联系管理员删除!" >&2
                exit 1
        fi
fi