Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1177218
  • 博文数量: 312
  • 博客积分: 12522
  • 博客等级: 上将
  • 技术积分: 3376
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-27 18:35
文章分类

全部博文(312)

文章存档

2016年(3)

2015年(1)

2013年(1)

2012年(28)

2011年(101)

2010年(72)

2009年(13)

2008年(93)

分类: 项目管理

2010-04-23 14:35:04

SVN的Hooks功能--强制添加注释和允许修改注释
很多SVN版本库在提交代码的时候要求添加注释信息,而且还有最短长度的限制。这是如何实现的?这个话题就涉及到了svn的Hooks功能的使用。

   本文欢迎自由转载,但请标明出处和本文链接,并保持本文的完整性。
   CU: Godbach
(http://blog.chinaunix.net/u/33048/showart_1908522.html)
   Apr 23, 2009


所谓hooks,可以类似理解Linux内核Netfilter框架的hook点和hook函数的概念。当用户在维护代码的过程中,其执行的相关动作正好触发了相关hook点,就会去执行对应hook点的脚本。

SVN版本库目录下有hooks目录,里面有很多.tmpl的文件。这些文件用以定义某些动作触发的hook脚本。默认状态下,这些脚本的后缀都是.tmpl,是没有起作用的。相当于Netfilter的各个hook点没有注册hook函数。所以,当用户执行相关维护代码动作的时候,也不会触发hook脚本。因此,在默认状态下,用户提交代码的时候,不用添加注释信息也会被版本看所接受。而且,用户想修改自己的注释时,会得到服务器拒绝的相关提示信息(本人搭建的svn server是这样的默认情形)。

那么如何设置hook脚本以保证强制用户添加注释,以及允许用户修改注释呢?

1. 强制添加注释信息
用户提交代码的动作,对应的是pre-commit。因此,可以修改pre-commit.tmpl文件。
文件名修改为pre-commit, Windows下可以修改为pre-commit.bat。这样可以让系统知道该文件时可执行文件。

将文件中以下几行内容注释掉, 前面添加'#'
$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

并在此位置添加如下几行:

LOGMSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]" | wc -c`
if [ "$LOGMSG" -lt 5 ];#要求注释不能少于5个字符(数字和字母),您可自定义
then
   echo -e "nLog message cann't be empty! you must input more than 5 chars as comment!." 1>&2
   exit 1
fi

保存,退出。
给pre-commit添加可执行权限
chmod +x pre-commit
经过该设置,用户提交代码时注释信息小于5个字符将会得到警告,并且代码不会被提交到版本看

2. 允许用户修改注释信息
用户修改注释信息的动作,对应的是pre-revpos-change. 将hooks/下pre-revpos-change.tmpl
更名为pre-revpos-change。通常该文件包含的功能就是允许用户修改注释信息,因此只要将该文件加上可执行权限即可:
#chmod +x pre-revpos-change

默认文件内容如下,如果不是下面这些内容的话,可以对照修改即可:

REPOS="$1"
REV="$2"
USER="$3"
PROPNAME="$4"
ACTION="$5"

if [ "$ACTION" = "M" -a "$PROPNAME" = "svn:log" ];
then
    exit 0;
fi

echo "Changing revision properties other than svn:log is prohibited" >&2
exit 1
这样,就可以允许用户修改注释信息了。

以上对SVN的配置,参考了如下连接的内容,在此表示感谢:
http://hi.baidu.com/cnydpl/blog/item/9d6ac931d300fa1eeac4af63.html

下面是SVN版本库在Win下建立的,允许用户修改注释信息的脚本:

@ECHO OFF
set repos=%1
set rev=%2
set user=%3
set propname=%4
set action=%5
 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow changes to svn:log. The author, date and other revision
:: properties cannot be changed
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%propname%'=='svn:log' goto ERROR_PROPNAME
 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Only allow modifications to svn:log (no addition/overwrite or deletion)
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
if /I not '%action%'=='M' goto ERROR_ACTION
 
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Make sure that the new svn:log message contains some text.
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
 set bIsEmpty=false
)
if '%bIsEmpty%'=='true' goto ERROR_EMPTY
 
goto :eof
 
 
 
:ERROR_EMPTY
echo Empty svn:log properties are not allowed. >&2
goto ERROR_EXIT
 
:ERROR_PROPNAME
echo Only changes to svn:log revision properties are allowed. >&2
goto ERROR_EXIT
 
:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT
 
:ERROR_EXIT
exit /b 1

在Win下pre-revpos-change文件名应改为pre-revpos-change.bat,这样Win知道是可执行文件。
Win下的修改方式参考了如下链接:

阅读(2034) | 评论(0) | 转发(1) |
0

上一篇:Ant入门教程

下一篇:详说 Subversion备份

给主人留下些什么吧!~~