hgweb - Configurando el servidor web

Leí en más de un lugar que la configuración de hgweb, el repositorio web de mercurial, es difícil de lograr.

Había yo empezado a tratar de poner dicho repositorio en un servidor web que tengo con HostGator; pero cuando me topé con pared, decidí empezar por ponerlo localmente.

Servidor local

Los requisitos son sencillos de lograr. Básicamente:

  • Servidor web con soporte para CGI.
  • mod_python ó mod_wsgi
  • Python
  • Mercurial

Crear directorios y permisos

Hay 2 directorios que crear:

  • El lugar donde físicamente se van a guardar los repositorios (yo usé /var/hg/)
  • El folder web para acceder a hgweb (yo usé /var/www/html/hg/)

Ambos directorios deben tener permisos adecuados de tal forma que apache (o el servidor web que uses) pueda leer y ejecutar el script web y escribir al repositorio.

Nota: Si tienes SELinux habilitado, es más complicado; y no pienso cubrir cómo hacerlo.

hgweb.cgi

Éste archivo debe localizarse en el disco duro (se crea cuando se instala mercurial) y copiarlo al folder web. Yo aparte lo renombré a index.cgi. Hay un solo parámetro que tuve que configurar; la ubicación del archivo de configuración:

config = "/var/www/html/hg/hgweb.config"

hgweb.wsgi

Resulta que hay 2 versiones de hgweb; una es la cgi y la otra es la wsgi. Aparentemente la wsgi tiene mejor desempeño, pero para términos de este "tutorial", vamos a usar el cgi.

hgweb.config

Éste archivo simplemente lo configuré de la siguiente manera:

[web]
baseurl = /hg
[paths]
/ = /var/hg/*

En la sección de [paths], le estoy diciendo que publique todos los repositorios que encuentre bajo /var/hg/.

El código

Después de hacer un hg init en mi proyecto, se crea automátivamente el sub-folder .hg; pero yo debo crear manualmente el archivo .hg/hgrc con los siguientes contenidos:

[web]
description = Descripción de mi proyecto.
contact = Rodrigo Flores
allow_push = *
push_ssl = false
[paths]
default-push = http://localhost/hg/test/

Los parámetros description y contact son bastante directos, pero vale la pena mencionar los otros 3:

  • allow_push - Es el listado de usuarios que tienen permiso de hacer un push.
  • push_ssl - Determina si debemos usar ssl. Como mi servidor local no tiene habilitado https, lo deshabilité.
  • default-push - Determina a dónde hacer un push cuando no se especifica una ruta.

La primera vez, tuve que copiar manualmente mi código (con todo y la carpeta .hg) a /var/hg/; pero posteriormente pude escribir cambios y consultar en la página web de mi servidor local.

UTF-8 y httpd.conf

Un problema con el que me topé durante mucho tiempo era que no se desplegaban correctamente los caracteres especiales y no encontraba una forma de configurar para que usara utf-8. Hasta que encontré el reporte de un Bug al respecto.

La solución consiste en agregar una directiva SetEnv en httpd.conf:

<Directory "/var/www/html/hg/">
    SetEnv HGENCODING utf-8
    ...
</Directory>

Servidor remoto

Al ver que realmnte había sido muy sencillo instalarlo, volví a probar en mi servidor compartido.

Resulta que no tengo soporte para mod_python en mi plan.

Enlaces