需求
这里题目起的比较大,实际笔者这里的需求,仅仅是检测提交的文件名称以及目录名称是否包含空格而已,不过回头想想也不算大,我能够检测空格,同时也就能检测其他的元素,进而实现一整套合法性需求。
钩子函数
SVN的钩子函数是放在服务端的hooks目录下,里头有好几个:
pre-commit就是咱们的目标文件,他实际是一个bash脚本;
在开始编辑之前,我们需要把该文件的扩展名(.tmpl)删掉,并给予可执行去权限,否则默认是不执行的;
代码
IFS="\n"
CHANGED_FILE="/tmp/changed"
LINE_FILE="/tmp/line"
for i in `/usr/local/bin/svnlook changed -t "$TXN" "$REPOS" | awk '{for(i=1;i<=1;i++){$i=""};print $0}'`
do
echo "$i" > "$CHANGED_FILE"
done
sed -i 's/^ *//' "$CHANGED_FILE"
for i in `cat "$CHANGED_FILE"`
do
echo $i > "$LINE_FILE"
if [[ $i =~ " " ]];then
echo "The submitted file name or directory name cannot contain Spaces." 1>&2
exit 1
fi
done
解析
svnlook changed -t "$TXN" "$REPOS"
指令,会返回本次提交所做的所有变更,其中包括咱们想要识别的路径以及文件名;后面都是一些常规的文本处理;
注意:笔者这里修改了默认分隔符(IFS="\n"),改为了换行,否则for循环在便利输出的时候,会把空格也作为一个分割,那空格就被for拆开了,永远都检测不到空格
最后,笔者使用if [[ $i =~ " " ]]
来判断字符串是否包含空格;
CHANGED_FILE="/tmp/changed"
LINE_FILE="/tmp/line"
这两个文件,是作为commit变更的记录,分别是整体记录以及匹配到具体有空格的行记录;
测试
如果咱们测试提交了带有空格的文件名或路径的时候,会有如下提示:
结尾
大家可能会想,如果我多个人同时提交,会不会出现一个人的提交影响到其他人,这个我查了下,svn内部有类似于MySQL事务的原子性机制,并且我也在本地尝试过多个人同时提交,虽然可能存在一些测试误差,但感受下来基本可以满足需求,不同客户端之间的提交内容,没有相互影响;
标签:SVN,pre,changed,提交,CHANGED,空格,FILE,文件名称,tmp From: https://www.cnblogs.com/storyawine/p/17053298.html