2010-07-22 12 views
18

Chciałbym użyć pre-commit hook, który uniemożliwia programistom ustawienie svn: mergeinfo na katalogach innych niż root. Oznacza to, że chcę wymusić, aby svn: mergeinfo można ustawić tylko na katalogach takich jak "trunk" lub "branches/branchName". Programiści czasami muszą zostać "przypomnieni", że nie jest dobrą praktyką używanie podkatalogu głównego jako celu scalania (zgodnie z najlepszymi praktykami wymienionymi here). Czy ktoś ma taki skrypt przechwytujący lub wie, gdzie mogę go znaleźć? Jestem w środowisku Windows, więc partia lub powershell byłaby lepsza, ale wszystko z pewnością byłoby pomocne.Svn pre-commit hook, aby uniemożliwić svn: mergeinfo na katalogach innych niż root

+0

Ściśle ciekawość - używasz Subversion 1.5 lub 1.6? (Ja też cierpiałem z powodu svn: mergeinfos na wszelkiego rodzaju katalogach/plikach z powodu scalenia z/z katalogów innych niż root, ale na 1.5) –

+1

Jesteśmy na 1.6. Problemy, które mam, nie są spowodowane starymi błędami 1.5, w których klient svn ustawił mergeinfo na wszystko w zasięgu wzroku. Raczej problemy wynikają z "błędu użytkownika", w którym użytkownik wykonuje scalenie przy użyciu katalogu innego niż katalog główny, takiego jak "trunk/mySubProject", jako obiektu scalania, dlatego ustawia informacje o scaleniu w tym katalogu. Powoduje to kolejne scalenia, o czym jestem pewien, że jesteś świadomy. –

+0

Rzeczywiście - dziękuję za informację. Dopiero niedawno osiągnęliśmy 1.6, więc nie miałem czasu obserwować, jak rzeczy się zmieniły. Muszę jednak rozwiązać ten sam problem. + Ulubione –

Odpowiedz

7

Po pierwsze, polecam użycie perla lub Pythona do wykonania zadania, partia okien pozostawia wiele do życzenia.

Możesz użyć przykładowego skryptu z http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/, aby rozpocząć. Na przykład skrypt: verify-po.py sprawdza kodowanie plików i sprawdza, czy autor ma uprawnienia do zatwierdzenia. Prawdopodobnie użyjesz svnlook diff w swoim skrypcie (tak jak w drugim), aby uzyskać zmienione właściwości katalogów i przejść przez odpowiednie ścieżki, bez względu na to, czy są to gałęzie lub tagi za pomocą wyrażeń regularnych.

Aktualizacja

Znaleziony enforcer pre-commit hook script, który wydaje się być to, czego szukasz.

Co ten skrypt robi to wykorzystuje svnlook zajrzeć do transakcji jest postęp. Przesuwając się przez transakcję , wywołuje ona zestaw haczyków , które pozwalają administratorowi repozytorium na sprawdzenie, co się dzieje, gdy jest i podjęcie decyzji, czy jest on akceptowalny.

Zawiera on kilka metod i verify_property_line_added() wśród nich, ponieważ jest to nazywany dla każdej linii, która jest dodawana do nieruchomości na pliku.

+0

Wygląda na to, że to najbardziej prawdopodobne rozwiązanie, a tym samym zwycięzca nagrody, chyba że ktoś inny coś wymyśli. – Charles

+0

Nawiasem mówiąc, po twoim pytaniu zacząłem interesować się svn hookami i zamierzam zaimplementować niektóre (zaczynając od zabraniających zatwierdzeń bez komunikatu logu) i prawdopodobnie osiągną właściwości sprawdzania przy zatwierdzaniu - wtedy umieszczę tu kolejną aktualizację . – pmod

0

Jeśli możesz CPAN na serwerze:

https://github.com/gnustavo/SVN-Hooks/blob/master/examples/check-mergeinfo.pl

Jeśli nie (na podstawie http://comments.gmane.org/gmane.comp.version-control.subversion.user/118969):

REPOS="$1" 
TXN="$2" 
SVNLOOK=/usr/bin/svnlook 

if !($SVNLOOK log -t "$TXN" "$REPOS" | grep -q '\[override] ';) then 

    # Get list of paths which have changed  
    TXN_PATHS=$($SVNLOOK changed -t "$TXN" "$REPOS") 

    # Filter those which are allowed: /trunk, /branches/*,... 
    TXN_PATHS=$(echo "$TXN_PATHS" | grep -Ev "^....(trunk/|branches/[^/]+/)$") 

    # Iterate over all paths, which are not allowed to have mergeinfo 
    while IFS= read -r TXN_PATH; do 
     ELEM_PATH=$(echo "$TXN_PATH" | cut -c 5-) 

     MERGEINFO=$($SVNLOOK propget "$REPOS" svn:mergeinfo -t "$TXN" "$ELEM_PATH" 2>/dev/null) 
     if [ ! "$MERGEINFO" = "" ]; then 
     echo " Cannot merge into directory that is not trunk or a branch:" >&2; 
     echo " $ELEM_PATH" >&2; 
     echo " Override by using [override]." >&2; 
     exit 1; 
     fi  
    done <<< "$TXN_PATHS" 

    # echo "Merge info check: OK" 
fi 
Powiązane problemy