Regex SVN预提交钩子逻辑

Regex SVN预提交钩子逻辑,regex,shell,svn,pre-commit-hook,Regex,Shell,Svn,Pre Commit Hook,我在我的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

我在我的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

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

我发现使用这个网站测试正则表达式非常有用-

我把你的(*[“”][QA][“”])表达式放在网站上,当我查看它的详细信息(页面底部的选项卡链接)时,它会完全分解你的正则表达式所匹配的内容。由此看来,它是在寻找以下方面:

  • 0或更多(
  • 要么是一个“或一个空格”
  • Q或A(不是两者都有)
  • 要么是一个“或一个空格”
  • 以a结尾)

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

    正则表达式不正确:

    • \(
      expr
      中启动捕获组,但您的任务不需要捕获组
    • 当模式中的
      *
      跟在
      \(
      之后时,它会尝试匹配文本
      *
    • [QA]
      匹配单个字符,可以是
      Q
      a
    • expr
      的模式必须从字符串开始匹配
    事实上,正则表达式不符合您的要求

    即使以上几点是固定的,模式
    QA
    ,“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
    
    • “修复QA的构建”
    • “暂时中断QA”
    • ……等等
    也就是说,您可能希望将QA与周围的单词边界匹配,而不是将“QA”与周围的空格匹配。 使用
    grep-wqa
    很容易做到这一点

    正如您在评论中所阐明的,您确实希望在“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
    

    如果grep-q'QA\>@Himanshu,我指的是这一行中的表达式:QA=$(expr“$LOGMSG”:“(*[”“][QA][”“])”。正则表达式可能是匹配失败的地方。我有一个疑问,我只想检查提交消息QA中的任何地方是否在Q前面有空格。那么我应该怎么做。但是如果Q附加了像QA,-QA,| QA之类的内容,那么它可以忽略并继续提交。我想阻止某些文件名提交。你能请在这个预提交钩子中帮助我。