Что такое хук pre-revprop-change в SVN и как его создать?

169

Я хотел отредактировать комментарий журнала в обозревателе хранилища и получил сообщение об ошибке, что для хранилища нет ловушки pre-revprop-change. Помимо наличия страшного имени, что такое хук pre-revprop-change и как его создать?

Manu
источник
16
теперь эта ссылка является второй, сразу после ссылки на этот вопрос :)
ULysses
Ссылка на приводит к ОЧЕНЬ устаревшей SVNBook 1.0. Текущий - 1.7 и 1.8 (ночные): svnbook.red-bean.com/en/1.8
bahrep

Ответы:

52

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

В дистрибутиве SVN есть шаблоны для различных ловушек, которые находятся в подкаталоге / hooks (* .tmpl, который вы должны редактировать и переименовывать в зависимости от вашей ОС, чтобы активировать).

Военнопленный
источник
2
Все инструкции находятся в шаблоне хука-скрипта. Если вам нужен хук для svnsyncзеркала, то скрипт по умолчанию нужно будет изменить, потому что он позволяет вносить изменения только в svn: log. Svnsync меняет больше, чем это, поэтому я просто вставляю exit 0туда, чтобы разрешить все изменения свойств (так как это зеркало только для меня).
Мэтт Коннолли
... затем сохраните его в pre-revprop-changeтом же каталоге и сделайте его исполняемым для пользователя веб-сервера (в Linux).
Матенг
209

Для Windows вот ссылка на примерный пакетный файл, который позволяет вносить изменения только в сообщение журнала (но не в другие свойства):

http://ayria.livejournal.com/33438.html

В основном скопируйте приведенный ниже код в текстовый файл, назовите его pre-revprop-change.batи сохраните в \hooksподкаталоге своего репозитория.

@ECHO OFF
:: Set all parameters. Even though most are not used, in case you want to add
:: changes that allow, for example, editing of the author or addition of log messages.
set repository=%1
set revision=%2
set userName=%3
set propertyName=%4
set action=%5

:: Only allow the log message to be changed, but not author, etc.
if /I not "%propertyName%" == "svn:log" goto ERROR_PROPNAME

:: Only allow modification of a log message, not addition or deletion.
if /I not "%action%" == "M" goto ERROR_ACTION

:: Make sure that the new svn:log message is not empty.
set bIsEmpty=true
for /f "tokens=*" %%g in ('find /V ""') do (
set bIsEmpty=false
)
if "%bIsEmpty%" == "true" goto ERROR_EMPTY

goto :eof

:ERROR_EMPTY
echo Empty svn:log messages are not allowed. >&2
goto ERROR_EXIT

:ERROR_PROPNAME
echo Only changes to svn:log messages are allowed. >&2
goto ERROR_EXIT

:ERROR_ACTION
echo Only modifications to svn:log revision properties are allowed. >&2
goto ERROR_EXIT

:ERROR_EXIT
exit /b 1
patmortech
источник
37
Могли бы связать с версией там stackoverflow.com/questions/6155/… . Я написал этот хук и опубликовал его на форуме SVN некоторое время назад. Я думаю, что я должен был поставить некоторые кредиты в комментариях крючка.
Филиберт Перусс
1
Я использую этот скрипт с VisualSVN 2.0.8 и TortoiseSVN 1.6.11, и он прекрасно работает.
Марк Биек
27
Вы можете редактировать хуки в VisualSVN, щелкнув правой кнопкой мыши имя своего репозитория на сервере VisualSVN и выбрав «Свойства ...». Вы увидите вкладку «Крючки». Там вы увидите различные типы доступных крючков. Выберите правильный, нажмите «Изменить» и вставьте в него вышеуказанный код. Надеюсь, что это помогает пользователям VisualSVN!
Чак Ле Батт
Сработало у меня отключение строки: если / я не "% action%" == "M", перейдите к ERROR_ACTION. Другой способ, он продолжал говорить, что разрешены только модификации.
Натан
6
Быстрый и грязный метод для Windows - создать пустой файл с именем hooks \ pre-revprop-change.bat
Бен Клаар
18

Для Linux, чтобы разрешить издание комментария журнала,

  • найдите файл pre-revprop-change.tmplв hooksкаталоге вашего хранилища
  • скопируйте файл в тот же каталог, переименовав его в pre-revprop-change
  • дать разрешение на выполнение файла (например, для пользователя сервера www-data)

Отредактировано: (благодаря Линде)

  • после этого вам, возможно, придется отредактировать скрипт, чтобы он возвращал выходное значение 0для вида правок, которые вы хотите разрешить.
