Я хотел отредактировать комментарий журнала в обозревателе хранилища и получил сообщение об ошибке, что для хранилища нет ловушки pre-revprop-change. Помимо наличия страшного имени, что такое хук pre-revprop-change и как его создать?
Я хотел отредактировать комментарий журнала в обозревателе хранилища и получил сообщение об ошибке, что для хранилища нет ловушки pre-revprop-change. Помимо наличия страшного имени, что такое хук pre-revprop-change и как его создать?
Ответы:
По сути, это сценарий, который запускается до изменения неверсионного свойства в хранилище, чтобы вы могли более точно управлять тем, что происходит в вашем хранилище.
В дистрибутиве SVN есть шаблоны для различных ловушек, которые находятся в подкаталоге / hooks (* .tmpl, который вы должны редактировать и переименовывать в зависимости от вашей ОС, чтобы активировать).
svnsync
зеркала, то скрипт по умолчанию нужно будет изменить, потому что он позволяет вносить изменения только в svn: log. Svnsync меняет больше, чем это, поэтому я просто вставляю exit 0
туда, чтобы разрешить все изменения свойств (так как это зеркало только для меня).
pre-revprop-change
том же каталоге и сделайте его исполняемым для пользователя веб-сервера (в Linux).
Для 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
(Это решение, безусловно, имеет недостатки, так как ничего не проверено / запрещено. Но для моего случая - локального репо, которым пользуюсь только я - похоже, оно работает.)