如何在SVN pre-commit hook中添加YAML、XML文件语法校验逻辑
SVN pre-commit钩子XML/YAML语法校验落地实现
前置依赖检查
- 服务器已安装Python 3,且已安装
PyYAML依赖:执行pip install pyyaml完成安装 - 确认
svnlook实际路径,可执行which svnlook查询,和脚本内路径保持一致
提示:如果你的服务器没有配置
commit-access-control.pl权限校验,可以直接注释掉脚本中对应行,不影响XML/YAML校验逻辑运行。
修改后的完整pre-commit脚本内容
直接替换你服务器hooks目录下的pre-commit文件内容(先把原pre-commit.tmpl重命名为pre-commit):
REPOS="$1" TXN="$2" # 配置svnlook路径,替换为你服务器实际路径 SVNLOOK=/usr/local/Cellar/subversion/1.14.1_4/bin/svnlook # 配置Python路径,可执行which python3查询替换 PYTHON_BIN=python3 # 原有逻辑:校验提交日志不能为空 $SVNLOOK log -t "$TXN" "$REPOS" | \ grep "[a-zA-Z0-9]" > /dev/null || { echo "ERROR: 提交日志不能为空,必须包含文字说明" >&2 exit 1 } # 原有逻辑:提交权限校验,不需要可直接注释 commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1 # ---------------------- 新增XML/YAML校验逻辑开始 ---------------------- # 获取本次提交所有变更的文件,过滤掉删除的文件(状态为D的跳过) $SVNLOOK changed -t "$TXN" "$REPOS" | while read -r status file; do # 跳过删除的文件 if [[ "$status" == D* ]]; then continue fi # 匹配YAML/XML后缀文件 if [[ "$file" =~ \.(ya?ml|xml)$ ]]; then # 取出待提交的文件内容执行校验 if [[ "$file" =~ \.ya?ml$ ]]; then # YAML语法校验 $SVNLOOK cat -t "$TXN" "$REPOS" "$file" | $PYTHON_BIN -c 'import yaml, sys; yaml.safe_load(sys.stdin)' 2>&1 if [[ $? -ne 0 ]]; then echo "ERROR: YAML文件语法错误,文件路径:$file" >&2 exit 1 fi elif [[ "$file" =~ \.xml$ ]]; then # XML语法校验 $SVNLOOK cat -t "$TXN" "$REPOS" "$file" | $PYTHON_BIN -c 'import xml.etree.ElementTree as ET, sys; ET.parse(sys.stdin)' 2>&1 if [[ $? -ne 0 ]]; then echo "ERROR: XML文件语法错误,文件路径:$file" >&2 exit 1 fi fi fi done # 校验上述循环是否有错误返回 if [[ $? -ne 0 ]]; then exit 1 fi # ---------------------- 新增XML/YAML校验逻辑结束 ---------------------- # 所有校验通过,放行提交 exit 0
后续配置步骤
- 给
pre-commit文件添加执行权限:chmod +x /path/to/svn/repo/hooks/pre-commit - 测试验证:提交包含语法错误的YAML/XML文件,确认提交会被拦截且返回对应错误提示;提交语法正确的文件可正常提交即可
内容的提问来源于stack exchange,提问作者Roger
相关产品推荐
相关产品推荐

