一、概述
我们经常提到的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所触发的时机相关的信息如下
当前版本的hook的相关参数信息如下所示:
二、案例
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
commit-access-control.pl "$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
和
commit-access-control.pl “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