Co to jest punkt zaczepienia przed zmianą obrotów w SVN i jak go utworzyć?


168

Chciałem edytować komentarz dziennika w przeglądarce repozytorium i otrzymałem komunikat o błędzie, że dla repozytorium nie istnieje hak przed zmianą proponu. Oprócz posiadania przerażającej nazwy, czym jest hak przed zmianą obrotów i jak go utworzyć?


16
teraz ten link jest drugi, zaraz po linku do tego pytania :)
ULysses

Link o prowadzi do BARDZO przestarzałego SVNBook 1.0. Obecny to 1.7 i 1.8 (nightly): svnbook.red-bean.com/en/1.8
bahrep

Odpowiedzi:


52

Zasadniczo jest to skrypt uruchamiany przed modyfikacją niewersjonowanej właściwości w repozytorium, dzięki czemu można dokładniej zarządzać tym, co dzieje się w repozytorium.

W dystrybucji SVN znajdują się szablony dla różnych hooków, zlokalizowane w podkatalogu / hooks (* .tmpl, które musisz edytować i zmieniać nazwę w zależności od systemu operacyjnego, aby aktywować).


2
Wszystkie instrukcje znajdują się w skrypcie szablonu podpięcia. Jeśli potrzebujesz podpięcia do serwera svnsynclustrzanego, to domyślny skrypt będzie musiał zostać zmieniony, ponieważ zezwala tylko na zmiany w svn: log. Svnsync zmienia się bardziej niż to, więc po prostu wstawiam exit 0tam, aby zezwolić na wszystkie zmiany właściwości (ponieważ jest to kopia lustrzana tylko dla mnie).
Matt Connolly,

... następnie zapisz go w pre-revprop-changetym samym katalogu i uczyń wykonywalnym dla użytkownika serwera WWW (w systemie Linux).
Mateng

209

W przypadku systemu Windows jest łącze do przykładowego pliku wsadowego, który zezwala tylko na zmiany w komunikacie dziennika (a nie innych właściwościach):

http://ayria.livejournal.com/33438.html

Zasadniczo skopiuj poniższy kod do pliku tekstowego, nazwij go pre-revprop-change.bati zapisz w \hookspodkatalogu swojego repozytorium.

@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

37
Mogło połączyć się z wersją tam stackoverflow.com/questions/6155/… . Napisałem ten hook i zamieściłem go na forum SVN jakiś czas temu. Wydaje mi się, że powinienem był umieścić w komentarzach haczyka kilka kredytów.
Philibert Perusse,

1
Używam tego skryptu z VisualSVN 2.0.8 i TortoiseSVN 1.6.11 i działa ładnie.
Mark Biek

27
Możesz edytować punkty zaczepienia w VisualSVN, klikając prawym przyciskiem myszy nazwę repozytorium na serwerze VisualSVN i wybierając "Właściwości ...". Zobaczysz kartę „Haczyki”. Tam zobaczysz różne dostępne rodzaje haczyków. Wybierz właściwy, kliknij „Edytuj” i wklej do niego powyższy kod. Mam nadzieję, że pomoże to użytkownikom VisualSVN!
Chuck Le Butt

Pracowałem dla mnie wyłączając wiersz: jeśli / I nie "% action%" == "M" goto ERROR_ACTION. W przeciwnym razie powtarzał, że dozwolone są tylko modyfikacje.
Nathan

6
Szybką i brudną metodą dla systemu Windows jest utworzenie pustego pliku o nazwie hooks \ pre-revprop-change.bat
Ben Claar

18

W systemie Linux, aby zezwolić na edycję komentarza dziennika,

  • zlokalizuj plik pre-revprop-change.tmplw hookskatalogu swojego repozytorium
  • skopiuj plik do tego samego katalogu, zmieniając jego nazwę na pre-revprop-change
  • nadaj uprawnienia do wykonywania pliku (np. dla użytkownika serwera www-data)

Edytowano: (dzięki Lindes)

  • po tym może 0zajść potrzeba edycji skryptu, aby zwrócić wartość wyjścia dla rodzaju edycji, na które chcesz zezwolić.

To nie wystarczy ... nadal trzeba odpowiednio zmienić wartości wyjścia. Ale i tak uznałem to za pomocne, jako wskaźnik do odpowiedniego miejsca do spojrzenia ... którego brakowało w niektórych innych odpowiedziach lub podając odpowiedzi specyficzne dla systemu Windows. Więc dzięki za to.
Lindes

1
Jestem prawie pewien, że w mojej wersji Ubuntu Linux wystarczyło skopiowanie i udzielenie pozwolenia. Ale już nie wiem na pewno. Odpowiednio zredagowałem odpowiedź. Dzięki.
Alois Heimer

Cóż, jestem pewien, że to nie zadziałało tak, jak jest, kiedy wypróbowałem to 2 dni temu i dodałem ten komentarz. Jednak w przypadku edycji ta odpowiedź działa dla mnie.
Lindes

11

Tutaj jest łącze do pytania o przepełnienie stosu z wieloma popularnymi punktami zaczepienia Typowe typy zaczepów Subversion , w tym oryginalne źródło przechwycenia pre-revprop-changedla systemu Windows zamieszczone tutaj.

Powinieneś tam odnieść się, ponieważ z czasem mogą ulec poprawie.


7

Dzięki #patmortech

I dodałem Twój kod, który „tylko ten sam użytkownik może zmienić swój kod”.

:: 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

4

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

2

Dla użytkowników komputerów PC: rozszerzenie .bat nie działało, gdy było używane w systemie Windows Server. Użyłem VisualSvn, jak zasugerował Django Reinhardt, i stworzyłem hook z rozszerzeniem .cmd.


0
  1. Przejdź do katalogu repozytorium SVN w podfolderze „hooks”, np. „D: \ SVN \ hooks \”
  2. utwórz tam pusty plik „pre-revprop-change.bat”
  3. w pliku napisz "exit 0" (bez "") i zapisz go
  4. cieszyć się :)

(To rozwiązanie z pewnością ma wady, ponieważ nic nie jest sprawdzane / zabronione. Ale w moim przypadku - lokalne repozytorium, z którego tylko ja korzystam - wydaje się działać.)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.