2010-11-12 9 views
14

¿Cómo puedo configurar un enganche previo a la confirmación, que buscará una cadena en los archivos confirmados y si se encuentra, detener la confirmación?Mercurial pre commit hook

+0

Me parece que iría en contra de concepto de repositorio descentralizada. Su repositorio puede ser clonado en otras máquinas con diferentes sistemas, y su secuencia de comandos puede simplemente no funcionar allí. Tal vez el anzuelo pre-push sería mejor? Estoy interesado en escuchar la respuesta a tu pregunta. –

+0

Tengo un repositorio central donde la gente está presionando. Solo necesito asegurarme de que los compromisos que hice estén limpios antes de presionarlos. – danidacar

+0

Intente comprobar http://www.selenic.com/mercurial/hgrc.5.html#hooks –

Respuesta

20

Chapter 10 de the mercurial book cubre este exactamente:

$ 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' 

En este ejemplo, se introduce un simple gancho pretxncommit que comprueba con espacios en blanco. Este gancho es corto, pero no muy útil. que sale con un estado de error si un cambio añade una línea con espacios en blanco para cualquier archivo , pero no imprime ninguna información que nos pueda ayudar a identificar el archivo infractor o línea. También tiene la buena propiedad de no prestando atención a las líneas no modificadas; solo líneas que introducen nuevos trazados que causan problemas.

Simplemente cambie la expresión regular de '^\+.*[ \t]$' a cualquier cadena que esté buscando.

+1

OK, por supuesto, encontré ese ejemplo por el momento, pero ¿cómo funciona? ¿Por qué necesito -> hg export tip y qué devuelve (! egrep -q '^ \ +. * [\ t] $')? – danidacar

+0

FYI, esto no funcionará si no agrega una etiqueta con cada confirmación (es decir, mediante '-A') –

+1

. Este es un terrible ejemplo para la mayoría de los desarrolladores: utiliza un script de shell y egrep. los desarrolladores en la mayoría de los entornos de trabajo se sienten incómodos con estas cosas, con una muy buena aproximación, nadie las usa, además no hay explicación o forma de determinar, p. ¿Qué parámetros se pasan al anzuelo de este ejemplo? – jheriko

5

La respuesta de Ry4an es casi correcta :) pero debe reemplazar "hg export tip" con "hg diff".
tip es el último conjunto de cambios comprometido, pero le interesan los cambios locales sin compromiso, por lo que diff es lo que necesita. para mis necesidades i añade lo siguiente a mi hgrc

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

la -S incluye subrepos (maye no necesita, y puede ser aún con errores).
grep -v '^ -' elimina las líneas del diff que indican las líneas que se eliminaron. eliminé el -q así que al menos tengo una idea de qué eliminar, pero desafortunadamente este método no puede imprimir el archivo y el número de referencia de la ocurrencia (ya que está entubada). tal vez alguien tiene una mejor manera de hacerlo.

+2

Respuardo mi respuesta. :) Los cambios locales ya están comprometidos cuando se ejecuta el libro 'pretxncommit'; es después del trabajo pero antes de que se haya comprometido la transacción, por lo que' hg export tip' funciona bien, y se retrotrae cuando el gancho dice no. –

+0

'hg export tip' funciona bien, estoy de acuerdo, pero, basado puramente en mis propias observaciones poco científicas,' hg diff' funciona un poco más rápido. – gzzzur

5

Por cierto, en Windows puede utilizar

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

Este gancho fallará si sus fuentes contiene cadena "NOCOMMIT"

Cuestiones relacionadas