SVN pre-commit钩子检测文件名称合法性

需求

这里题目起的比较大,实际笔者这里的需求,仅仅是检测提交的文件名称以及目录名称是否包含空格而已,不过回头想想也不算大,我能够检测空格,同时也就能检测其他的元素,进而实现一整套合法性需求。

钩子函数

SVN的钩子函数是放在服务端的hooks目录下,里头有好几个:
image
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变更的记录,分别是整体记录以及匹配到具体有空格的行记录;

测试

如果咱们测试提交了带有空格的文件名或路径的时候,会有如下提示:
image

结尾

大家可能会想,如果我多个人同时提交,会不会出现一个人的提交影响到其他人,这个我查了下,svn内部有类似于MySQL事务的原子性机制,并且我也在本地尝试过多个人同时提交,虽然可能存在一些测试误差,但感受下来基本可以满足需求,不同客户端之间的提交内容,没有相互影响;

posted @ 2023-01-15 12:00  一个运维  阅读(329)  评论(0编辑  收藏  举报