2011-10-31 16 views
12

Recientemente comencé a trabajar con MQ ya que me gusta la idea de trabajar en parches aislados y comprometer sin afectar el repositorio hasta que el conjunto de cambios sea lo suficientemente refinado. Antes de eso, solía trabajar con la extensión de estantes de Mercurial, pero me pareció un poco inestable. Lo que aún estoy tratando de entender en MQ es cómo mantener los parches separados entre sí y aplicarlos sin un orden particular, y en diferentes ramas. Aquí está mi flujo normal -Mercurial: ¿funciona con colas similares a estantes?

1. empezar a trabajar en un nuevo parche:

hg qnew fix-bug-1234 -m "fix bug 1234" 
# do some work 
hg qrefresh 

2. Obtener una nueva característica/fallo para trabajar en:

hg qpop fix-bug-1234 
hg qnew some-feature -m "implement feature X" 
# some work on feature X (perhaps in a different branch) 
hg qrefresh 

En este punto, me gustaría volver a trabajar en corrección de errores y dejar de lado el trabajo de características. Pensé que es tan simple como:

hg qpop some-feature 
hg qpush fix-bug-1234 
# wrap up bug fix 
hg qfinish fix-bug-1234 
# get back to work on feature 

Sin embargo, MQ parece utilizar siempre el último parche creado en la serie, y aplicarlo independientemente del comando qpop/qpush que estoy usando. Debo señalar que los archivos en los que trabajo también están completamente separados (aunque a veces pueden ser los mismos).

¿Falta algo aquí? ¿Debo usar hg qqueue para esto? Gracias.

Respuesta

10

Puede usar guards. Le permiten mantener un pedido de parches sin reorganizar su archivo series, y aplicar selectivamente solo un subconjunto de parches, aún en orden ordenado por pila.

Un ejemplo en su caso sería:

hg qnew bugfix 
# ..hack hack.. 
hg qrefresh 
# want to switch over to working on some feature now 
hg qpop 
hg qnew feature 
# ..hack hack.. 
hg qrefresh 

En este punto, estás en una situación en la que el parche feature viene antes bugfix en su pila.Ahora se puede usar protectores para seleccionar uno o el otro, y cambiar entre los dos:

hg qpop -a 
hg qguard feature +featureguard 
hg qguard bugfix +bugfixguard 

Si desea trabajar en feature:

hg qselect featureguard 
hg qpush 
applying feature 
now at: feature 

Si desea trabajar en bugfix:

hg qpop -a 
hg qselect bugfixguard 
hg qpush 
applying bugfix 
now at: bugfix 

Tenga en cuenta que ya ha seleccionado la guardia positivobugfixguard, MQ-salto frogged sobre feature (porque su protección positiva era diferente de la seleccionada) y aplicó el parche bugfix en su lugar (que coincidió con la protección seleccionada).

Algunas herramientas útiles cuando se trabaja con guardias son hg qseries -v, el cual mostrará una G en lugar del habitual para un U, parche no aplicado vigilado, y hg qselect -l que mostrará los guardias asociados con cada parche.

4

No, usted no echa en falta nada. La extensión mq supone bastante fuerte que las colas de parches son lineales. Si va a crear características/correcciones de parche múltiple, entonces qqueue funcionaría ... Pero si sus características/correcciones son solo parches individuales y desea aplicar una sin aplicar las otras, podría ser más fácil simplemente vuelva a organizar .hg/patches/series (que almacena el orden en que se aplicarán los parches).

hago esto (y parches de edición de la mano) suficientes de que tengo un alias de la shell:

alias viq='vim $(hg root)/.hg/patches/series' 

Alternativamente, si no le importa la aplicación de múltiples parches al mismo tiempo, se podría utilizar qgoto:

$ hg qser 
0 U bug-1234 
1 U feature-4321 
$ hg qgoto feature-4321 
$ hg qser 
0 A bug-1234 
1 A feature-4321 
9
  1. Ejecutar hg qpop -a para eliminar todos los parches de la pila
  2. Ejecutar hg qpush --move some-patch para aplicar "algún parche" sin aplicar los parches que puedan estar antes en la pila de parches