开发svn hook阻止svn仓库特定分支的commit log中不包含关键字的提交

7 篇文章 0 订阅
使用批处理脚本实现开发svn hook(pre-commit) 阻止svn仓库特定分支的commit log中不包含关键字的提交(批处理脚本+shell脚本实现)
  • 实现逻辑
    1)使用svnlook 的dirs-changed子命令去获取当前仓库的提交事务中子文件发生变化的目录,
    2)如果发现该路径下有该子路径则将DIR_FOUND标志变量设置为true,接下来对该子路径进行判断,
    3)如果发现标志的值是true,则在此子路径上使用svnlook log命令获取当前仓库提交事务的log中是否包含提交关键字,如果没有则限制提交。
  • 想让svn hook对svn仓库多个分支进行限制的实现逻辑
    1)如果想设置多个子路径,则可以在用svnlook 的dirs-changed子命令的这个for循环中增加一条子路径判断语句,
    2)并增加一个DIR_FOUND1标志变量,并在下方的if条件中增加一个DIR_FOUND1标志变量是否为true的判断即可。
    注意:svn hook默认为整个仓库的根目录起效,我们如果只想对仓库的某几个分支起效,则可这样去处理。
  1. windows环境下使用批处理脚本实现:
@echo off
setlocal

set REPOS=%1
set TXN=%2
set SVNLOOK=/usr/bin/svnlook
set KEYWORD=SOP-
set SEARCH_PATH=branches/dev
set SEARCH_PATH1=trunk
set FOUND=false
set DIR_FOUND=false
set DIR_FOUND1=false

for /f "delims=" %%G in ('svnlook dirs-changed -t %TXN% %REPOS%') do (
    echo %%G | findstr "%SEARCH_PATH%" >nul && set "DIR_FOUND=true"
    echo %%G | findstr "%SEARCH_PATH1%" >nul && set "DIR_FOUND1=true"
)

if not "%DIR_FOUND%"=="true" if not "%DIR_FOUND1%"=="true" (
    exit 0
)

for /f "delims=" %%G in ('('svnlook  log -t %TXN% %REPOS%') do (
    echo %%G | findstr "%KEYWORD%" >nul && set "FOUND=true"
)

if not "%FOUND%"=="true" (
    echo The commit message does not contain '%KEYWORD%' keyword. >&2
    exit 1
)

exit 0
  1. 在Linux下使用shell脚本实现:

REPOS="$1"
TXN="$2"
SVNLOOK=/usr/bin/svnlook
KEYWORD="SOP-"
SEARCH_PATH="branches/dev"
SEARCH_PATH="trunk"
DIR_FOUND=false
DIR_FOUND1=false
FOUND=false

for dir in `$SVNLOOK dirs-changed -t "$TXN" "$REPOS"`; do
    echo "$dir" | grep -q "$SEARCH_PATH" && DIR_FOUND=true
    echo "$dir" | grep -q "$SEARCH_PATH1" && DIR_FOUND1=true
done

if [ "$DIR_FOUND" != "true" ] && [ "$DIR_FOUND1" != "true" ]; then
    exit 0
fi

for log in `$SVNLOOK log -t "$TXN" "$REPOS"`; do
    echo "$log" | grep -q "SOP-[0-9]\+" && FOUND=true
done

if [ "$FOUND" != "true" ]; then
    echo "The commit message does not contain '$KEYWORD' keyword." >&2 
    exit 1
fi

exit 0

注意1) : shell中grep使用正则表达式进行任务号grep DEVOPS-[0-9]时,使用+时需要在前边增加反斜线例如
(使用基本的正则表达式元字符?、+、11、(和)时都需要在前边加) ; 也可以使用grepE"SSP[0-9]+"进行任务号匹配.
注意2):在进行路径填写时需要用/,例如branches/dev; (windows批处理下路径若使用branches\dev会造成svn hook失效)

接下来考虑在pre-commit hook script中增加对其他路径未包含任务号提交限制的实现

  • 想让svn hook对svn仓库多个分支进行限制的实现逻辑:可以在该for循环中增加一个路径匹配判断语句,并增加一个DIR_FOUND1标志变量:
for dir in `SSVNLOOK dirs-changed -t "STKN" "$REPOS": do
    echo "$dir"grep"$SEARCH PATH" DIR_FOUND=true
    echo "$dir"grep"$SEARCH_PATH1" DIR_FOUND1=true
done

然后在这个for循环的if语句中增加对DIR_FOUND1是否为true的判断即可实现svn hook对多个分支起效:

if["$DIR FOUND" exit"true"] &&[ "$DIR_FOUND1" != "true" ]; then
   exit 0
fi
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值