Второй крюк предварительной фиксации Subversion не работает - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь добавить второй сценарий предварительной фиксации, и кажется, что он не срабатывает, когда я помещаю его в ловушку.

Первый скрипт в основном блокирует файл от редактирования.Второй сценарий просматривает путь и сравнивает строковое значение с файлом, который передается, и, если он совпадает, он выдаст ошибку.

#!/bin/sh
REPOS="$1"
TXN="$2"
GREP=/bin/grep
SED=/bin/sed
AWK=/usr/bin/awk
SVNLOOK=/usr/bin/svnlook
AUTHOR=`$SVNLOOK author -t "$TXN" "$REPOS"`

if [ "$AUTHOR" == "testuser" ]; then
exit 0
fi
if [ "$AUTHOR" == "" ]; then
exit 0
fi

CHANGED=`$SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A]" | $AWK '{print $2}'`
COMPARE=`$SVNLOOK diff -t "$TXN" "$REPOS"`
#Operation 001 Beginning
#Restrict users from commiting against testfile
for PATH in $CHANGED
do

if [[ "$PATH" == *path/to/file/testfile.txt ]]; then

    #allow testuser to have universal commit permissions in this path.
    if [ "$AUTHOR" == "testuser" ]; then
        exit 0
    else
        #User is trying to modify testfile.txt
         echo "Only testuser can edit testfile.txt." 1>&2
         exit 1
    fi
fi

done
#Operation 001 Completed

#Operation 002 Beginning
#Restrict commits based on string found in file
for PATH in $COMPARE
do

if [[ "$PATH" == *path/to/look/at/only/* ]]; then

$SVNLOOK diff -t "$TXN" "$REPOS" | egrep 'string1|string2|string3' > /dev/null && { echo "Cannot commit using string1, string2 or string3 in files trying to commit" 1>&2; exit 1; }
else exit 0;

fi
done
#Operation 002 Completed

Он продолжает успешно фиксировать файл, даже если строка присутствует.Есть идеи, почему бы это не поймать?

1 Ответ

0 голосов
/ 31 мая 2018

Ваш первый тест:

if [ "$AUTHOR" == "testuser" ]; then
exit 0
fi

Вызывает прерывание (с нулевым значением выхода), если AUTHOR равен testuser!

Итак, ваш второй тест:

 if [ "$AUTHOR" == "testuser" ]; then
        exit 0
 else
        #User is trying to modify testfile.txt
         echo "Only testuser can edit testfile.txt." 1>&2
         exit 1
 fi

Это не нужно, потому что на этом этапе AUTHOR не testuser!

И, возможно, будет лучше вместо вашего цикла for:

if $SVNLOOK changed -t "$TXN" "$REPOS" | $GREP "^[U|A]" | $AWK '{print $2}' | grep -q 'path/to/file/testfile.txt'; then
  echo "Only testuser can edit testfile.txt." 1>&2
  exit 1
fi

Тест if [[ "$PATH" == *path/to/file/testfile.txt ]]; thenне работает, потому что этот тест не понимает переменные оболочки (и лучше заключить в кавычки из-за *).

И я бы заменил часть

for PATH in $COMPARE
do

if [[ "$PATH" == *path/to/look/at/only/* ]]; then

на

if echo ${COMPARE} | grep -q "path/to/look/at/only"; then
...