Как использовать svnlook в svn для поиска измененных элементов
Вопрос
Не могли бы вы рассказать мне, как svnlook
работает ниже.Я хочу включить это в крючок, чтобы предотвратить фиксацию в теге под /tags
:
$SVNLOOK changed -t "$TXN" "$REPOS" | grep "^U\W.*\/tags\/" && /bin/echo "Cannot commit to tags!" 1>&2 && exit 1
Решение
Перехват 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
Первая колонка - это вопрос о том, было ли что-то Uразглагольствованный, Added, или Dвозбужденный.Второй столбец относится к атрибутам.
Остальное - это имя файла, с которым были предприняты действия.Вы можете это видеть 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
соответствует шаблону, который выглядит так, будто кто-то обновил тег, это будет true.Заявление на правой стороне страницы &&
будет исполнено.
Таким образом,
/bin/echo "Cannot commit to tags!" 1>&2
будет исполнено.Это отправляется в STDERR, который будет отправлен клиенту Subversion, но только в том случае, если код выхода перехвата предварительной фиксации равен нулю.
Таким образом, следующая команда оператора list 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
.Это приведет к возвращению вашего скрипта Hook с ненулевым кодом состояния, и ваш коммит не сможет вернуть «Не удается посвятить теги!» Сообщение пользователю.