Прежде всего:
- Печатаются только сообщения в STDERR и только если выход из сценария предварительной фиксации отличается от нуля.В противном случае распечатка не производится вообще.
- Сообщения коммита предназначены для всего коммита.Это означает, что вы не проверяете сообщение фиксации каждого отдельного файла.Это то же самое для них всех.
- Вы можете найти сообщение фиксации, посмотрев на свойство revision
svn:log
.Вам не нужно смотреть на сообщение.
Попробуйте это полностью непроверенное переписывание:
#!/bin/bash
REPOS="$1"
TXN="$2"
SVNLOOK="/usr/bin/svnlook"
AWK="/usr/bin/awk"
GREP="/bin/egrep"
SED="/bin/sed"
if "$SVNLOOK" changed -t $TXN | grep -q "^ *[UAM].*\.cpp$"
then
MESSAGE=$("$SVNLOOK" pget -t $TXN --revprop "$REPOS" svn:log)
if [ -z ${MESSAGE:16} ]
then
echo "Committing a *.cpp file, but didn't put a comment!" >&2
exit 1 #CPP, but message too short
else
exit 0 #CPP Files but message is long enough
fi
exit 0 #No CPP files
Вот некоторые изменения:
У вас былоэто:
CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A|M]" | $AWK '{print $2}' | $GREP \\.cpp$`
Вы проталкиваете его через grep, через awk, а затем через другой grep.Вместо этого, почему бы не сделать всю строку сразу?
"$SVNLOOK" changed -t $TXN "$REPOS" | $GREP -q "^ *[UAM].*\.cpp$"
-
[UAM]
означает либо U
, либо M
, либо A
.Вам не нужно |
между каждым. $GREP -q
означает, что делать спокойно.Если вы нашли что-то, он возвращает 0, в противном случае он возвращает 1. Вы можете поместить это непосредственно в ваш оператор if
без [...]
тестовых скобок. .*\.cpp$
означает, что япросматривая оставшуюся часть строки и видя, заканчивается ли она .\.cpp
Нет необходимости в grep|awk|grep
pipe. - Есть только одно сообщение в журнале, поэтому все, что мне нужно сделать, это проверить его один раз.Нет необходимости в петле.
- Обратите внимание, я использую
$(...)
вместо обратных тиков.Он делает то же самое, но его легче увидеть. - Я использую
${MESSAGE:16}
.В BASH это смещение моего сообщения на 16 символов.Если мое сообщение короче 16 символов, то ${MESSAGE:16}
будет пустым.Затем я могу использовать -z
, чтобы увидеть, является ли строка смещения пустой или нет.Сохраняет вас в трубу для sed, затем grep.
Посмотрите, работает ли это немного лучше.Фактически, запустите это как обычный сценарий оболочки вне хука.Вы можете изменить -t
на -r
и ввести различные номера ревизий.Таким образом, вы можете сначала проверить скрипт, прежде чем пытаться использовать его как ловушку.Затем убедитесь, что это называется pre-commit
и что у вас установлены разрешения rwxr-xr-x
.
Еще лучше, попробуйте мой pre-commit hook .Это проверено в бою, и может сделать больше.Это скрипт Perl, но он должен работать в любой версии Perl, превышающей 5.8, и, вероятно, Perl уже есть в вашей системе.Вы можете проверить длину svn: log, но мой скрипт-ловушка не позволяет вам указать его в зависимости от того, что зафиксировано.Тем не менее, почему вы все равно должны разрешить любое пустое сообщение о фиксации - был ли файл *.cpp
зафиксирован?