mercoledì 20 febbraio 2008

SVN: impedire commit senza commento

SVN presenta una serie di hooks per gestire le fasi di pre and post commit, cosa che risulta molto comoda ad esempio per verificare determinati requisiti prima del commit vero e proprio o fornire segnalazioni (ad es. e-mail) a commit avvenuto.

Per impedire che gli utenti inseriscano dei commit senza commento (o con commento troppo corto) è possibile inserire il seguente controllo nel file hooks/pre-commit:

REPOS="$1"
TXN="$2"

SVNLOOK=`which svnlook`

# check how many characters the user has placed in the comment
MESSAGE_TEXT=`$SVNLOOK log -t "$TXN" "$REPOS" `
COMMENT_LENGTH=`echo $MESSAGE_TEXT | grep "[a-zA-Z0-9]" | wc -c `
MIN_COMMENT_LENGHT_ALLOWED=12

if [ $COMMENT_LENGTH -le $MIN_COMMENT_LENGHT_ALLOWED ]
then
echo "*** ATTENZIONE ***" >&2
echo "Per ovvie ragioni non e' piu' possibile effettuare un commit con messaggio nullo o troppo corto." >&2
echo "Per favore, prenditi il tempo che occorre e scrivi un buon commento, servira' a comprendere meglio" >&2
echo "le modifiche che hai apportato." >&2
echo "Inoltre, se stai correggendo un errore/bug, includi alcune informazioni di test " >&2
echo "(ad esempio un lotto di test) che possano essere utili per controllare l'errore " >&2
echo "e per testare eventuali altre modifiche. " >&2
echo "" >&2
echo "Il testo da te inserito { $MESSAGE_TEXT } ha una lunghezza insufficiente: $COMMENT_LENGTH" >&2
echo "" >&2
exit 1
fi

Quello che avviene è piuttosto semplice:
  1. con svnlook si ottiene il messaggio di commit inserito dall'utente (si noti che il commit non è ancora stato confermato);
  2. si ottiene la lunghezza del messaggio di commit;
  3. se la lunghezza del messaggio è inferiore ad una lunghezza specificata, si provvede a notificare l'utente del problema e si termina in modo anormale lo script.
Si noti che l'avviso all'utente viene notificato attraverso lo standard error, e che lo script termina con un codice di errore non zero, ad indicare ad svn che il commit non puo' essere accettato. Per accettare il commit occorre infatti che lo script pre-commit termini con un codice di uscita pari a zero.

Nessun commento: