【问题标题】:SVN pre-commit hook logicSVN 预提交钩子逻辑
【发布时间】:2017-12-19 20:13:48
【问题描述】:

我在我的 svn 预提交钩子中添加了一个逻辑,以检查提交消息中是否存在 QA(以空格开头的大写字母),然后提交应该失败。但它不起作用。请帮助我如何正确编写它。

REPOS="$1"
TXN="$2"

# Make sure that the log message contains some text.
SVNLOOK=/usr/bin/svnlook

LOGMSG=$($SVNLOOK log -t "$TXN" "$REPOS")

# check if any comment has supplied by the commiter
if [ -z "$LOGMSG" ]; then
echo "Your commit was blocked because it have no comments." 1>&2
exit 1
fi

#check minimum size of text
if [ ${#LOGMSG} -lt 15 ]; then
echo "Your Commit was blocked because the comments does not meet minimum length requirements (15 letters)." 1>&2
exit 1
fi

# get TaskID by regex
TaskID=$(expr "$LOGMSG" : '\([#][0-9]\{1,9\}[:][" "]\)[A-Za-z0-9]*')

# Check if task id was found. 
if [ -z "$TaskID" ]; then

echo ""  1>&2
echo "No Task id found in log message \"$LOGMSG\"" 1>&2
echo ""  1>&2
echo "The TaskID must be the first item on the first line of the log message."  1>&2
echo ""  1>&2
echo "Proper TaskID format--> #123- 'Your commit message'  " 1>&2
exit 1
fi

#Check that QA should not be present in log message.

QA=$(expr "$LOGMSG" : '\(*[" "][QA][" "]\)')
if [ "$QA" == "QA" ]; then
echo ""  1>&2
echo "Your log message \"$LOGMSG\" must not contain QA in upper case." 1>&2
echo ""  1>&2
exit 1
fi

【问题讨论】:

    标签: regex shell svn pre-commit-hook


    【解决方案1】:

    正则表达式不正确:

    • \(expr 中启动捕获组,但您的任务不需要捕获组
    • * 在模式中跟随\( 时,它会尝试匹配文字*
    • [QA] 匹配单个字符,可以是QA
    • expr 的模式必须从字符串的开头匹配

    事实上,正则表达式不符合您的要求。

    即使以上几点都已解决,QA, "QA" 周围有空格的模式也不会匹配这样的提交消息:

    • “修复 QA 的构建”
    • “在 QA 中暂时中断”
    • ...等等...

    也就是说,您可能希望将 QA 与周围的 单词边界 匹配,而不是周围有空格的“QA”。 使用grep -w QA 很容易做到这一点。

    正如您在评论中澄清的那样,您确实希望在“Q”之前有一个空格。 在这种情况下,grep-w 标志不适合, 因为这需要在模式的两边都有一个单词边界。 还有另一种匹配单词边界的方法, 使用\< 作为单词开头,\> 作为单词结尾。 所以要在“Q”前面留一个空格, 和“A”后面的单词边界,你可以写QA\>,像这样:

    if grep -q ' QA\>' <<< "$LOGMSG"; then
        echo
        echo "Your log message \"$LOGMSG\" must not contain QA in upper case."
        echo
        exit 1
    fi 1>&2
    

    注意其他一些改进:

    • 您可以重定向整个 if 语句,而不是将每个 echo 重定向到 stderr
    • 你可以简单地写echo而不是echo ""
    • 您可以在命令的退出代码上编写条件,而不是将命令的结果存储在临时变量中

    【讨论】:

    • 我有一个疑问,我只想检查提交消息 QA 中的任何地方是否存在 Q 之前的空格。那我该怎么办。但是,如果 Q 附加了任何东西,例如 _QA、-QA、|QA,那么它可以忽略并继续提交。
    • 我想阻止某些文件名提交。你能在同一个预提交挂钩中帮助我吗?
    【解决方案2】:

    这可能是您的正则表达式检查“QA”时出错。

    我发现使用此站点对于测试正则表达式非常有用 - RegExr

    我将您的 (*[" "][QA][" "]) 表达式放入网站,当我查看它的详细信息(页面底部的选项卡链接)时,它会完全崩溃您正则表达式将匹配的内容。由此可见,它正在寻找以下内容:

    1. 0 或更多(
    2. " 或空格
    3. Q 或 A(不能同时使用)
    4. " 或空格
    5. 以 ) 结尾

    我将以下表达式放入其中 - ( (QA) ),它能够在示例 svn 消息(TEST-117 QA 测试消息)中找到匹配项。

    【讨论】:

    • @Himanshu 我指的是这一行中的表达式:QA=$(expr "$LOGMSG" : '(*[" "][QA][" "])')。该正则表达式是匹配失败的地方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-22
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多