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

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


person Manu    schedule 13.10.2008    source источник
comment
теперь эта ссылка вторая, сразу после ссылки на этот вопрос :)   -  person ULysses    schedule 05.08.2010
comment
Ссылка про ведет на ОЧЕНЬ устаревшую SVNBook 1.0. Текущий - 1,7 и 1,8 (по ночам): svnbook.red-bean.com/en/ 1.8   -  person bahrep    schedule 05.12.2013


Ответы (10)


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

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

person PW.    schedule 13.10.2008
comment
Все инструкции находятся в скрипте шаблона ловушки. Если вам нужен перехватчик для svnsync зеркала, то скрипт по умолчанию нужно будет изменить, потому что он позволяет изменять только svn: log. Svnsync меняет больше, поэтому я просто помещаю туда exit 0, чтобы разрешить все изменения свойств (поскольку это зеркало только для меня). - person Matt Connolly; 12.12.2010
comment
... затем сохраните его как pre-revprop-change в том же каталоге и сделайте его исполняемым для пользователя веб-сервера (в Linux). - person Mateng; 31.08.2012

Для 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
person Community    schedule 22.01.2009
comment
Можно было связать с версией там http://stackoverflow.com/questions/6155/common-types-of-subversion-hooks/68850#68850. Я написал эту ловушку и недавно разместил ее на форуме SVN. Думаю, мне следовало поставить несколько отметок в комментариях к крючку. - person Philibert Perusse; 10.07.2009
comment
Я использую этот сценарий с VisualSVN 2.0.8 и TortoiseSVN 1.6.11, и он отлично работает. - person Mark Biek; 10.08.2010
comment
Вы можете редактировать хуки в VisualSVN, щелкнув правой кнопкой мыши имя репозитория в VisualSVN Server и выбрав «Свойства» .... Вы увидите вкладку «Хуки». Там вы увидите различные типы доступных крючков. Выберите нужный, нажмите «Изменить» и вставьте в него приведенный выше код. Надеюсь, что это поможет пользователям VisualSVN! - person Chuck Le Butt; 01.09.2010
comment
У меня сработало отключение строки: if / I not% action% == M goto ERROR_ACTION. Иначе говоря, разрешены только модификации. - person Nathan; 23.03.2012
comment
Быстрый и грязный метод для Windows - создать пустой файл с именем hooks \ pre-revprop-change.bat. - person Ben Claar; 17.09.2013
comment
Это продолжает работать в VisualSVN 3.5.6 и TortoiseSVN 1.9.4. - person Enigma; 15.11.2016
comment
Я создал усовершенствование этого скрипта, которое сохраняет старое и новое сообщение журнала в текстовый файл: stackoverflow.com/a/66366955 - person Tobias Knauss; 25.02.2021

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

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

Отредактировано: (спасибо lindes)

  • после этого вам, возможно, придется отредактировать скрипт, чтобы вернуть значение выхода 0 для того типа редактирования, который вы хотите разрешить.
person Alois Heimer    schedule 15.09.2014
comment
Этого недостаточно ... все равно нужно изменить значения выхода соответствующим образом. Но я все равно нашел это полезным, как указатель на правильное место, где нужно искать ... чего не хватало в некоторых других ответах или которые давали ответы для Windows. Так что спасибо за это. - person lindes; 20.01.2016
comment
Я почти уверен, что в моей версии Ubuntu Linux копирования и разрешения было достаточно. Но я больше не знаю наверняка. Я соответствующим образом отредактировал ответ. Спасибо. - person Alois Heimer; 22.01.2016
comment
Что ж, я уверен, что у меня это не сработало как есть, когда я попробовал это 2 дня назад и добавил этот комментарий. Однако с редактированием этот ответ работает для меня. - person lindes; 22.01.2016

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

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

person Philibert Perusse    schedule 02.02.2011

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

Название скрипта перехвата не так страшно, если вам удастся его расшифровать: это перехватчик изменения свойства до ревизии. Короче говоря, цель _1 _ предназначен для управления изменениями неверсированных (ревизионных) свойств и для отправки уведомлений (например, для отправки электронного письма при изменении свойства ревизии).

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

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

Версионные свойства имеют историю и могут управляться обычными пользователями, имеющими доступ на чтение / запись к репозиторию. С другой стороны, неверсированные свойства не имеют истории и служат в основном для технического обслуживания. Например, если вы фиксируете ревизию, она немедленно получает svn:date с временем вашего коммита по всемирному координированному времени, 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
person bahrep    schedule 05.12.2013

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

person noti    schedule 12.09.2012

Если вы хотите сохранить изменения в сообщениях журнала, используйте пакетный скрипт из ответа выше от @patmortech (https://stackoverflow.com/a/468475),
который скопировал сценарий из https://stackoverflow.com/a/68850,
и добавьте эти строки между 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 в папке репо на сервере и будет добавлять каждое уведомление об изменении журнала.

person Tobias Knauss    schedule 25.02.2021

Для меня это был самый простой способ на 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
person Tom Andraszek    schedule 01.10.2020

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

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

person Janis    schedule 29.11.2019