SVN hooks编写[Linux&Windows]

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_____)

:: 正则匹配规范1\2\3行.
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.batpre-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_____)

posted @ 2021-05-18 16:08  Jrri  阅读(319)  评论(0编辑  收藏  举报