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

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

  •  10-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

В дистрибутиве 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)

Отредактированный: (спасибо линдесу)

  • после этого вам, возможно, придется отредактировать скрипт, чтобы вернуть значение exit равное 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

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

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