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