2010-07-22 13 views
18

Vorrei usare un hook pre-commit che impedisce agli sviluppatori di impostare svn: mergeinfo su directory non-root. Cioè, voglio applicare tale svn: mergeinfo può solo essere impostato su directory come "trunk" o "branches/branchName". A volte gli sviluppatori devono "ricordare" che non è una buona pratica utilizzare una sottodirectory della radice come target di fusione (secondo le best practice elencate allo here). Qualcuno ha un tale script di aggancio o sa dove trovarlo? Sono in un ambiente Windows, quindi batch o powershell sarebbe preferibile, ma tutto sarebbe certamente utile.Svn pre-commit hook per disabilitare svn: mergeinfo su directory non-root

+0

Rigorosamente curiosità - stai usando Subversion 1.5 o 1.6? (Anche io ho sofferto per mano di svn: mergeinfos su tutti i tipi di directory/file a causa di unioni da/per le directory non-root, ma il 1.5) –

+1

Siamo su 1.6. I problemi che sto avendo non sono dovuti ai vecchi 1.5 bug in cui il client svn imposta mergeinfo su tutto ciò che è in vista. Piuttosto, i problemi sono a causa di "errori degli utenti", in cui un utente effettua una fusione con una directory non-root come "trunk/mySubProject" come destinazione di unione, impostando quindi unire le informazioni su quella directory. Questo rovina le successive fusioni, come sono sicuro che tu ne sia a conoscenza. –

+0

Infatti - grazie per le informazioni. Siamo solo di recente al 1.6, quindi non ho avuto il tempo di osservare come sono cambiate le cose. Devo affrontare lo stesso problema, però. + Favorite –

risposta

7

Prima di tutto, mi consiglia di utilizzare perl o python per eseguire l'operazione, Windows batch lascia molto a desiderare.

È possibile utilizzare alcuni script di esempio da http://svn.apache.org/repos/asf/subversion/trunk/tools/hook-scripts/ per iniziare. Ad esempio, verify-po.py controlla le codifiche dei file e commit-access-control.pl.in controlla se l'autore dispone delle autorizzazioni per il commit. Probabilmente impiegherete svnlook diff nello script (come in quest'ultimo) per ottenere le proprietà modificate per le directory e passare attraverso i percorsi corrispondenti sia che si tratti di rami o tag che utilizzano espressioni regolari.

Aggiornamento

Trovato enforcer pre-commit hook script che sembra essere quello che stai cercando.

Che questo script non fa altro che usa svnlook di sbirciare nella transazione è il progresso. Come si passa al setaccio la transazione , si chiama a una serie di ganci che consentono l'amministratore del repository di esaminare che cosa sta succedendo avanti e decidere se è accettabile.

Esso contiene diversi metodi e verify_property_line_added() tra di loro, dal momento che è chiamato per ogni linea che viene aggiunto a una proprietà su un file.

+0

Sembra che questa sia la soluzione più probabile e quindi il vincitore della taglia, a meno che qualcun altro non riesca a inventare qualcosa. – Charles

+0

A proposito, dopo la tua domanda ho iniziato a interessarmi agli svn hooks, e ne implementerò alcuni (iniziando con commit proibiti senza messaggi di log), e probabilmente raggiungerò le proprietà di controllo su commit - quindi inserirò un altro aggiornamento . – pmod

0

Se è possibile CPAN sul server:

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

In caso contrario (sulla base di 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 
Problemi correlati