簡體   English   中英

SVN預提交鈎子邏輯

[英]SVN pre-commit hook logic

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

正則表達式不正確:

  • \\(expr啟動捕獲組,但您不需要捕獲組來完成任務
  • *跟隨\\(在模式中,它試圖匹配文字*
  • [QA]匹配單個字符,可以是QA
  • expr的模式必須匹配字符串的開頭

實際上,正則表達式與您的要求不符。

即使以上幾點是固定的,模式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”時出錯。

我發現使用這個網站非常有用於測試正則表達式 - RegExr

我把你的(* [“”] [QA] [“”])表達式放到網站上,當我查看它的細節(頁面底部的標簽鏈接)時,它會完全分解你的常規表達式會匹配。 據此,它說它正在尋找以下內容:

  1. 0或更多(
  2. 無論是“還是空間
  3. Q或A(不是兩者)
  4. 無論是“還是空間
  5. 結束a)

我將以下表達式放入其中 - ((QA))並且它能夠在示例svn消息中找到匹配(TEST-117 QA測試消息)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM