2010-11-12 16 views
14

Come posso impostare un hook pre-commit, che cercherà una stringa nei file committed e If found fermerà il commit?Mercurial pre-commit hook

+0

Mi sembra che sarebbe andare contro concetto di repository decentrata. Il tuo repository può essere clonato su un'altra macchina con sistemi diversi, e il tuo script potrebbe semplicemente non funzionare lì. Forse il gancio pre-push sarebbe meglio? Sono interessato a sentire la risposta alla tua domanda. –

+0

Ho un archivio centrale dove le persone stanno spingendo. Devo solo assicurarmi che i commit che ho fatto siano puliti prima di spingerli. – danidacar

+0

Provate a controllare http://www.selenic.com/mercurial/hgrc.5.html#hooks –

risposta

20

Chapter 10 di the mercurial book copre esattamente questo:

$ cat .hg/hgrc 
[hooks] 
pretxncommit.whitespace = hg export tip | (! egrep -q '^\+.*[ \t]$') 
$ echo 'a ' > a 
$ hg commit -A -m 'test with trailing whitespace' 
adding a 
transaction abort! 
rollback completed 
abort: pretxncommit.whitespace hook exited with status 1 
$ echo 'a' > a 
$ hg commit -A -m 'drop trailing whitespace and try again' 

In questo esempio, si introduce un semplice gancio pretxncommit che verifica spazi finali. Questo hook è breve, ma non molto utile. Esce da con uno stato di errore se una modifica aggiunge una riga con spazi bianchi finali a qualsiasi file , ma non stampa alcuna informazione che potrebbe aiutarci a identificare il file o la riga incriminata. Ha anche la bella proprietà di non prestando attenzione alle linee non modificate; solo le righe che introducono nuovi spazi bianchi iniziali causano problemi.

Basta cambiare l'espressione regolare da '^\+.*[ \t]$' a qualsiasi stringa che si sta cercando.

+1

OK, naturalmente ho trovato quell'esempio, ma come funziona? perché ho bisogno di -> hg export tip e che cos'è questo ritorno (! egrep -q '^ \ +. * [\ t] $')? – danidacar

+0

FYI, questo non funzionerà se non si aggiunge un tag ad ogni commit (cioè via '-A') –

+1

questo è un terribile esempio per la maggior parte degli sviluppatori: utilizza uno script di shell ed egrep. gli sviluppatori nella maggior parte degli ambienti di lavoro sono a disagio con questa roba - per un'approssimazione molto buona nessuno la usa - inoltre non ci sono spiegazioni o modi per determinare, ad es. quali parametri sono/non vengono passati nel gancio da questo esempio ... – jheriko

5

La risposta di Ry4an è quasi corretta :) ma è necessario sostituire "hg export tip" con "hg diff".
tip è l'ultimo changeset attivato, ma è interessato alle modifiche locali non salvate, quindi è necessario diff. per le mie esigenze ho aggiunto il seguente al mio hgrc

precommit.removeDebug = hg diff -S | grep -v '^-' | (! egrep '(var_dump)|(exit)|(print_r)') 

la -S comprende subrepos (maye ha bisogno, e può ancora essere buggy).
grep -v '^ -' rimuove le linee dal diff che indicano le linee rimosse. ho rimosso il -q così ho almeno un'idea di cosa rimuovere, ma sfortunatamente questo metodo non può stampare il file e il numero di caso (come viene convogliato). forse qualcuno ha un modo migliore per farlo.

+2

Resto dalla mia risposta. :) Le modifiche locali sono già state commesse al momento dell'esecuzione del libro 'pretxncommit' - è dopo il lavoro ma prima che la transazione venga eseguita, quindi' hg export tip' funziona bene, e viene eseguito il rollback quando l'hook dice no. –

+0

'hg export tip' funziona bene, sono d'accordo, ma, basato esclusivamente sulle mie osservazioni molto non scientifiche,' hg diff' funziona leggermente più velocemente. – gzzzur

5

BTW, su Windows è possibile utilizzare

[hooks] 
pretxncommit.nocommit = hg export tip | findstr NOCOMMIT && EXIT /B 1 || EXIT /B 0 

Questo gancio non riuscirà se le tue fonti contiene stringa "NOCOMMIT"