Nazwa skryptu przechwytującego nie jest tak przerażająca, jeśli uda ci się go odszyfrować: jest to punkt zaczepienia zmiany właściwości przed rewizją . Krótko mówiąc, celem pre-revprop-changeskryptu przechwytującego jest kontrolowanie zmian niewersjonowanych (rewizji) właściwości i wysyłanie powiadomień (np. Wysyłanie wiadomości e-mail w przypadku zmiany właściwości wersji).
Istnieją 2 typy właściwości w Subversion:
- wersjonowane właściwości (np.
svn:needs-locki svn:mime-type), które można ustawić w plikach i katalogach,
- niewersjonowane (rewizja) właściwości (np.
svn:logi svn:date), które są ustawiane dla wersji repozytorium .
Wersjonowane właściwości mają historię i mogą być manipulowane przez zwykłych użytkowników, którzy mają dostęp do odczytu / zapisu w repozytorium. Z drugiej strony, niewersjonowane nieruchomości nie mają historii i służą głównie do celów konserwacyjnych. Na przykład, jeśli zatwierdzisz wersję, otrzyma ona natychmiast svn:dateczas UTC zatwierdzenia, svn:authortwoją nazwę użytkownika i svn:logwiadomość dziennika zmian (jeśli ją podałeś).
Jak już wspomniałem, celem pre-revprop-changeskryptu przechwytującego jest kontrolowanie zmian właściwości wersji. Nie chcesz, aby każdy, kto ma dostęp do repozytorium, mógł modyfikować wszystkie właściwości wersji, więc zmiana właściwości wersji jest domyślnie zabroniona. Aby umożliwić użytkownikom zmianę właściwości, musisz utworzyć pre-revprop-changepunkt zaczepienia.
Najprostszym hak może zawierać tylko jedną linię: exit 0. Pozwoli to każdemu uwierzytelnionemu użytkownikowi na zmianę dowolnej właściwości wersji i nie powinno być używane w rzeczywistym środowisku. W systemie Windows można użyć skryptu wsadowego lub skryptu opartego na programie PowerShell, aby zaimplementować pewną logikę w pre-revprop-changepodpięciu.
Ten skrypt programu PowerShell umożliwia svn:logtylko zmianę właściwości i odrzuca puste komunikaty dziennika.
# 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
Ten skrypt wsadowy pozwala tylko użytkownikowi „svnmgr” na zmianę właściwości wersji:
IF "%3" == "svnmgr" (goto :label1) else (echo "Only the svnmgr user may change revision properties" >&2 )
exit 1
goto :eof
:label1
exit 0