Trabalhando com o Mercurial – HG
Introdução
Nos últimos tempos estou conscientizando os meus colegas de trabalho sobre os benefícios da utilização de um controle de código distribuído. Fiz uma análise nas vantagens e desvantagens do Git e HG (Mercurial) e escolhemos o Mercurial pois precisamos trabalhar em um ambiente heterogeneo e o suporte do Git ao windows ainda é precário, até achamos algumas iniciativas como o MSysGit, porém ainda possuem um longo caminho pela frente para se tornar uma ferramenta que atenda as nossas necessidades(realidade). A comunidade do mercurial está mais evoluida neste sentido, e ao que estudamos o Mercurial disponibiliza todas as funcionalidades que almejamos em um gerenciador de código distribuído.
O objetivo deste post é mostrar o fluxo de trabalho com mercurial, comentando os comandos executados em um fluxo de trabalho escolhido por mim. Alguns devem se perguntar, “Por que escolhido por você ?”, porque com o gerenciador de código distribuído não existe um fluxo de trabalho obrigatório a ser seguido, as ferramentas oferecem recursos para você adaptar fácilmente o fluxo de trabalho, portanto uma vez que você entende os conceitos do gerenciador de código distribuído você nota que é você quem faz seu fluxo de trabalho.
Não se assuste com as sequências de códigos, logo abaixo segue os comentários sobre as operações efetuadas, uma das coisas legais do mercurial é que a maioria dos comandos são legíveis, portanto tente entender somenter ao ler os comandos, senão entender, leia os comentários e avalie novamente os comandos, tudo deve fazer sentido, pelo menos eu espero que faça sentido.
Como dito anteriormente o objetivo não é explicar os conceitos. Portanto para entender os conceitos por trás do que é um gerenciador de código distribuído recomendo a leitura dos seguintes textos:
- Conceitos básicos de controle de versão de softwew: Centralizado e Distribuído.
- Entendendo git e instalando gitorious. Nesse post recomendo os capítulos Mudança de paradigma, Problemas da centralização 1, 2 e 3, Git: Ferramenta para pessoas sem paciência, Mundo ideal .
- Introdução ao controle de versão distribuído (Ilustrado). (Inglês)
Configuração
Para este post estou usando mercurial 1.3.1 instalado no ubuntu através do easy_install.
Recomendo configurar também o __hg_ps1, como nesse post.
Antes de começar configure seu .hgrc. Crie um arquivo no seu home:
touch ~/.hgrc
E então edite com seu editor favorito e coloque as seguinte informações sobre a aparência do hg:
[ui]
username = Seu Nome <seu@email.com.br>
style = compact
Antes de continuarmos, uma coisa que é muito legal no mercurial são as extensões. O mercurial já vem com uma série de extensões incluídas, para uma lista completa clique aqui, abaixo algumas que julgo essenciais, embora eu não vá explicar a utilização de todas nesse post, já deixe habilitado, não custa nada
com certeza explicarei nos posts seguintes.
- mercurialqueue
- rebase
- graphlog
Para habilitar adicione ao arquivo ~/.hgrc também uma nova seção para as extensões:
[extensions]
hgext.graphlog =
hgext.mq =
hgext.rebase =
Comandos básicos
Tendo em mente que você já sabe os conceitos, vamos fazer uma lista breve de comandos básicos que você deve saber na ponta do dedo.
hg clone <url>
faz uma cópia local do repositório informado
hg pull
faz download das mudanças no repositório de origem (pai)
hg push
faz upload das mudanças no repositório de origem (pai)
hg status
verifica se há alterações locais
hg tip
verifica qual a versão que está a frente no repositório, ou se preferir no topo(HEAD)
hg incoming
verifica o que tem de novo no repositório de origem, frequentemente usado antes de fazer um hg pull, para saber o que se esperar.
hg outgoing
verifica o que você tem de novo em relação ao repositório de origem, frequentemente usado antes de fazer hg push
hg merge
uni duas branches ou changeset transformando em uma.
Trabalhando
Vamos agora iniciar o trabalho, você vai codificar um projeto novo, então você cria uma pasta, inicia o repositório e adiciona inicialmente um arquivo de README com instruções ou informações sobre o projeto:
1 2 3 4 5 6 7 8 9 10 | :~/src $ mkdir projetonovo :~/src $ cd projetonovo/ :~/src/projetonovo $ ls :~/src/projetonovo $ hg init :~/src/projetonovo $ echo "Este projeto vai dominar o mundo" >> README :~/src/projetonovo $ hg add README :~/src/projetonovo $ hg ci -m "Adicionado arquivo de README com informações sobre o projeto" :~/src/projetonovo $ hg tip 0[tip] b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto |
Agora temos uma pasta com o nosso projeto e que está sendo versionado pelo mercurial, adicionamos um arquivo com informações para ser rastreado, fizemos o commit e depois verificamos qual o tip(head) do repositório. Você pode verificar que a saída do hg tip foi algo bem resumido, isso por que configuramos no ~/.hgrc na seção [ui] , o estilo compacto style = compact . Se você deseja que o output dos comandos do mercurial sejam mais verbosos, basta comentar o style = compact ou remover do ~/.hgrc.
Dentro de uma equipe de desenvolvimento de software, existem pelo menos 2 ciclos básicos que ficam em loop olhando pela perspectiva de implementação e não de análise, eu chamo de ciclo implementativo e corretivo.
Abaixo apresento minha solução para os ciclos em um mundo ideal. Há quem diga que não vivemos em um mundo ideal, mas eu acho importante para entender e fixar os conceitos.
Ciclo implementativo
- Identicar nova funcionalidade e traçar funcionamento básico
- Abrir uma ramificação(branch) do projeto
- Codificar e testar na branch criada SOMENTE para esta feature
- Unir(merge) tip da branche da nova feature ao tip da mainline (branche default) e commitar
- Fechar a ramificação da branche da nova feature
Claro, aqui não é usado nenhuma formalidade nem nome bonito. É simplesmente como eu resumo minhas tarefas implementativas ao meu gosto.
Esse processo pode variar, o mercurial dá a liberdade de você fazer isso como quiser, abaixo eu demonstro como eu faço isso. Uma coisa interessante de ser mencionada é que as branchs são operações no repositório e portanto entram para o histórico do repositório, não esqueça que as branches precisam ser commitadas, dependendo do seu projeto você pode não querer saber como cada desenvolvedor criou a branch ou que nome deu para a branch, eu acho interessante e não vejo problema nisso, muito pelo contrário, temos um histórico fidedigno do desenvolvimento do projeto.
Então vou criar a branche para implementar a funcionalidade UltraMegaBoga de todos os tempos
.
1 2 3 4 5 6 | :~/src/projetonovo $ hg branch NovaFeature_UltraMegaBoga marked working directory as branch NovaFeature_UltraMegaBoga :~/src/projetonovo $ hg ci -m "Criado branch para implementar NovaFeature UltraMegaBoga" :~/src/projetonovo $ hg branches NovaFeature_UltraMegaBoga 1:7fc70f299283 default 0:b65bb6ffc97c (inactive) |
Dae você pode ver que usamos o hg branch para nomear a branche padrão atual (default) e depois criamos de fato através do commit (ci), e depois confirmamos usando o hg branches para verificar quais as branches que temos no repositório. E agora sim podemos codificar a funcionalidade. No commit automaticamente somos movidos para a branch nova que acabamos de criar.
Então, implementando uma nova feature:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | :~/src/projetonovo $ touch teste.py :~/src/projetonovo $ echo "print('Hellowww mercurial')" >> teste.py :~/src/projetonovo $ python teste.py Hellowww mercurial :~/src/projetonovo $ hg status ? teste.py :~/src/projetonovo $ hg add teste.py :~/src/projetonovo $ hg status A teste.py :~/src/projetonovo $ hg ci -m "Criado arquivo da funcionalidade UltraMegaBoa" :~/src/projetonovo $ hg glog @ 2[tip] c192d84f042a 2009-11-02 17:16 -0400 root | Criado arquivo da funcionalidade UltraMegaBoa | o 1 7fc70f299283 2009-11-02 17:01 -0400 root | Criado branch para implementar NovaFeature UltraMegaBoga | o 0 b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto :~/src/projetonovo $ echo "import this" >> teste.py :~/src/projetonovo $ hg status M teste.py :~/src/projetonovo $ hg ci -m "Nova funcionalidade UltraMegaBoga implementada" :~/src/projetonovo $ hg glog @ 3[tip] f337dc212ea0 2009-11-02 17:19 -0400 root | Nova funcionalidade UltraMegaBoga implementada | o 2 c192d84f042a 2009-11-02 17:16 -0400 root | Criado arquivo da funcionalidade UltraMegaBoa | o 1 7fc70f299283 2009-11-02 17:01 -0400 root | Criado branch para implementar NovaFeature UltraMegaBoga | o 0 b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto :~/src/projetonovo $ echo "print('Testando funcionalidade ultramegaboga...')" >> teste.py :~/src/projetonovo $ hg status hg M teste.py :~/src/projetonovo $ hg ci -m "Implementado TesteUnitario e tudo funcionando como esperado" :~/src/projetonovo $ hg glog @ 4[tip] 63ddafc85f03 2009-11-02 17:21 -0400 root | Implementado TesteUnitario e tudo funcionando como esperado | o 3 f337dc212ea0 2009-11-02 17:19 -0400 root | Nova funcionalidade UltraMegaBoga implementada | o 2 c192d84f042a 2009-11-02 17:16 -0400 root | Criado arquivo da funcionalidade UltraMegaBoa | o 1 7fc70f299283 2009-11-02 17:01 -0400 root | Criado branch para implementar NovaFeature UltraMegaBoga | o 0 b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto |
Opa!, muita informação?… nada, só algumas sendo repitidas.
Linhas 1 ~ 10: Nestas linhas apenas criamos um arquivo, colocamos conteúdo dentro dele, executamos, verificamos o status do repositório e eles nos diz que o arquivo novo não foi adicionado e então o adicionamos ao projeto para ser rastreado e então commitamos. Simples hein ?!
Linhas 11: Na linha 11 há um comando novo que ainda não comentamos, o comando hg glog que mostra o log do repositório através de um grafo, o que facilita bastante a vida quando estamos trabalhando com branches(ramificações), para entender melhor veja bem que o glog traz a arvore de forma natural, ou seja, da raiz até o topo ou nós. Na primeira coluna mostra os nós e aonde você está em relação aos nós da arvore, cada nó desse representa um commit, os nós são representados por o e onde você está através do @, na segunda coluna estão as revisões de números inteiros e sequencias que você pode usar para se direcionar ou situar na árvore ou histórico, o mercurial usa revisões sequencias e hashs para controlar o histórico e os changesets(conjuntos de mudanças).
E então esses procedimentos se repetem até o nó 4 ou changeset 63ddafc85f03, conforme pode ser visto localizando o @ no resultado do comando hg glog.
Vamos voltar para o branche default para fazer o merge e incorporar as modificações da branche UltraMegaBoga
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | :~/src/projetonovo $ hg update default 0 files updated, 0 files merged, 1 files removed, 0 files unresolved :~/src/projetonovo $ hg glog o 4[tip] 63ddafc85f03 2009-11-02 17:21 -0400 root | Implementado TesteUnitario e tudo funcionando como esperado | o 3 f337dc212ea0 2009-11-02 17:19 -0400 root | Nova funcionalidade UltraMegaBoga implementada | o 2 c192d84f042a 2009-11-02 17:16 -0400 root | Criado arquivo da funcionalidade UltraMegaBoa | o 1 7fc70f299283 2009-11-02 17:01 -0400 root | Criado branch para implementar NovaFeature UltraMegaBoga | @ 0 b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto |
Outro comando novo, hg update, com esse comando você pode alternar entre as branches(ramificações) do seu projeto e nas revisões também bastando passar o parâmetro hg update -r REV, na linha 1 alternei para a branch default e você pode perceber na saída do comando hg glog que o @ voltou para revisão 0 que é onde a revisão default parou, certo ? os outros commits foram da branche NovaFeature_UltraMegaBoga.
Agora vamos fazer o merge das duas branches.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | :~/src/projetonovo $ hg merge NovaFeature_UltraMegaBoga 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (branch merge, dont forget to commit) :~/src/projetonovo $ hg tip 4[tip] 63ddafc85f03 2009-11-02 17:21 -0400 root Implementado TesteUnitario e tudo funcionando como esperado :~/src/projetonovo $ hg glog @ 4[tip] 63ddafc85f03 2009-11-02 17:21 -0400 root | Implementado TesteUnitario e tudo funcionando como esperado | o 3 f337dc212ea0 2009-11-02 17:19 -0400 root | Nova funcionalidade UltraMegaBoga implementada | o 2 c192d84f042a 2009-11-02 17:16 -0400 root | Criado arquivo da funcionalidade UltraMegaBoa | o 1 7fc70f299283 2009-11-02 17:01 -0400 root | Criado branch para implementar NovaFeature UltraMegaBoga | @ 0 b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto :~/src/projetonovo $ hg ci -m "Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento" :~/src/projetonovo $ hg glog @ 5[tip]:0,4 b270c2750162 2009-11-02 17:24 -0400 root |\ Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento | | | o 4 63ddafc85f03 2009-11-02 17:21 -0400 root | | Implementado TesteUnitario e tudo funcionando como esperado | | | o 3 f337dc212ea0 2009-11-02 17:19 -0400 root | | Nova funcionalidade UltraMegaBoga implementada | | | o 2 c192d84f042a 2009-11-02 17:16 -0400 root | | Criado arquivo da funcionalidade UltraMegaBoa | | | o 1 7fc70f299283 2009-11-02 17:01 -0400 root |/ Criado branch para implementar NovaFeature UltraMegaBoga | o 0 b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto |
hg merge <nome_do_branch> e então a união é feita, mas você pode ver pela saída do hg glog da linha 7 que o @ aparece tanto na revisão 0 quanto na 4, porque faltou criar o nó que significa a união dos projetos e que será ponto de partida para novas alterações, e eles nos avisa ao fazer o merge não esqueça de fazer o commit. E então fizemos o commit informando que estamos incorporando a nova funcionalidade. e então você pode ver o resultado do glog novamente, gerou-se a revisão 5 e novo hash. Agora percebesse que o glog é realmente muito útil né ?
Agora para finalizar o ciclo, precisamos fechar a branch que criamos para desenvolver a feature, essa é uma funcionalidade que veio no mercurial 1.2, pois antes disso o mercurial não permite deletar branch, imagine a quantidade de branches que perduravam a vida toda no repositório ?!.
Encerrando as atividades da branch UltraMegaBoga.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | :~/src/projetonovo $ hg update NovaFeature_UltraMegaBoga 0 files updated, 0 files merged, 0 files removed, 0 files unresolved :~/src/projetonovo $ hg ci -m "Fechando branch, feature implementada e incorporada a arvore principal" --close-branch created new head :~/src/projetonovo $ hg branches default 5:b270c2750162 :~/src/projetonovo $ hg glog @ 6[tip]:4 7992ab50038d 2009-11-02 17:26 -0400 root | Fechando branch, feature implementada e incorporada a arvore principal | | o 5:0,4 b270c2750162 2009-11-02 17:24 -0400 root |/| Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento | | o | 4 63ddafc85f03 2009-11-02 17:21 -0400 root | | Implementado TesteUnitario e tudo funcionando como esperado | | o | 3 f337dc212ea0 2009-11-02 17:19 -0400 root | | Nova funcionalidade UltraMegaBoga implementada | | o | 2 c192d84f042a 2009-11-02 17:16 -0400 root | | Criado arquivo da funcionalidade UltraMegaBoa | | o | 1 7fc70f299283 2009-11-02 17:01 -0400 root |/ Criado branch para implementar NovaFeature UltraMegaBoga | o 0 b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto |
Basicamente na saída acima, voltamos para a branch da funcionalidade UltraMegaBoga e fazemos um commit de encerramento, com o parâmetro –close-branch. Com isso damos fim ao Ciclo Implementativo.
Ciclo corretivo
No ciclo corretivo, existem 2 aspectos:
- Você encontrou o problemas durante o desenvolvimento, antes de lançar uma versão.
- Você encontrou ou encontraram pra você depois de ter lançado a versão.
Para primeira ocasião você pode usar o mesmo mecanismo do ciclo implementativo para fazer as correções. Agora na segunda ocasião eu sugiro uma abordagem diferente, o ideal é corrigir o problema e gerar patches para serem incorporados uma vez que o software já foi congelado(lançado a versão) e está apenas sofrendo correções esporádicas e não mais vivendo em um intenso processo de produção, para isso eu uso a extensão do mercurial chamada MercurialQueues, que é um conjunto de comandos para gerenciamentos de uma fila de patchs no estilo LIFO(Last-In / First-Out), o ciclo corretivo se divide em:
- Identificar a causa do problema
- Consertar o bug
- Gerar patch e exportar
Alguns devem ser perguntar o porque de eu sugerir MercurialQueues, pelo motivo de que os commits são maleáveis, no padrão os commits do mercurial são imutáveis, já com o MQ posso trabalhar em varios patches ao mesmo tempo somente manipulando a fila ao invés de ter que ficar importando e/ou exportando patches, posso também mesclar patches sem que isso interfira nos commits. IMHO, é mais conveniente. Você pode também usar o patch para aplicar a correção na versão que está em desenvolvimento
Comandos básicos
hg qinit
hg qnew
hg qrefresh
hg qpop
hg qpush
hg qfinish
hg qimport
Abaixo um exemplo de como criar uma fila e desenvolver um patch usando mercurial queues.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | :~/src/projetonovo $ hg qinit -c :~/src/projetonovo $ hg qseries :~/src/projetonovo $ hg qapplied :~/src/projetonovo $ hg qnew fix_bug_01.patch :~/src/projetonovo $ echo "print('fixing bug')" >> mat.py :~/src/projetonovo $ hg qseries fix_bug_01.patch :~/src/projetonovo $ hg qapplied fix_bug_01.patch :~/src/projetonovo $ hg glog @ 9[fix_bug_01.patch,qtip,tip,qbase] b3f8a3b6f155 2009-11-02 22:55 -0400 root | [mq]: fix_bug_01.patch | o 8[qparent] 709a2b46c4cd 2009-11-02 17:29 -0400 root | Implementada feature nova e fechando branche | o 7 cd5986a79612 2009-11-02 17:28 -0400 root | criando branche para feature nova | o 6:4 7992ab50038d 2009-11-02 17:26 -0400 root | Fechando branch, feature implementada e incorporada a arvore principal | | o 5:0,4 b270c2750162 2009-11-02 17:24 -0400 root |/| Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento | | o | 4 63ddafc85f03 2009-11-02 17:21 -0400 root | | Implementado TesteUnitario e tudo funcionando como esperado | | o | 3 f337dc212ea0 2009-11-02 17:19 -0400 root | | Nova funcionalidade UltraMegaBoga implementada | | o | 2 c192d84f042a 2009-11-02 17:16 -0400 root | | Criado arquivo da funcionalidade UltraMegaBoa | | o | 1 7fc70f299283 2009-11-02 17:01 -0400 root |/ Criado branch para implementar NovaFeature UltraMegaBoga | o 0 b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto :~/src/projetonovo $ hg qrefresh :~/src/projetonovo $ echo "a = 1" >> teste.py :~/src/projetonovo $ hg diff diff -r 2ae8338b6a9c teste.py --- a/teste.py Mon Nov 02 23:04:04 2009 -0400 +++ b/teste.py Mon Nov 02 23:07:04 2009 -0400 @@ -1,3 +1,4 @@ print('Hellowww mercurial') import this print('Testando funcionalidade ultramegaboga...') +a = 1 :~/src/projetonovo $ hg qdiff diff -r 709a2b46c4cd mat.py --- a/mat.py Mon Nov 02 17:29:50 2009 -0400 +++ b/mat.py Mon Nov 02 23:07:07 2009 -0400 @@ -1,1 +1,2 @@ print(2+2) +print('fixing bug') diff -r 709a2b46c4cd teste.py --- a/teste.py Mon Nov 02 17:29:50 2009 -0400 +++ b/teste.py Mon Nov 02 23:07:07 2009 -0400 @@ -1,3 +1,4 @@ print('Hellowww mercurial') import this print('Testando funcionalidade ultramegaboga...') +a = 1 :~/src/projetonovo $ hg qapplied fix_bug_01.patch :~/src/projetonovo $ hg qpop :~/src/projetonovo $ hg qseries fix_bug_01.patch :~/src/projetonovo $ hg qapplied :~/src/projetonovo $ hg qcommit :~/src/projetonovo $ hg tip 8[tip] 709a2b46c4cd 2009-11-02 17:29 -0400 root Implementada feature nova e fechando branche :~/src/projetonovo $ hg glog @ 8[tip] 709a2b46c4cd 2009-11-02 17:29 -0400 root | Implementada feature nova e fechando branche | o 7 cd5986a79612 2009-11-02 17:28 -0400 root | criando branche para feature nova | o 6:4 7992ab50038d 2009-11-02 17:26 -0400 root | Fechando branch, feature implementada e incorporada a arvore principal | | o 5:0,4 b270c2750162 2009-11-02 17:24 -0400 root |/| Incorporando branch NovaFeature_UltraMegaBoga a arvore principal de desenvolvimento | | o | 4 63ddafc85f03 2009-11-02 17:21 -0400 root | | Implementado TesteUnitario e tudo funcionando como esperado | | o | 3 f337dc212ea0 2009-11-02 17:19 -0400 root | | Nova funcionalidade UltraMegaBoga implementada | | o | 2 c192d84f042a 2009-11-02 17:16 -0400 root | | Criado arquivo da funcionalidade UltraMegaBoa | | o | 1 7fc70f299283 2009-11-02 17:01 -0400 root |/ Criado branch para implementar NovaFeature UltraMegaBoga | o 0 b65bb6ffc97c 2009-11-02 14:55 -0400 root Adicionado arquivo de README com informações sobre o projeto |
Linhas 1 ~ 10: É iniciada uma fila através do comando hg qinit -c , -c significa que a fila será versionada e portanto poderá ser usado o comando hg qcommit. Depois verificamos se está tudo zerado usando os comandos hg qseries e hg qapplied , o qseries nos permite verificar quais patchs estão na fila e o qapplied quais patchs estão aplicados efetivamente no repositório. Para criar um novo patch basta executar o hg qnew <nome_do_patch> que no exemplo acima atribui o nome fix_bug_01.patch. Alteramos o arquivo e podemos ver com o glog que ao criar o patch, já é aplicado automaticamente no repositório e por padrão coloca como msg do commit [mq]: nome_do_patch.
Linhas 40 ~ 51: É incluídas as alterações feitas no patch atual através do comando hg qrefresh. É feita uma alteração no arquivo teste.py e pra ver a diferença entre hg diff e hg qdiff é executado hg diff que é a última alteração que o repostório reconhece, quando executamos o hg qrefresh ele pega as alterações e armazena internamente no patch e as alterações não ficam mais no repositório comum e sim no patch que está sendo desenvolvido com mercurial queue. O hg qdiff mostra todas as alterações incluídas(através do qrefresh) no patch.
Linhas 67 ~ 75: É verificado que o patch continua aplicado (através do qapplied) e já que o patch está completo está na hora de armazena-lo e retirá-lo da lista de aplicados através do comando hg qpop que remove do topo da fila o patch e como o único e no topo é o fix_bug_01.patch não retorna nada o comando hg qapplied e então o patch é commitado através do hg qcommit essa fila de patchs é um outro repositório interno do mercurial, se você quiser confirmar é só entrar no .hg/patches do se repositório e rodar o comando hg glog para constatar o sub-repositório de patches criado pelo MercurialQueue.
Para exportar o patch pode usar o comando hg export <nome_do_patch> e para importar para o repositório normal use hg import ou se quiser importar para uma outra lista de patches hg qimport e então o patch será adicionado ao hg qseries.
Enfim as possibilidades são enormes com o MercurialQueue, e isso foi só uma demonstração básica do uso de MercurialQueues.
Ufa! Espero que alguém tenha paciência pra ler. Essa tá longe de ser a versão final desse post. Publiquei logo para ter um norte. Portanto agradeceria bastante as sugestões de melhoria, críticas, correções e etc.
Próximos posts(Aguardem)
:
- Trabalhando com o Mercurial – Mais sobre MercurialQueues
- Trabalhando com o Mercurial – Rebaseando
- Trabalhando com o Mercurial – Resolvendo Conflitos


