• 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_____)
    
    :: 正则匹配规范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.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_____)
    
    
  • 相关阅读:
    Delphi文件操作读文件写文件操作文件
    delphi7 开发ActiveX的学习备忘录
    delphi延时函数详细说明
    delphi如何保存和读取utf8的文本文件
    Delphi中线程的释放介绍[转]
    python IsWindowEnabled遍历windows的所有窗口并输出窗口标题
    如何把 XML 文件显示为 HTML 表格
    delphi把Frame嵌入一个Form
    Delphi如何实现内存共享
    about linux vps
  • 原文地址:https://www.cnblogs.com/jrri/p/14781427.html
Copyright © 2020-2023  润新知