Cómo evitar tener más de dos cabezas en Mercurial

0
6686

Creación: 16-10-2010

Índice de contenidos

1.Introducción
2. Entorno
3.Configurando un Hook en Mercurial para evitar tener más de una cabeza
4.Conclusiones
5.Sobre el autor


1. Introducción

Mercurial es un repositorio de código distribuido. Cada vez que hacemos un commit en el repositorio se crea una nueva revisión.

Ahora imaginemos que estamos trabajando varios a la vez (lo que viene siendo un equipo ;). En estos casos es muy habitual que, aunque Mercurial es distribuido y cada uno puede ir “por su cuenta”, tengamos un repositorio “central” donde al final todos los desarrolladores acabarán subiendo (push) todos sus cambios. Este repositorio central suele estar enlazado con un sistema de integración continua (por ejemplo el Hudson), y el código que aquí se encuentra será el que usemos para sacar a nuestras releases (digamos que el repositorio donde consolidamos los cambios de todos los desarrolladores).

Podría pasar, y de hecho es bastante fácil, que en este repositorio central aparecieran más de una cabeza. Imaginemos que tenemos dos desarrolladores: Alice y Bob. Los dos clonan el repositorio central cuando éste está en la revisión “d”. Y se ponen a hacer cambios, de forma que Bob añade la revisión “e” y la “f”, mientras que Alice añade la revisión “g”.

 

Si ahora los dos suben los cambios al repositorio central (push) como los dos partieron de la revisión “d”, se crearán dos cabezas.

Esto no es para nada recomendable en el repositorio central, ya que aquí lo que queremos precisamente es tener una única “línea” de trabajo donde se mezcla (merge) adecuadamente el código de todos los desarrolladores.

Podríamos entrar en el repositorio central y hacer un merge a mano, pero ésto es más bien incómodo tratándose de un repositorio central. Además lo que queremos es que cada desarrollador sea responsable de hacer el merge con el código de sus compañeros y garantizar que el resultado funciona (por lo menos debería pasar todos los test 😉

En este tutorial vamos a ver cómo podemos configurar Mercurial para no permitir que exista más de una cabeza en el repositorio central.

Nota: Idea sacada de
http://www.softwareprojects.com/resources/programming/t-mercurial-hook-forbid-2-heads-1910.html


2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 17′ (2.93 GHz Intel Core 2 Duo, 4GB DDR3 SDRAM, 128GB Solid State Drive).
  • NVIDIA GeForce 9400M + 9600M GT with 512MB
  • Sistema Operativo: Mac OS X Snow Leopard 10.6.4
  • Mercurial 1.6.2


3. Configurando un Hook en Mercurial para evitar tener más de una cabeza

Mercurial, al igual que otros tantos repositorios de código, dispone de un sistema de eventos, de forma que cuando se hacen operaciones sobre el repositorio podemos enganchar un Hook (garfio) a este evento, para realizar ciertas operaciones. Es muy
típico, por ejemplo configurar un hook para que, en cuento se hace commit se llame al sistema de integración continua.

Vamos a utilizar esta funcionalidad para que cuando se haga push en el repositorio central, se ejecute un script que compruebe el número de cabezas, y si es superior a 1, abortaremos el push y daremos un mensaje de error.

Lo primero que vamos a hacer es copiar el siguiente script en el directorio de extensiones de Mercurial del repositorio central (puede ser cualquier directorio, ya que luego indicaremos la ruta en el fichero de configuración). Por ejemplo, lo podemos poner en
/var/lib/hg/hgext/forbid_2head/forbid_2head.py

# win32text.py - LF <-> CRLF translation utilities for Windows users
#
# This software may be used and distributed according to the terms
# of the GNU General Public License, incorporated herein by reference.
#
# To forbid pushes which creates two or more headss
#
# [hooks]
# pretxnchangegroup.forbid_2heads = python:forbid2_head.forbid_2heads

from mercurial import ui
from mercurial.i18n import gettext as _

def forbid_2heads(ui, repo, hooktype, node, **kwargs):
        if len(repo.heads()) > 1:
                ui.warn(_('Trying to push more than one head, try run "hg merge" before it.n'))
                return True

 

Ahora en el fichero de configuración de Mercurial (el /etc/mercurial/hgrc) del repositorio central añadimos:

[hooks]
pretxnchangegroup.forbid_2heads = python:forbid_2head.forbid_2heads

[extensions]
forbid_2head=/var/lib/hg/hgext/forbid_2head/forbid_2head.py

 

A partir de ahora si al hacer un push va a provocar que exista más de una cabeza, el repositorio central abortará la operación y nos mostrará el mensaje “Trying to push more than one head, try run "hg merge" before it.”, evitando así posibles
despistes de los desarrolladores.

4. Conclusiones

Como digo siempre, es fundamental conocer las herramientas que manejamos y automatizar todos los procesos posibles para evitar despistes que luego nos pueden hacer perder mucho tiempo.

Con este tutorial hemos visto cómo configurar un pequeño Hook de Mercurial para forzar a los miembros del equipo a mezclar su código con el del resto de compañeros antes de hacer la subida al repositorio central donde tendremos configurado el servidor de integración contínua.

5. Sobre el autor

Alejandro Pérez García, Ingeniero en Informática (especialidad de Ingeniería del Software) y Certified ScrumMaster.

Socio fundador de Autentia (Formación, Consultoría, Desarrollo de sistemas transaccionales).

mailto:alejandropg@autentia.com

Autentia Real Business Solutions S.L. – «Soporte a Desarrollo».

http://www.autentia.com

 

Alejandro es socio fundador de Autentia y nuestro experto en Java EE, Linux y optimización de aplicaciones empresariales. Ingeniero en Informática y Certified ScrumMaster. Seguir @alejandropgarci Si te gusta lo que ves, puedes contratarle para darte ayuda con soporte experto, impartir cursos presenciales en tu empresa o para que realicemos tus proyectos como factoría (Madrid). Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación.

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad