2010-07-22 4 views
18

Ich möchte einen Pre-Commit-Hook verwenden, der verhindert, dass Entwickler svn: mergeinfo auf Nicht-Root-Verzeichnisse setzen. Das heißt, ich möchte das svn erzwingen: mergeinfo kann nur auf Verzeichnisse wie "Trunk" oder "Zweigniederlassungen/BranchName" festgelegt werden. Entwickler müssen manchmal daran erinnert werden, dass es nicht ratsam ist, ein Unterverzeichnis des Stammverzeichnisses als Zusammenführungsziel zu verwenden (gemäß den Best Practices here). Hat jemand ein solches Hook Script oder weiß wo ich es finden kann? Ich bin in einer Windows-Umgebung, so dass Batch oder Powershell vorzuziehen wäre, aber alles wäre sicherlich hilfreich.Svn pre-commit-Hook, um svn: mergeinfo in Nicht-Root-Verzeichnissen zu sperren

+0

Streng Neugier - verwenden Sie Subversion 1.5 oder 1.6? (Ich habe auch in den Händen von svn: mergeninfos auf alle Arten von Verzeichnissen/Dateien aufgrund von Zusammenführungen zu/von Nicht-Root-Verzeichnissen, aber auf 1.5) –

+1

Wir sind auf 1,6 leiden. Die Probleme, die ich habe, sind nicht auf die alten 1.5 Bugs zurückzuführen, bei denen der SVN-Client Mergeinfo auf alles in Sichtweite gesetzt hat. Die Probleme sind eher auf einen "Benutzerfehler" zurückzuführen, bei dem ein Benutzer eine Zusammenführung unter Verwendung eines Nicht-Stammverzeichnisses wie "trunk/mySubProject" als Zusammenführungsziel durchführt und daher Zusammenführungsinformationen für dieses Verzeichnis einstellt. Dies führt zu einer Verschmelzung der nachfolgenden Zusammenführungen, wie Sie sicher wissen. –

+0

In der Tat - danke für die Info. Wir sind erst seit kurzem auf 1.6, also hatte ich keine Zeit zu beobachten, wie sich die Dinge veränderten. Ich muss jedoch das gleiche Problem angehen. + Favoriten –

Antwort

7

Zunächst würde ich empfehlen, Perl oder Python zu verwenden, um die Aufgabe zu erledigen, Windows Batch lässt viel zu wünschen übrig.

Sie können ein Beispielskript von http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ verwenden. Beispiel: verify-po.py Skript überprüft Dateicodierungen und commit-access-control.pl.in überprüft, ob Autor Berechtigungen zum Festschreiben hat. Sie würden wahrscheinlich svnlook diff in Ihrem Skript verwenden (wie in der letzteren), um die Eigenschaften für Verzeichnisse zu erhalten und die entsprechenden Pfade zu durchlaufen, unabhängig davon, ob es sich um Zweige oder Tags mit regulärem Ausdruck handelt.

aktualisieren

enforcer pre-commit hook script gefunden, das, was Sie suchen zu sein scheint.

Was dieses Skript tut, ist es svnlook nutzt in die Transaktion zu spähen Fortschritt ist. Wie es durch die Transaktion durchgeht, ruft es zu einer Reihe von Hooks, die dem Repository Administrator ermöglichen, zu untersuchen, was auf geht und entscheiden, ob es akzeptabel ist.

Es enthält mehrere Methoden und verify_property_line_added() unter ihnen, da sie für jede Zeile aufgerufen ist, die auf eine Eigenschaft auf eine Datei hinzugefügt wird.

+0

Sieht so aus, als ob dies die wahrscheinlichste Lösung und somit der Kopfgeld-Gewinner sein wird, es sei denn jemand anders kann sich etwas einfallen lassen. – Charles

+0

Übrigens, nach Ihrer Frage fing ich an, sich für svn hooks zu interessieren, und ich werde einige implementieren (beginnend mit dem Verbieten von Commits ohne Log-Nachricht) und wahrscheinlich die Checking-Eigenschaften beim Commit erreichen - dann wird hier ein weiteres Update eingefügt . – pmod

0

Wenn Sie CPAN auf dem Server:

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

Wenn nicht (basierend auf 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 
Verwandte Themen