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 lá – ou seria aqui !?
O Mercurial tem algumas maneiras de disponibilizar o repositório, mas eu queria:
- Uma página que dê para navegar no código
- Permitir fazer o clone via http
- Permitir fazer o pull (subir as alterações) para o servidor também via http
- Usar WSGI ao invés de CGI
- 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:
-
# a2enmod wsgi
-
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.
-
from mercurial import demandimport; demandimport.enable()
-
from mercurial.hgweb.hgwebdir_mod import hgwebdir
-
-
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:
-
[paths]
-
/ = /home/lucmult/hg/projects/*
Onde os subdiretórios de projects são repositórios mercurial distintos.
Crie um repositório como exemplo:
-
$ mkdir -p /home/lucmult/hg/projects/sandbox
-
$ echo "lero lero" > /home/lucmult/hg/projects/sandbox/readme.txt
-
$ cd /home/lucmult/hg/projects/sandbox
-
$ hg init
-
$ hg add
-
$ hg ci -m "meu primeiro commit"
-
$ echo "bip bip" >> readme.txt
-
$ hg st
-
$ hg ci -m "segundo commit"
Agora só falta o VirtualHost:
-
80> -
ServerName hg.lucmult.com.br
-
ServerAlias hg.lucianopacheco.com.br
-
-
ErrorLog /var/log/apache2/hg.lucmult.com.br-error_log
-
CustomLog /var/log/apache2/hg.lucmult.com.br-access_log common
-
-
WSGIScriptAliasMatch ^(.*) /home/lucmult/hg/hgwebdir.wsgi$1
-
-
# To enable "daemon" mode, uncomment following lines. (Read mod_wsgi docs for more info)
-
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
-
# some more interesting options (tested on mod_wsgi 2.0):
-
-
WSGIProcessGroup hg.lucmult.com.br
-
-
-
Allow from all
-
-
AuthType Digest
-
AuthName "lucmult Mercurial repositories"
-
AuthDigestProvider file
-
AuthUserFile /home/lucmult/hg/hgusers
-
-
Require valid-user
-
-
-
# a2ensite hg.lucmult.com.br
-
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.
-
$ 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.
-
$ chown -R lucmult:www-data /home/lucmult/hg/projects
-
$ 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.
-
hg clone http://hg.lucmult.com.br/sandbox
-
cd sandbox
-
echo "lero lero" >> readme.txt
-
hg st
-
hg ci
-
hg push
Fontes:
http://devlog.waltercruz.com/mercurial_web
http://mercurial.selenic.com/wiki/PublishingRepositories
http://mercurial.selenic.com/wiki/modwsgi
Muito bom artigo… Parabéns!
Gostaria de reportar que os links das fontes estao errados.
Obrigado Guilherme!
Já corrigi o texto. 😉
Até mais.
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.
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.
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.
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.
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. 😉
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
Thaks by your comment.
It can be important to others too.