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

StackOverflow https://stackoverflow.com//questions/21003336

  •  20-12-2019
  •  | 
  •  

Вопрос

Не могли бы вы рассказать мне, как 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 с ненулевым кодом состояния, и ваш коммит не сможет вернуть «Не удается посвятить теги!» Сообщение пользователю.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top