我在我的svn pre-commit钩子中添加一个逻辑来检查提交消息中是否存在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
答案 0 :(得分:2)
正则表达式不正确:
\(
在expr
中启动了一个捕获组,但您不需要捕获组来完成任务*
跟随模式中的\(
后,它会尝试匹配文字*
[QA]
匹配单个字符,可以是Q
或A
expr
的模式必须与字符串的开头匹配实际上,正则表达式与您的要求不符。
即使修复了以上几点,带有空格的模式QA
,“QA”也不会匹配这样的提交消息:
也就是说,您可能希望将QA与字边界相匹配,而不是带有空格的“QA”。
使用grep -w QA
很容易做到这一点。
正如你在评论中澄清的那样,你真的想要一个“Q”之前的空格。
在这种情况下,-w
的{{1}}标志不合适,
因为这需要图案两侧的单词边界。
还有另一种匹配单词边界的方法,
使用grep
进行单词开始,使用\<
进行单词结束。
所以要在“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
语句,而不是重定向到stderr
每个echo
if
echo ""
答案 1 :(得分:1)
这可能是您的正则表达式检查&#34;质量保证&#34;。
我发现使用此网站非常有用于测试正则表达式 - RegExr。
我把你的(* [&#34;&#34;] [QA] [&#34;&#34;])表达式放到网站上,当我看到它的细节时(一个标签链接)在页面底部),它会完全分解正则表达式所匹配的内容。据此,它说它正在寻找以下内容:
我将以下表达式放入其中 - ((QA))并且它能够在示例svn消息中找到匹配(TEST-117 QA测试消息)。