svn 钩子开启

svn 钩子开启

项目背景

公司的Svn很多人在用,有不少人在作修改后不添加注释,所以需要强制用户填写注释。

  • 提交规范
    提交代码必须描述备注,备注格式必须如下:bug/task/doc-对应任务ID-问题描述(必须大于10个字)

  • 示例
    bug-0002-前端姓名不能为空的校验不生效。
    task-1111-前端增加电话号码长度必须等于11位的校验。
    doc-0001-业务接口说明文件(所有单独提交的文档,含升级清单、sql清单、配置文件清单、接口文档等等,不区分excel、xls、doc、ppt。不含.sql及.properties文件)。

操作步骤

(1).重命名svn主目录中hooks的pre-commit.tmpl文件为pre-commit,并添加可执行权限

    mv pre-commit.tmpl pre-commit
    chmod u+x pre-commit

(2).编辑pre-commit文件

    export LANG="zh_CN.UTF-8"
    REPOS="$1"
    TXN="$2"

    # Make sure that the log message contains some text.
    SVNLOOK=/usr/bin/svnlook
    #$SVNLOOK log -t "$TXN" "$REPOS" | \
    # grep "[a-zA-Z0-9]" > /dev/null || exit 1

    commit_type=$(svnlook changed -t "$TXN" "$REPOS")
    #以下后缀可以不填写注释
    except_list=".txt,.docx,.doc,.xls,.xlsx,.ppt,/"
    num=0
    for i in $(echo -e "$except_list" |sed "s/,/\n/g")
    do
        sum=$(echo -e "$commit_type" |grep "$i$" |wc -l)
        if test[ $sum -ne 0 ];then
            num=$(expr $num + 1 )
        fi
    done
    total=$(echo -e "$commit_type" |wc -l)

    if test[ $num -eq $total ];then
        exit 0
    fi

    $SVNLOOK log -t "$TXN" "$REPOS" > /tmp/aaa.txt

    #强制用户提交注释,注释格式要求:bug/task+数字(任务数字编号)+注释(大于10)
    TEMP_LENGTH=`$SVNLOOK log -t "$TXN" "$REPOS"|sed 's/\s*$//g'|sed 's/^\s*//g'| wc --chars` # 获取字符数量(包括换行符)
    TEMP_LINE=`$SVNLOOK log -t "$TXN" "$REPOS"| wc --lines` # 统计换行符
    LOGMSG_LENGTH=`expr $TEMP_LENGTH - $TEMP_LINE` # 真实字符数量
    task=$( $SVNLOOK log -t "$TXN" "$REPOS" |grep "^task\-[0-9]*[0-9]\-" |wc -l )
    bug=$( $SVNLOOK log -t "$TXN" "$REPOS" |grep "^bug\-[0-9]*[0-9]\-" |wc -l )
    emrg=$( $SVNLOOK log -t "$TXN" "$REPOS" |grep "^emrg\-[0-9]*[0-9]\-" |wc -l )
    getlaststring=$($SVNLOOK log -t "$TXN" "$REPOS"|grep -o "^task\-[0-9]*[0-9]\-\|^bug\-[0-9]*[0-9]\-\|^emrg\-[0-9]*[0-9]\-")
    content=$($SVNLOOK log -t "$TXN" "$REPOS"|sed 's/\s*$//g'|sed 's/^\s*//g')

    if test[ $LOGMSG_LENGTH -eq 0 ];then
        echo "【注释】$content" 1>&2
        echo "【注意】注释不能为空,请重新填写注释!!!" 1>&2
        echo "【格式】:bug/task/emrg-数字任务编号-注释(大于10)" 1>&2
        exit 1
    fi

    if test[ $task -eq 0 && $bug -eq 0 && $emrg -eq 0 ];then
        echo "【注释】$content" 1>&2
        echo "【注意】注释必须以bug或者task开头,后面加-和数字编号,请重新填写注释!!!" 1>&2
        echo "【格式】:bug/task/emrg-数字任务编号-注释(大于10)" 1>&2
        exit 1
    fi

    commemt=$($SVNLOOK log -t "$TXN" "$REPOS"|sed 's/\s*$//g'|sed 's/^\s*//g'|sed "s/^$getlaststring//g"| wc --chars)
    commemt_line=$($SVNLOOK log -t "$TXN" "$REPOS" |sed "s/^$getlaststring//g"|wc --lines)
    commemt_length=$( expr $commemt - $commemt_line)

    if test "$commemt_length" -lt 10 ;
    then
        echo "【注释】$content" 1>&2
        echo "【注意】注释必须超过10个字符,请重新填写注释!!!" 1>&2
        echo "【格式】:bug/task/emrg-数字任务编号-注释(大于10)" 1>&2
        exit 1
    fi

    # Check that the author of this commit has the rights to perform
    # the commit on the files and directories being modified.
    #commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1

    # All checks passed, so allow the commit.
    exit

存在问题

* pre-commit等钩子有做一些检查,如果有问题就echo错误信息,但出错信息是中文的,svn客户端无法显示,提示如下

Error output could not be translated from the native locale to UTF-8.

我们尝试过以下方法,但都没有解决

  • 修改pre-commit的编码,修改LANG

    export LANG=zh_CN.UTF-8
    export LC_ALL=zh_CN.UTF-8

  • 修改Apache的编码

    AddDefaultCharset UTF-8

  • 采用http发布,而不是https

结论:网上的解决方案只对svn://这种直接用svnserve发布出来的仓库才有效

解决方案

Subversion 1.8特性

SVNUseUTF8 On

它的作用就是使得Apache的mod_dav_svn模块,在和pre-commit等钩子通讯的时候,使用utf-8编码,可以参考mod_dav_svn

(1)升级

我们系统是CentOS 6.2,比较简单,有个第三方,走了Subversion
1.8的rpm包,yum即可,主要是更新了2个rpm包

* subversion-1.8.15-1.x86_64
* mod_dav_svn-1.8.15-1.x86_64

(2)具体升级操作

cat > /etc/yum.repos.d/wandisco-svn.repo <<EOF

[WandiscoSVN]

name=Wandisco SVN Repo

baseurl=https://opensource.wandisco.com/centos/6/svn-1.8/RPMS/\$basearch/

enabled=1

gpgcheck=0

EOF

yum install subversion -y

(3)修改httpd.conf并重启httpd

<IfModule mod_dav_fs.c>

    # Location of the WebDAV lock database.

    DAVLockDB /var/lib/dav/lockdb

    SVNUseUTF8 On

</IfModule>

/etc/init.d/httpd graceful

(4)升级后的测试 需要做些测试,确保升级后不会有问题,测试列表如下

* commit
* update
* log
* merge
* copy签出版本

(5)注意问题
服务器版本是1.8,如果客户端是1.6,则只能checkout,不能update,1.7没有问题,建议客户端至少1.8

文章作者 明哥
文章地址 https://www.pvcreate.com/index.php/archives/28/
创建时间 2017-04-24
关注订阅 微信订阅号
开源项目 https://gitee.com/lookingdreamer
工具市场 https://gitee.com/lookingdreamer/SPPPOTools
工作日志