Алоис Хеймер
источник
Этого недостаточно ... все еще нужно изменить значения выхода соответственно. Но я все равно нашел это полезным, как указатель на нужное место для поиска ... которого не хватало для некоторых других ответов, или для ответов на конкретные окна. Так что спасибо за это.
Линд
1
Я почти уверен, что в моей версии Ubuntu Linux было достаточно копирования и разрешения. Но я не знаю наверняка больше. Я отредактировал ответ соответственно. Спасибо.
Алоис Хеймер
Ну, я уверен, что это не сработало для меня как есть, когда я попробовал это 2 дня назад, и добавил этот комментарий. С редактированием, однако, этот ответ работает для меня.
Линд
11

Здесь приведена ссылка на вопрос переполнения стека со многими распространенными хуками. Типы хуков Subversion , включая исходный pre-revprop-changeхук для Windows, размещен здесь.

Вы должны обратиться туда, поскольку они могут улучшиться с течением времени.

Филиберт Перуссе
источник
7

Спасибо #patmortech

И я добавил ваш код, который «только тот же пользователь может изменить свой код».

:: Only allow editing of the same user.
for /f "tokens=*" %%a in ( 
'"%VISUALSVN_SERVER%\bin\svnlook.exe" author -r %revision% %repository%') do ( 
set orgAuthor=%%a
)
if /I not "%userName%" == "%orgAuthor%" goto ERROR_SAME_USER
Ясин
источник
4

Имя сценария перехвата не так страшно, если вам удастся расшифровать его: это перехват изменения свойств перед ревизией . Короче говоря, цель pre-revprop-changeхук-скрипта состоит в том, чтобы контролировать изменения неверсионных (ревизионных) свойств и отправлять уведомления (например, отправлять электронную почту при изменении свойства ревизии).

В Subversion есть 2 типа свойств:

  • версионные свойства (например, svn:needs-lockи svn:mime-type), которые можно установить для файлов и каталогов,
  • неверсионные (ревизионные) свойства (например, svn:logи svn:date), которые устанавливаются в ревизиях репозитория .

Версионные свойства имеют историю и могут управляться обычными пользователями, которые имеют доступ на чтение / запись к хранилищу. С другой стороны, неверсированные свойства не имеют никакой истории и служат главным образом для обслуживания. Например, если вы фиксируете ревизию, она сразу же получает svn:dateвремя UTC вашего коммита, svn:authorваше имя пользователя и svn:logсообщение журнала фиксации (если вы его указали).

Как я уже указывал, цель pre-revprop-changeхук-скрипта - контролировать изменения свойств ревизии. Вы не хотите, чтобы все, кто имеет доступ к репозиторию, могли изменять все свойства ревизии, поэтому изменение свойств ревизии по умолчанию запрещено. Чтобы позволить пользователям изменять свойства, вы должны создать pre-revprop-changeхук.

Самый простой крючок может содержать только одну строку: exit 0. Это позволит любому аутентифицированному пользователю изменять любое свойство ревизии, и его не следует использовать в реальной среде. В Windows вы можете использовать пакетный скрипт или скрипт на основе PowerShell для реализации некоторой логики в pre-revprop-changeловушке.

Этот скрипт PowerShell позволяет изменять svn:logтолько свойства и запрещает пустые сообщения журнала.

# Store hook arguments into variables with mnemonic names
$repos    = $args[0]
$rev      = $args[1]
$user     = $args[2]
$propname = $args[3]
$action   = $args[4]

# Only allow changes to svn:log. The author, date and other revision
# properties cannot be changed
if ($propname -ne "svn:log")
{
  [Console]::Error.WriteLine("Only changes to 'svn:log' revision properties are allowed.")
  exit 1
}

# Only allow modifications to svn:log (no addition/overwrite or deletion)
if ($action -ne "M")
{
  [Console]::Error.WriteLine("Only modifications to 'svn:log' revision properties are allowed.")
  exit 2
}

# Read from the standard input while the first non-white-space characters
$datalines = ($input | where {$_.trim() -ne ""})
if ($datalines.length -lt 25)
{
  # Log message is empty. Show the error.
  [Console]::Error.WriteLine("Empty 'svn:log' properties are not allowed.")
  exit 3
}

exit 0

Этот пакетный скрипт позволяет только пользователю "svnmgr" изменять свойства ревизии:

IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )

exit 1
goto :eof

:label1
exit 0
bahrep
источник
2

Для пользователей ПК: расширение .bat у меня не работает при использовании на Windows Server. Я использовал VisualSvn, как предложил Django Reinhardt, и он создал хук с расширением .cmd.

уведомлен
источник
0
  1. Перейдите в каталог репозитория SVN в подпапку "hooks", например, "D: \ SVN \ hooks \"
  2. создайте там пустой файл "pre-revprop-change.bat"
  3. в файле напишите "exit 0" (без "") и сохраните его
  4. наслаждаться :)

(Это решение, безусловно, имеет недостатки, так как ничего не проверено / запрещено. Но для моего случая - локального репо, которым пользуюсь только я - похоже, оно работает.)

Janis
источник