Как использовать svnlook в svn для поиска измененных элементов

Не могли бы вы, пожалуйста, направьте меня на svnlook работает ниже. Я хочу включить это в ловушку для предотвращения коммитов в теге /tags:

$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1

2 ответа

Решение

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

$SVNLOOK changed -t "$TXN" "$REPOS" покажет изменения в $REPOS что произошло в $TXN, Переменные оболочки должны быть установлены вами. Если вы посмотрите на pre-commit Сценарий, который поставляется с Subversion, вы увидите:

$TXN=$1
$REPO=$2

Выход из svnlook changed Команда выглядит так:

$ $SVNLOOK changed -t $TXN $REPOS
A   trunk/vendors/deli/
A   trunk/vendors/deli/chips.txt
A   trunk/vendors/deli/sandwich.txt
A   trunk/vendors/deli/pickle.txt
U   trunk/vendors/baker/bagel.txt
_U  trunk/vendors/baker/croissant.txt
UU  trunk/vendors/baker/pretzel.txt
D   trunk/vendors/baker/baguette.txt

В первом столбце указано, было ли что-то Urate, A dded или D eleted. Второй столбец относится к атрибутам.

Остальное - это имя файла, который был обработан. Ты это видишь baguette.txt был удален, и что свойство на croissant.txt был изменен, но сам файл не был обновлен.

Допустим, кто-то пытался изменить тег. Выход из svnlook changed будет выглядеть так:

$SVNLOOK changed -t $TXN $REPOS
U   tags/4.2.1/vendors/baker/bagel.txt

Команда grep выглядит так:

grep "^U\W.*\/tags\/" 

Это ищет строку, которая начинается с ^U значит, это было обновление. Затем он ищет строку, которая начинается с /tags, Хм... это может быть проблемой. Это не соответствует выводу svnlook changed команда.

Может быть, так должно быть:

grep -q "^U.[[\s+tags/"

Это будет соответствовать любой строке, которая начинается с U, возможно, за которым следует другой символ, затем пробел, а затем сразу же слово tags/,

Вы можете проверить это выражение.

&& является оператором списка Если выражение на левой стороне && выполняется успешно (т. е. возвращает нулевой код выхода), оператор с правой стороны будет выполнен. В противном случае утверждение справа не будет выполнено.

Таким образом, если ваш grep соответствует шаблону, который выглядит как кто-то обновил тег, это будет верно. Заявление на правой стороне && будет выполнен.

Таким образом,

/bin/echo "Cannot commit to tags!" 1>&2

будет выполнен. Это отправляется в STDERR, который будет отправляться клиенту Subversion, но только если код завершения ловушки перед фиксацией равен нулю.

Таким образом, следующая команда оператора списка exit 1 выполнится, если /bin/echo успешно. (Может и не быть, но обычно так и будет). При этом хук предварительной фиксации завершается с ненулевым кодом выхода, хук завершается ошибкой, и Cannot commit to tags! будет отправлен клиенту SVN для просмотра пользователем.

Нет абсолютно никаких причин, чтобы это утверждение выглядело так. Это почти эквивалентно и легче понять:

if $SVNLOOK changed -t $TXN $REPOS | grep -q "^U.[[\s+tags/"
then
    /bin/echo "Cannot commit to tags!" 1>&2"
    exit 1
fi
exit 0

В конце концов, вам нужно поместить это в сценарий оболочки под названием pre-commit в любом случае и есть переменные оболочки $SVNLOOK, $REPOS, а также $TXN установить в любом случае.

Причина, по которой это не совсем эквивалентно, состоит в том, что это не сработает, даже если /bin/echo выходит из строя.


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

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

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/**
access = read-only
users = @ALL

[file You are allowed to create a new tag, but you may not make any changes to it]
file = /tags/
access = add-only
users = @ALL

[file I can modify and delete tags]
file = /tags/**
access = read-write
users = jazzr

Посмотрите на крючок. Работает со стандартной установкой Perl 5.8.8 и выше. Не требует никаких других модулей. Однако, если вы используете LDAP или Active Directory для контроля доступа Subversion, вы можете установить Net::LDAP Модуль Perl и использование групп LDAP или Active Directory в хуке предварительной фиксации для контроля доступа.

$SVNLOOK changed -t "$TXN" "$REPOS" печатает все пути, которые были изменены. Смотрите здесь для получения дополнительной информации о параметрах: http://svnbook.red-bean.com/en/1.7/svn.ref.svnlook.c.changed.html

Затем список измененных путей передается по конвейеру в grep, который проверяет, изменилось ли что-либо, имеющее "/tags/" в пути, | grep "^U\W.*\/tags\/",

&& является оператором AND в оболочке. Если команда grep находит совпадение, она возвращает код состояния 0, который в этом случае эквивалентен "ИСТИНА", и команда после && будет выполнена, в противном случае это не так.

Часть после &&, /bin/echo "Cannot commit to tags!" 1>&2 запускает команду echo и записывает сообщение от 1 (стандартный выход) до &2, что является стандартной ошибкой. Если это удается, команда завершается с кодом состояния 1 exit 1, Это приведет к тому, что ваш скрипт-хук вернется с ненулевым кодом состояния, и ваш коммит не удастся вернуть "Can't commit to tags!" сообщение пользователю.

Другие вопросы по тегам