为了应对client经常漏上传meta文件的情况,特在svn的hook脚本上加上检查机制
目标:当指定目录add或者delete源文件时,一定要同时操作源文件对应的meta文件
同样的通过awk来处理主要逻辑,需要编辑pre-commit.bat
::/
@echo off
setlocal
set REPOS=%1
set TXN=%2
::svnlook log %REPOS% -t %TXN% | awk "{if(NR==1){str=$0}else{str=str\" \"$0}}END{print str}" 1>&2
rem 检查上传文件类型
svnlook changed %REPOS% -t %TXN% | awk "{if(($1==\"A\" || $1==\"D\") && ($2 ~/Client\/Assets/)){ if($2 ~/meta$/){m_pos=index($2,\"meta\");id=substr($2,0,m_pos-2);m_arr[id]=1;}else{o_arr[$2]=1;}}}END{for(i in o_arr){if(m_arr[i] != 1){print i}}}" | awk "BEGIN{str=\"\"}{if(NR==1){str=$0}else{str=str\" \"$0}}END{if(str != \"\")print str}" | findstr "..." > nul
if %errorlevel% EQU 0 goto :err_action2
::rem 保证输入8个字符
::svnlook log %REPOS% -t %TXN% | findstr "........" > nul
::if %errorlevel% gtr 0 goto :err_action
rem 按照格式输入
svnlook log %REPOS% -t %TXN% | awk "{if(NR==1){str=$0}else{str=str\" \"$0}}END{print str}" | grep -E "^\[.{3}.*\].{10}.*" > nul
if %errorlevel% gtr 0 goto :err_action1
rem 过滤空格字符
svnlook log %REPOS% -t %TXN% | findstr /ic:" " > nul
if %errorlevel% gtr 0 goto :success
:::err_action
::echo 输入的注释不少于 8 个字符说明(或 4 个汉字) >&2
goto :err_exit
:err_action2
echo 请确保源文件与meta文件同时操作 1>&2
goto :err_exit
:err_action1
echo 输入的注释要遵照格式:[模块名]操作日志,其中模块名不少于4个字符(或2个汉字),操作日志不少于10个字符(或5个汉字) >&2
goto :err_exit
:err_exit
exit 1
:success
exit 0
::/
注意的一点: 当检查到有资源对应的meta文件没有上传时,awk能做的就是将所有这类文件名打印出来,这种情况下该如何转成成errorlevel来做错误提示呢?思路转换一下,如果打印出了字符串,说明有错误,如果打印的字符串为空,说明没有错误。findstr如果找到输出至少包含3个字符串,说明是错误的,而此时的%errorlevel对应的是0
目标:当指定目录add或者delete源文件时,一定要同时操作源文件对应的meta文件
同样的通过awk来处理主要逻辑,需要编辑pre-commit.bat
::/
@echo off
setlocal
set REPOS=%1
set TXN=%2
::svnlook log %REPOS% -t %TXN% | awk "{if(NR==1){str=$0}else{str=str\" \"$0}}END{print str}" 1>&2
rem 检查上传文件类型
svnlook changed %REPOS% -t %TXN% | awk "{if(($1==\"A\" || $1==\"D\") && ($2 ~/Client\/Assets/)){ if($2 ~/meta$/){m_pos=index($2,\"meta\");id=substr($2,0,m_pos-2);m_arr[id]=1;}else{o_arr[$2]=1;}}}END{for(i in o_arr){if(m_arr[i] != 1){print i}}}" | awk "BEGIN{str=\"\"}{if(NR==1){str=$0}else{str=str\" \"$0}}END{if(str != \"\")print str}" | findstr "..." > nul
if %errorlevel% EQU 0 goto :err_action2
::rem 保证输入8个字符
::svnlook log %REPOS% -t %TXN% | findstr "........" > nul
::if %errorlevel% gtr 0 goto :err_action
rem 按照格式输入
svnlook log %REPOS% -t %TXN% | awk "{if(NR==1){str=$0}else{str=str\" \"$0}}END{print str}" | grep -E "^\[.{3}.*\].{10}.*" > nul
if %errorlevel% gtr 0 goto :err_action1
rem 过滤空格字符
svnlook log %REPOS% -t %TXN% | findstr /ic:" " > nul
if %errorlevel% gtr 0 goto :success
:::err_action
::echo 输入的注释不少于 8 个字符说明(或 4 个汉字) >&2
goto :err_exit
:err_action2
echo 请确保源文件与meta文件同时操作 1>&2
goto :err_exit
:err_action1
echo 输入的注释要遵照格式:[模块名]操作日志,其中模块名不少于4个字符(或2个汉字),操作日志不少于10个字符(或5个汉字) >&2
goto :err_exit
:err_exit
exit 1
:success
exit 0
::/
注意的一点: 当检查到有资源对应的meta文件没有上传时,awk能做的就是将所有这类文件名打印出来,这种情况下该如何转成成errorlevel来做错误提示呢?思路转换一下,如果打印出了字符串,说明有错误,如果打印的字符串为空,说明没有错误。findstr如果找到输出至少包含3个字符串,说明是错误的,而此时的%errorlevel对应的是0