svn pre-commit 做提交前的校验,不合格的休想过关!
1.字数不得少于20个
2.必须提交 JIRA 编号

pre-commit

pre-commit 钩子在事务创建新版本之前运行

通常这个钩子是用来保护因为内容或位置(例如,你要求所有到一个特定分支的提交必须包括一个 bug 追踪的 ticket 号,或者是要求日志信息不为空)而不允许的提交

pre-commit 钩子返回非零值,提交会终止,提交事务被删除,所有 stderr 的输出会返回到客户端

中文乱码

首先复制一个模板过来,自带的模板是必须有提交备注才可以提交

# 进入 svn 仓库的 hooks 目录
cd /path/svn_repository/hooks

# 拷贝模板
cp pre-commit.tmpl pre-commit

# 给个可执行权限
chmod 755 pre-commit

可是中文提交的时候,这里获取到的提交备注是乱码的:

SVNLOOK=/usr/bin/svnlook
MSG=`$SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]"`

# 备注长度
MSG_LEN=`echo $MSG | wc -m`

# 提交的备注输出到指定文件里
echo "size:$MSG_LEN message:$MSG" >> /tmp/svn-pre-commit.log

把日志输出到指定文件后,查看日志文件:

# 查看日志
cat /tmp/svn-pre-commit.log

...... ?\229?\136?\183?\233?\152?\133?\232?\175?\187?\229?\140?\186?\233?\151?\180?\229?\129 .....

一番捣腾后,乱码的问题通过设置环境变量得到解决:

envSetting="env LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8"

SVNLOOK=/usr/bin/svnlook
MSG=`$envSetting $SVNLOOK log -t "$TXN" "$REPOS" | grep "[a-zA-Z0-9]"`

# 备注长度
MSG_LEN=`echo $MSG | wc -m`

# 提交的备注输出到指定文件里
echo "size:$MSG_LEN message:$MSG" >> /tmp/svn-pre-commit.log

备注长度统计不准

备注字数统计不准在中英文混合的时候尤其明显!!!

linux 可以使用 wc 来统计字符长度,有几种模式,常用的是按字符数或者按字节数或者行数统计

# man 手册
$ man wc
NAME
       wc - print newline, word, and byte counts for each file
SYNOPSIS
       wc [OPTION]... [FILE]...
       wc [OPTION]... --files0-from=F
DESCRIPTION
       Print newline, word, and byte counts for each FILE, and a total line 
       if more than one FILE is specified.  With no FILE, or when 
       FILE is -, read standard input.
       -c, --bytes
              print the byte counts
       -m, --chars
              print the character counts
       -l, --lines
              print the newline counts

通常使用:hello你好啊 按字符数计算应该是:8

# 按字符数统计,不是应该是8么,人家自动都+1了
echo "hello你好啊" | wc -m
9

# 按字节数统计,这里一个汉字占用3个字节,最后也自动+1了
echo "hello你好啊" | wc -c
15

通过多次svn提交实验,hook统计时不管使用 wc -m 或者 wc -c 都输出 15,就是这么神奇,也就是说字符统计不能用,而按字节统计,中英文混合的情况没法统计

实验的时候可以吧 exit 1 放到最后一行,这样每次提交都会不成功,然后看日志即可

字数精准统计(python)

本地环境:python 2.7.5

又是各种折腾,最终好使的是:len("hello你好啊".decode("UTF-8"));而嵌入 shell 脚本里时,这个也是折腾了许久,最后找到个法子:

MSG_LEN=`python -c "import sys; print len(sys.argv[1].decode(\"UTF-8\"))" "$MSG"`

总算能正常的统计了

匹配JIRA编号

使用 grep 正则匹配 JIRA 编号

比如: (WX|SD|YD|INTERFACE)-[0-9]+ 这里匹配4个项目的 JIRA 编号

# message content must matching target chars
JIRA_NUM=`echo "$MSG" | grep "\(WX\|SD\|YD\|INTERFACE\)-[0-9]\+" | wc -m`
if [ "$JIRA_NUM" -lt 2 ];
then
  echo -e "\"$MSG\" 没有对应项目的 JIRA 编号!" 1>&2
  exit 1
fi

完整版

完整版:

  • 限制提交备注不得少于 20 个字符(可中英文混合)
  • 必须匹配 JIRA 编号 (2017-08-12 更新)

IDEA SVN提交 效果图:(以最新的版本为准 122 # message content must matching target chars 123 JIRA_NUM=echo "$MSG" | grep "\(WX\|SD\|YD\|INTERFACE\)-[0-9]\+" | wc -m 124 if [ “$JIRA_NUM” -lt 2 ]; 125 then 126 echo -e “"$MSG" 没有对应项目的 JIRA 编号!” 1>&2 127 exit 1 128 fi 129 ``` 130 131 # 完整版 132 完整版: 133 - 限制提交备注不得少于 20 个字符(可中英文混合) 134 - 必须匹配 JIRA 编号 (2017-08-12 更新))


参考:



blog comments powered by Disqus

Published

10 August 2017

Tags