Выполнение скрипта SVN Pre-commit - PullRequest
0 голосов
/ 21 декабря 2011

вот мой хук-скрипт, который должен ограничивать коммит для cpp файла без комментариев. Но он не может быть выполнен ... любые идеи

        #!/bin/bash

        REPOS="$1" 
        TXN="$2"

        SVNLOOK="/usr/bin/svnlook"
        AWK="/usr/bin/awk"
        GREP="/bin/egrep"
        SED="/bin/sed"

       CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A|M]" | $AWK '{print                  
       $2}' | $GREP \\.cpp$`

       for FILE in $CHANGED
       do 
        MESSAGE=`$SVNLOOK log -t "$TXN" "$REPOS" "$FILE" | sed 's/ *//g' |$GREP ".\              
       {16,\}"` 
       if [ $? -ne 0 ] 
       then 
       echo 1>&2 
       echo "***********************************" 1>&2 
       echo `echo "$MESSAGE"` 1>&2 
       echo "***********************************" 1>&2 
       exit 1 
       fi 
       done

Ответы [ 2 ]

0 голосов
/ 11 апреля 2012

Прежде всего:

  • Печатаются только сообщения в 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 зафиксирован?

0 голосов
/ 23 декабря 2011

Убедитесь, что у сценария предварительной фиксации есть разрешение на выполнение (chmod +x pre-commit)

Кроме того, убедитесь, что скрипт действительно выполняется, но вы не понимаете, что это так. Обратите внимание, что эхо-сообщения передаются клиенту только в случае возникновения ошибки, и вы завершаете работу с ненулевым кодом ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...