2011-10-31 14 views
12

Ho iniziato di recente a lavorare con MQ poiché mi piace l'idea di lavorare su patch isolate e di eseguire commit senza influenzare il repository finché il changeset non è sufficientemente rifinito. Prima di allora, lavoravo con l'estensione degli scaffali di Mercurial, ma l'ho trovato un po 'instabile. Quello che sto ancora cercando di capire in MQ è come mantenere le patch separate l'una dall'altra e applicarle in nessun ordine particolare, e attraverso rami diversi. Ecco la mia normale flusso -Mercuriale - Utilizzo di code simili a scaffali?

1. iniziare a lavorare su una nuova patch:

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

2. avere una nuova caratteristica/bug su cui lavorare:

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 

A questo punto, vorrei tornare a lavorare su bugfix e mettere da parte le funzionalità. Ho pensato che è semplice come:

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

Tuttavia, MQ sembra utilizzare sempre l'ultima patch creata nella serie, e si applica indipendentemente dal comando di qpop/qpush sto usando. Devo notare che i file su cui lavoro sono completamente separati (anche se a volte possono essere uguali).

Mi manca qualcosa qui? Dovrei usare hg qqueue per questo? Grazie.

risposta

10

È possibile utilizzare guards. Consentono di mantenere un ordinamento di patch senza riorganizzare il file series e applicare selettivamente solo un sottoinsieme di patch, ancora in modalità stack ordinata.

Un esempio nel tuo caso sarebbe:

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 

A questo punto, sei in una situazione in cui cerotto feature viene prima bugfix nel tuo stack.Ora è possibile utilizzare protezioni per selezionare uno o l'altro, e passare tra i due:

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

Se si desidera lavorare su feature:

hg qselect featureguard 
hg qpush 
applying feature 
now at: feature 

Se si desidera lavorare su bugfix:

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

Nota che, poiché si è selezionato il positiva guardiabugfixguard, MQ salto-Frogged over feature (perché la sua guardia positiva era diversa da quella selezionata) e ha applicato invece la patch bugfix (che corrispondeva alla guardia selezionata).

Alcuni strumenti utili quando si lavora con protezioni sono hg qseries -v che visualizzerà un G invece del solito U per un sorvegliato, cerotto non applicata e hg qselect -l che visualizzerà le guardie associati con ogni patch.

4

No, non ti manca nulla. L'estensione mq fa un forte presupposto che le code di patch siano lineari. Se stai per creare funzionalità/correzioni multi-patch, allora il qqueue funzionerebbe ... Ma se le tue funzioni/correzioni sono solo singole patch e vuoi essere in grado di applicarne una senza applicare le altre, potrebbe essere più semplice riorganizzare .hg/patches/series (che memorizza l'ordine di applicazione delle patch).

faccio questo (e le patch a mano di editing) abbastanza che ho un alias di shell:

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

In alternativa, se non vi occupate di applicare più patch allo stesso tempo, è possibile utilizzare 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. Esegui hg qpop -a per rimuovere tutte le patch dalla pila
  2. Esegui hg qpush --move some-patch per applicare "alcune patch" senza applicare qualsiasi altra patch può essere prima nella pila di patch