2012-01-19 14 views
9

Estoy escribiendo una secuencia de comandos de actualización, que extrae la última versión de varios repositorios y reconstruye los proyectos. Yo quería hacer que la construcción condicional, así que tratéMercurial: compruebe si la última extracción/actualización introdujo cambios

hg pull -u && ant clean build 

y la variación

hg pull; hg update && ant clean build 

Sin embargo, la acumulación de hormigas siempre se invoca, incluso cuando nada ha cambiado. Sé que puedo usar hg incoming para verificar los cambios antes de hacer la extracción, pero esto me parece un desperdicio.

¿Cómo puedo verificar si hay nuevos cambios, sin tener que contactar al servidor dos veces (una vez para hg incoming, una vez para hg pull)?

ACTUALIZACIÓN: Este es mi Creación de un script ahora:

update() { 
    TIP=$(hg tip --template "{node"}) 
    hg pull -u 
    if test "$TIP" != $(hg tip --template "{node}"); then 
    ant clean build 
    fi 
} 

(cd repo1; update) 
(cd repo2; update) 

Y para gente que se pregunta por qué hago una generación limpia cada vez, hay dos razones para ello:

  1. los repositorios dependen el uno del otro, y cuando la API en uno de ellos cambia, necesito hacer una reconstrucción completa para encontrar lugares donde estos cambios API rompan el código
  2. El compilador de Java en línea constantes, también de otros archivos de clase. Ahora, cuando cambio una constante en una clase a un campo que puede cambiar, todos los demás archivos de clase que usan esa constante permanecen intactos por una compilación, y esto puede conducir a errores sutiles que quiero evitar.
+1

En caso de no tener un sistema de compilación adecuado, léase: no es así, ¿podría hacer compilaciones incrementales? – jmg

+0

hormiga puede hacer compilaciones incrementales, pero quiero evitar errores sutiles, por lo que hago una compilación limpia todo el tiempo. –

+1

, entonces, ¿cómo puede aumentar sus propias compilaciones incrementales para evitar errores sutiles? –

Respuesta

9

Usted no sólo debe ejecutar hg incoming dos veces desde que en realidad descargará todos los conjuntos de cambios dos veces a continuación. Esto porque no puedes echar un vistazo al repositorio remoto sin ejecutar un hg pull completo.

Así que guarda los cambios entrantes en un paquete y tire de ese lugar:

hg incoming --bundle incoming.hg && hg pull --update incoming.hg && echo "Go!" 

Los hg incoming comando actúa como un protector para los siguientes comandos: la && un cortocircuito por lo que el primer comando que devuelve una el código de salida distinto de cero hará que toda la construcción falle con ese código de salida. Esto significa que hg pull y los siguientes comandos no se ejecutan cuando hg incoming indica que no hay nada que extraer.

+2

En realidad, no estaba llamando dos veces. Pero no me di cuenta de que la entrada descarga el conjunto de cambios completo, por lo que hacer un ingreso y extracción es en efecto la descarga de cosas dos veces. –

+0

Extraño, 'hg pull --update && echo" Ir "' siempre hace el 'echo', pero' hg pull --update entraing.hg && echo "Go" 'solo cuando se introducen nuevos cambios. ¿Hay alguna razón para eso? –

+0

@AdamHouldsworth: Sí, las llamadas entrantes y las llamadas son realmente lo mismo (las entradas solo eliminan los conjuntos de cambios). La documentación no es muy clara al respecto, por lo que no se puede culpar por pensar que es barato ejecutar entrante. –

3

seguimiento para @ Adam

citas de hg help incoming

Para repositorio remoto, utilizando --bundle evita la descarga de los conjuntos de cambios dos veces si la entrada es seguido por un tirón.

...

Devuelve 0 si hay cambios entrantes, 1 en caso contrario.

Cuestiones relacionadas