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

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

11 ответов

Решение

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

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

Для 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

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

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

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

  • после этого вам, возможно, придется отредактировать скрипт, чтобы он возвращал выходное значение 0 за вид правок, которые вы хотите разрешить.

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

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

Спасибо #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

Имя сценария перехвата не так страшно, если вам удастся расшифровать его: это перехват изменения свойств перед ревизией. Короче говоря, цель 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

Если вы хотите сохранить изменения в сообщениях журнала, используйте пакетный скрипт из ответа выше от @patmortech ( /questions/17514406/chto-takoe-huk-pre-revprop-change-v-svn-i-kak-ego-sozdat/17514423#17514423 ),
который скопировал скрипт с /questions/6332843/rasprostranennyie-tipyi-subversion-hooks/6332862#6332862,
и добавьте эти строки между if "%bIsEmpty%" == "true" goto ERROR_EMPTY и goto :eofbefore:

      set outputFile=%repos%\log-change-history.txt

echo User '%user%' changes log message in rev %rev% on %date% %time%.>>%outputFile%
echo ----- Old message: ----->>%outputFile%
svnlook propget --revprop %repos% svn:log -r %rev% >>%outputFile%
echo.>>%outputFile%
echo ----- New message: ----->>%outputFile%
for /f "tokens=*" %%g in ('find /V ""') do (echo %%g >>%outputFile%)
echo ---------->>%outputFile%
echo.>>%outputFile%

Будет создан текстовый файл log-change-history.txt в папке репо на сервере и добавьте каждое уведомление об изменении журнала.

Для меня это было самым простым на Windows Server: в VisualSVN щелкните правой кнопкой мыши свой репозиторий, затем выберите " Свойства"... и затем вкладку " Хуки ".

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

Мне нужно было сменить автора - это часто случается на удаленных компьютерах, используемых несколькими людьми, когда мы по ошибке регистрируемся, используя чужие сохраненные учетные данные.

Вот модифицированный скрипт вики сообщества, который нужно вставить:

@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 author to be changed, but not message ("svn:log"), etc.
if /I not "%propertyName%" == "svn:author" 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:author messages are not allowed. >&2
goto ERROR_EXIT

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

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

:ERROR_EXIT
exit /b 1

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

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

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

Как ранее отвечал Алоис Хелмер, вам нужно найти файл pre-revprop-change.tmpl в hooks каталог внутри репозитория SVN, в котором вы хотите разрешить редактирование комментариев к ревизии.

Для меня, чтобы создать копию с pre-revprop-change name было достаточно, хотя вы могли отредактировать его, чтобы только определенные пользователи могли изменять комментарии или некоторые другие потребности, которые у вас есть.

И затем вы должны предоставить обычные разрешения на чтение и выполнение, используя chmod 755 pre-revprop-change

Но обычных разрешений на выполнение недостаточно . Вам нужно предоставить гранты на выполнение Apache / HTTPD в SELinux для этого скрипта, подобного этому.

      chcon -t httpd_exec_t pre-revprop-change

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

      svnrdump: E175008: Revprop change blocked by pre-revprop-change hook (exit code 255) with no output.
Другие вопросы по тегам