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