Как использовать 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!" сообщение пользователю.