因为一些原因,手头上的SVN已经有好几个repo,但是因为历史遗留问题,前端的SVN路径是在某个仓库下,前两天突然提出审核的需求(而且还不能对整个repo仓库实施该审核要求),之前的工作经验中都是对repo添加钩子,第一次要对repo中的目录添加钩子。找了一些资料看了下,自己也尝试去测试,最后找到了对应的解决方法,这里Mark一下。
环境:
svn repo: svn://192.168.1.221/chuangyue
web前端svn路径:svn://192.168.1.221/chuangyue/web
需求:
1、提交到web前端SVN上的代码需要添加备注;
2、备注要不少于8个字符;
3、备注需要符合一定的格式,如:**** 修改 **** reviewid=1234
隐含要求:
只有提交到chuangyue这个仓库的web目录的代码才需要添加备注,并符合以上要求,但是提交到chuangyue的其他路径没有该限制。
这里,补充一下相关的命令,svnlook changed和svnlook dirs-changed.
svnlook dirs-changed: 打印修改过的目录,比如web/pictures/
语法:svnlook dirs-changed REPOS_PATH
描述:打印那些自身发生修改(编辑属性等)或者子目录及子目录中的文件发生修改的目录。
选项:
--revision (-r) REV
--transaction (-t) TXN
示例:
$ svnlook dirs-changed -r 40 /var/svn/repostrunk/vendors/deli/
svnlook changed:打印修改过的路径,比如web/pictures/test.jpg
描述:打印那些在特定版本或者事物发生修改的路径,连同“svn update-style”状态码在前两列展示。
‘A ’:添加到repo中的项目
‘D ’:从repo中删除的项目
‘U ’:文件内容被修改
‘_U’:项目属性被修改
‘UU’:文件内容和属性均被修改
注意:返回的结果中,文件和目录能够被区分,因为目录的尾部有一个“/”符号。
选项:
--copy-info--revision (-r) REV
--transaction (-t) TXN
示例:
$ svnlook changed -r 39 /var/svn/reposA trunk/vendors/deli/
A trunk/vendors/deli/chips.txt
A trunk/vendors/deli/sandwich.txt
A trunk/vendors/deli/pickle.txt
U trunk/vendors/baker/bagel.txt
_U trunk/vendors/baker/croissant.txt
UU trunk/vendors/baker/pretzel.txt
D trunk/vendors/baker/baguette.txt
关于以上命令的详细信息,可参阅如下链接:
http://svnbook.red-bean.com/en/1.5/svn.ref.svnlook.c.dirs-changed.html
http://svnbook.red-bean.com/en/1.5/svn.ref.svnlook.c.changed.html
最后,实现需求的钩子内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#!/bin/bash
#
###########################################
#说明: #
# 1、修改web目录必须输入评论才能提交 #
# 2、评论不得少于8个字节 #
# 3、评论格式为: xxxx reviewid=1234 #
# Author: Zhaojinghui #
# Created Time: 2017-04-25 18:11:44 #
###########################################
REPOS=
"$1"
TXN=
"$2"
SVNLOOK=
/usr/bin/svnlook
SPath=
"web/"
FOUND=$($SVNLOOK
dirs
-changed
"$REPOS"
-t
"$TXN"
|
grep
-E
"^$SPath"
)
# 判断提交修改是否包含SPath目录
if
[[
"$FOUND"
==
""
]]
then
exit
0
else
# 获取提交代码时输入的评论内容
LogMsg=`$SVNLOOK log -t
"$TXN"
"$REPOS"
|
grep
"[a-zA-Z0-9]"
`
LogMsgNum=`$SVNLOOK log -t
"$TXN"
"$REPOS"
|
grep
"[a-zA-Z0-9]"
|
wc
-c`
# 判断提交评论是否大于8个字节
if
[
"$LogMsgNum"
-lt 8 ];
then
echo
-e
"Log message cann't be empty! You must input more than 8 chars as commit!"
1>&2
exit
1
else
# 判断评论格式是否符合要求
echo
$LogMsg |
grep
".*reviewid=[0-9]\{1,5\}*"
>
/dev/null
[ $? -
ne
0 ] &&
echo
"Invalid log message format,it should be: xxx reviewid=[num]."
1>&2 &&
exit
2
fi
exit
0
fi
|