Логика хука перед фиксацией SVN

Я добавляю логику в свой крючок предварительной фиксации 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

person Himanshu    schedule 14.07.2017    source источник


Ответы (2)


Регулярное выражение неверно:

  • \( запускает группу захвата в expr, но вам не нужна группа захвата для вашей задачи
  • Когда * следует за \( в шаблоне, он пытается соответствовать буквальному *
  • [QA] соответствует одному символу, который может быть Q или A
  • Шаблон expr должен совпадать с начала строки

Как бы то ни было, регулярное выражение не соответствует вашему требованию.

Даже если вышеуказанные моменты исправлены, шаблон QA, "QA" с пробелами вокруг него, не будет соответствовать сообщениям фиксации, подобным этому:

  • "Исправить сборку QA"
  • «Неисправен в QA, временно»
  • ... и так далее...

То есть вместо «QA» с пробелами вокруг вы, вероятно, захотите сопоставить QA с границами слов вокруг. Это легко сделать с помощью grep -w QA.

Как вы пояснили в комментарии, вам действительно нужен пробел перед «Q». В этом случае флаг -w для 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 "" можно написать просто echo
  • Вместо того, чтобы сохранять результат команды во временной переменной, вы можете написать условные обозначения в коде выхода команд.
person janos    schedule 15.07.2017
comment
У меня есть одно сомнение, я только хочу проверить, существует ли где-нибудь в сообщении о коммите QA пробел непосредственно перед Q. Тогда что мне делать. Но если к Q прикреплено что-то вроде _QA, -QA, |QA, тогда он может игнорировать и продолжить фиксацию. - person Himanshu; 15.07.2017
comment
я хочу заблокировать определенные имена файлов от фиксации. не могли бы вы помочь мне с этим в том же крючке перед фиксацией. - person Himanshu; 31.07.2017

Это может быть ошибка проверки вашего регулярного выражения на "QA".

Я считаю использование этого сайта очень полезным для тестирования выражений регулярных выражений - RegExr.

Я поместил ваше (*[" "][QA][" "]) выражение на сайт, и когда я посмотрел на его детали (ссылка на вкладку в нижней части страницы), оно разбило именно то, что вы обычно выражение будет соответствовать . Исходя из этого, он говорил, что искал следующее:

  1. 0 или больше (
  2. Либо ", либо пробел
  3. Либо Q, либо A (не оба)
  4. Либо ", либо пробел
  5. Окончание на а)

Я поместил в него следующее выражение - ( (QA) ), и он смог найти совпадение в образце сообщения svn (тестовое сообщение TEST-117 QA).

person David Liljeblad    schedule 14.07.2017
comment
@Himanshu Я имею в виду выражение в этой строке: QA=$(expr $LOGMSG : '(*[ ][QA][ ])'). Именно в этом регулярном выражении совпадение может быть неудачным. - person David Liljeblad; 15.07.2017