SVN hooks编写
SVN hooks默认放在所建的SVN库的一级目录hooks内.
提交前校验commit信息格式
Linux版
#!/bin/sh
export LANG=zh_CN.UTF-8
REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
LOG_INFO=`$SVNLOOK log -t "$TXN" "$REPOS"`
# 为空时提示
if [ _"$LOG_INFO" = _"" ]; then
echo "==COMMENT CHECK==" 1>&2
echo "提交注释为空,请重新输入." 1>&2
echo "例如:" 1>&2
echo "【需求编号】:2000-DEV-0000" 1>&2
echo "【需求名称】:电商平台" 1>&2
echo "【修改概述】:增加新功能/修复缺陷XXXX" 1>&2
exit 1
fi
# 获取提交注释
COMMENT_MSG=`echo "$LOG_INFO" |awk -F : '{print $1}'`
# 正则匹配的具体内容
if [[ "${COMMENT_MSG}" =~ ^【需求编号】:[0-9]{4}-[A-Z]{2,5}-[0-9]{3,6}.*【需求名称】:.+【修改概述】:.+ ]];then
echo "==COMMENT CHECK==" 1>&2
echo "[$LOG_INFO] 规范匹配." 1>&2
exit 0
else
# 不匹配时提示
echo "==COMMENT CHECK==" 1>&2
echo "[$LOG_INFO] 规范不匹配,请重新输入." 1>&2
echo "例如:" 1>&2
echo "【需求编号】:2000-DEV-0000" 1>&2
echo "【需求名称】:电商平台" 1>&2
echo "【修改概述】:增加新功能/修复缺陷XXXX" 1>&2
exit 1
fi
exit 0
Windows版
@echo off
:: 文件为ASCII编码
set SVN_BINDIR="C:/Program Files/VisualSVN Server/bin"
set REPOS=%1
set TXN=%2
setlocal enabledelayedexpansion
for /F %%i in ('svnlook log "%REPOS%" -t "%TXN%"') do ( set MSG=!MSG!%%i_____)
:: 正则匹配规范123行.
set LINE_ONE="^【需求编号】:[0-9]*-[A-Z]*-[0-9]*_____"
set LINE_TWO="^【需求名称】:...*_____$"
set LINE_THR="^【修改概述】:.....*_____"
if "%MSG%" == "" (
echo "EMPTY(0): 请输入提交注释!" >&2
exit 1
)
echo "%MSG%" | findstr "%LINE_ONE%"
if %ERRORLEVEL% == 0 (
echo "Get It"
)else (
echo "NO FOUND(1): 需求编号!" >&2
goto :MATCH_ERR
)
echo "%MSG%" | findstr "%LINE_TWO%"
if %ERRORLEVEL% == 0 (
echo "Get It"
)else (
echo "NO FOUND(2): 需求名称!" >&2
goto :Match_Err
)
echo "%MSG%" | findstr "%LINE_THR%"
if %ERRORLEVEL% == 0 (
echo "Get It"
)else (
echo "NO FOUND(3): 修改概述!" >&2
goto :Match_Err
)
exit 0
:MATCH_ERR
echo ==== >&2
:: echo Match error,please input again! >&2
:: echo "%MSG%" >&2
echo "规范不匹配,请重新输入.如:" >&2
echo "【需求编号】:2000-DEV-0000" >&2
echo "【需求名称】:电商平台" >&2
echo "【修改概述】:增加新功能/修复缺陷XXXX" >&2
echo ==== >&2
exit 1
注意点
后缀名
pre-commit.tmpl
不生效
Linux下hooks脚本无后缀名,直接为pre-commit
Windows下hooks脚本为批脚本格式,可为pre-commit.bat
或pre-commit.cmd
中文乱码
需要在hooks脚本内修改为对应所需要支持语言编码
Linux下可在文件内设置语言格式为UTF-8.一般添加在文件变量定义前.
export LANG=zh_CN.UTF-8
Windows下,如文件内设置UTF-8需要调整对应的命令行设置.
相对而言,直接把文件保存为ASCII
也可完成匹配.
hooks无法使用环境变量
出于安全考虑,在hooks脚本内无法使用所在环境变量.所以在使用svnlook的时候要提供绝对路径
修改hooks脚本权限
内容修改,或hooks脚本上传后. Linux下要确认该脚本是否有执行权限,如无权限则增加
chmod +x pre-commit
语法解析
Linux
=~
# 对字符串进行正则匹配, A =~ B, 则使用正则B 对字符串A 进行匹配, 匹配成功返回true,失败返回false, 一般结合[[ $变量名 ]]来使用
[[ $A ]] =~ [[ $B ]]
# 字符串前加下划线_, 是为了更好的可读性. 明确是两个字符串进行对比
_"$A" = _""
Windows
# 设置延迟变量,以便获取变量
setlocal enabledelayedexpansion
# CMD中无法直接把命令结果设置为变量,一般用for设置变量. 如结果为多行,则只会设置最后一行
# 使用+=的方式,把每行结果进行拼接.
for /F %%i in ('svnlook log "%REPOS%" -t "%TXN%"') do ( set MSG=!MSG!%%i_____)