Mercurial – Publique seu repositórios

July 11, 2009 by lucmult Leave a reply »
Mercurial Logo

Mercurial Logo

Já tem um tempo que eu quero começar a usar o Mercurial de verdade e como agora eu tenho um host nada mais justo de disponibilizar meus repositórios – ou seria aqui !?

O Mercurial tem algumas maneiras de disponibilizar o repositório, mas eu queria:

  1. Uma página que dê para navegar no código
  2. Permitir fazer o clone via http
  3. Permitir fazer o pull (subir as alterações) para o servidor também via http
  4. Usar WSGI ao invés de CGI
  5. Integrar no apache que eu já tenho configurado lá

Servidor: Ubuntu 8.10

Eu estou utilizando o repositóro do mercurial, assim eu tenho a última versão, mas deve funcionar com a versão padrão do Ubuntu.

Pacotes necessários: mercurial, mercurial-common, libapache2-mod-wsgi

Talvez tenha mais algum, mas eu não lembrei de anotar durante a instalação :-/

Como eu já disse, eu já tinha o apache rodando com alguns Virtuais Hosts, eu queria apenas adicionar mais um Virtual Host naparte do apache.

Verifique se o mod_wsgi já está habilitado:

  1. # a2enmod wsgi
  2. Module wsgi already enable

A configuração é dividia em 3 partes:

1 – VirtualHost no Apache
2 – A aplicação mercurial.web (WSGI)
3 – Os repositórios hg (mercurial)

Eu criei uma pasta na home para manter a aplicação e os repositórios

Criei o arquivo hgwebdir.wsgi, ou baixe direto do repositório contrib do Mercurial.

Arquivo: /home/lucmult/hg/hgwebdir.wsgi
  1. from mercurial import demandimport; demandimport.enable()
  2. from mercurial.hgweb.hgwebdir_mod import hgwebdir
  3.  
  4. application = hgwebdir('/home/lucmult/hg/hgweb.config')

O arquivo só precisa dessas 3 linhas.

IMPORTANTE: Utilize o caminho absoluto do arquivo de configuração, eu perdi muito tempo por conta desse detalhe.

Crie o arquivo de configuração que referenciamos no arquivo anterior.

Hoje, o modo correto de publicar vários repositórios é assim:

Arquivo: /home/lucmult/hg/hgweb.config
  1. [paths]
  2. / = /home/lucmult/hg/projects/*

Onde os subdiretórios de projects são repositórios mercurial distintos.

Crie um repositório como exemplo:

  1. $ mkdir -p /home/lucmult/hg/projects/sandbox
  2. $ echo "lero lero" > /home/lucmult/hg/projects/sandbox/readme.txt
  3. $ cd /home/lucmult/hg/projects/sandbox
  4. $ hg init
  5. $ hg add
  6. $ hg ci -m "meu primeiro commit"
  7. $ echo "bip bip" >> readme.txt
  8. $ hg st
  9. $ hg ci -m "segundo commit"

Agora só falta o VirtualHost:

Arquivo: /etc/apache2/sites-available/hg.lucmult.com.br
  1. <VirtualHost *:80>
  2.     ServerName hg.lucmult.com.br
  3.     ServerAlias hg.lucianopacheco.com.br
  4.  
  5.     ErrorLog /var/log/apache2/hg.lucmult.com.br-error_log
  6.     CustomLog /var/log/apache2/hg.lucmult.com.br-access_log common
  7.  
  8.     WSGIScriptAliasMatch ^(.*) /home/lucmult/hg/hgwebdir.wsgi$1
  9.  
  10.     # To enable "daemon" mode, uncomment following lines. (Read mod_wsgi docs for more info)
  11.     WSGIDaemonProcess hg.lucmult.com.br user=lucmult group=lucmult threads=15 maximum-requests=1000 processes=2 umask=0007 display-name=wsgi-hg.lucmult.com.br
  12.     # some more interesting options (tested on mod_wsgi 2.0):
  13.  
  14.     WSGIProcessGroup hg.lucmult.com.br
  15.  
  16.     <Location />
  17.         Allow from all
  18.  
  19.         AuthType Digest
  20.         AuthName "lucmult Mercurial repositories"
  21.         AuthDigestProvider file
  22.         AuthUserFile /home/lucmult/hg/hgusers
  23.         <LimitExcept GET>
  24.             Require valid-user
  25.         </LimitExcept>
  26.     </Location>
  27. </VirtualHost>
Habilitar o Virtual Host
  1. # a2ensite hg.lucmult.com.br
  2. Site hg.lucmult.com.br already enabled

No arquivo de configuração do VirtualHost tá configurado para fazer autenticação, quando for fazer o push para o servidor.

Para criar os usuários utilize:
  1. $ htdigest  -c hgusers 'lucmult Mercurial repositories' lucmult

Onde:
-c hgusers Criar o arquivo hgusers
'lucmult Mercurial repositories' Identificação, mesmo texto que foi configurado em AuthName no Virtual Host
lucmult Nome do usuário a ser criado

Mais uma configuração que tem que ser feita, agora com relação a permissão.
Tudo que fizemos na pasta /home/lucmult/hg, foi com o usuário lucmult, com isso o usuário que roda o apache (www-data) não tem permissão de escrita na pasta e isso impede o funcionamento.

Atribuindo permissão para o grupo do apache www-data
  1. $ chown -R lucmult:www-data /home/lucmult/hg/projects
  2. $ chmod -R g+rw  /home/lucmult/hg/projects

Imporante o endereço DNS hg.lucmult.com.br, tem que ser configurado no seu DNS.

Pronto agora é só reiniciar o seu apache e acessar o seu repositório, via browser ou via linha de comando. :-)

  1. hg clone http://hg.lucmult.com.br/sandbox
  2. cd sandbox
  3. echo "lero lero" >> readme.txt
  4. hg st
  5. hg ci
  6. hg push

Fontes:
http://devlog.waltercruz.com/mercurial_web
http://mercurial.selenic.com/wiki/PublishingRepositories
http://mercurial.selenic.com/wiki/modwsgi

Advertisement

10 Responses

  1. Guilherme Wunsch says:

    Muito bom artigo… Parabéns!

    Gostaria de reportar que os links das fontes estao errados.

  2. lucmult says:

    Obrigado Guilherme!

    Já corrigi o texto. ;-)

    Até mais.

  3. Guilherme Wunsch says:

    Você ja tentou efetuar esse processo em Windows? Estou tentando mas esta me dando o seguinte erro:

    mod_wsgi (pid=564): Target WSGI script ‘C:/Arquivos de programas/Apache Software Foundation/Apache2.2/cgi-bin/hgwebdir.wsgi’ cannot be loaded as Python module.
    mod_wsgi (pid=564): Exception occurred processing WSGI script ‘C:/Arquivos de programas/Apache Software Foundation/Apache2.2/cgi-bin/hgwebdir.wsgi’.

    Tem uma idéia do que pode ser?
    Obrigado.

  4. lucmult says:

    Eu, particularmente, ainda não fiz no Windows.

    Mas parece que está ocorrendo algum erro (Traceback) no seu hgwebdir.wsgi.

    E o problema acho não está relacionado a ser no Windows.

    Dá uma olhada aqui que talvez te ajude.
    http://code.google.com/p/modwsgi/wiki/VirtualEnvironments

    Outra ideia é verificar os logs para maiores informações sobre o erro (TraceBack).

    Se você tiver o TraceBack mande aqui, que fica mais fácil de ajudar. :-)

    Até mais.

  5. Guilherme Wunsch says:

    Os únicos logs que ficam registrados são esses. Eu pelo menos, desconheço outros logs. TraceBack? Se possível poderiamos trocar uma idéia por MSN ou ICQ? Se sim, poderia me enviar um e-mail com seus contatos?

    Desde já, muito obrigado.

  6. Guilherme Wunsch says:

    Achei gravado em um arquivo de logs de erros do apache e não do VirtualHost:

    “[Fri Aug 07 10:26:10 2009] [error] [client 192.168.0.62] Traceback (most recent call last):
    [Fri Aug 07 10:26:10 2009] [error] [client 192.168.0.62] File “C:/Arquivos de programas/Apache Software Foundation/Apache2.2/cgi-bin/hgwebdir.wsgi”, line 11, in
    [Fri Aug 07 10:26:10 2009] [error] [client 192.168.0.62] from mercurial import demandimport; demandimport.enable()
    [Fri Aug 07 10:26:10 2009] [error] [client 192.168.0.62] ImportError: Bad magic number in C:\\Arquivos de Programas\\Mercurial\\lib\\mercurial\\__init__.pyc”

    Será que isso pode ajudar?
    Nesse mesmo arquivo percebi que a versão que tenho do Python é 2.6.2 e o módulo foi compilado para 2.6.1, será que tem algo haver?

    Obrigado pela força.

  7. lucmult says:

    O problema é esse mesmo. :-)

    Instale o Python 2.6.1 que deve funcionar.

    Ou instale o mod_wsgi compilado para o 2.6.2.

    Pode me procurar como lucmult no GMail. ;-)

  8. Frank Malina says:

    I had to enable auth_digest on Apache2/Ubuntu 9.04

    sudo ln -s /etc/apache2/mods-available/auth_digest.load /etc/apache2/mods-enabled/auth_digest.load

    and remove: “Allow from all” from VirtualHost file.

    Apart from that your recipe worked great. Thank you

  9. lucmult says:

    Thaks by your comment.

    It can be important to others too.

Trackbacks/
Pingbacks

  1. Customize o hg web « lucmult

Leave a Reply