# Monotone

Monotone es una herramienta software de fuente abierta para control distribuido de versiones.
Monotone registra revisiones de ficheros, agrupa conjuntos de revisiones ('changesets') y mantiene el histórico tras cambios de nombre. El principio de diseño es el de operación distribuida haciendo gran uso de primitivas criptográficas para trazar revisiones de ficheros (mediante el hash seguro SHA-1) y para autenticar acciones de usuarios (mediante firmas criptográficas RSA). Cada participante mantiene su propio almacén de revisiones históricas en una base de datos SQLite local.
Monotone es especialmente potente en su soporte de la rutina de separación/integración ('diverge/merge'), que consigue en parte al permitir siempre hacer 'commit' antes de integrar. Las revisiones se intercambian haciendo uso del protocolo propio netsync, que tiene su propio puerto (4691) asignado por IANA y dispone de un plugin para Wireshark que permite el análisis de tráfico (netsync comparte cierto terreno conceptual con rsync y cvsup). El enfoque del proyecto está en la integridad por encima del rendimiento.
Antes de ciertas optimizaciones importantes en la revisión 0.27, se solía culpar a este énfasis en la corrección en lugar de optimización como la causa de malas experiencias iniciales. La primera acción de un usuario nuevo suele ser sincronizar (clonar) una gran base de datos de Monotone ya existente, acción que solía llevar horas de ejecución debido a las comprobaciones exhaustivas de validación e integración que realiza Monotone cuando se mueven revisiones por la red. Una vez poblada la base de datos inicial (clon), las acciones posteriores suelen ser rápidas. Sigue habiendo espacio para optimizaciones en algunas de las funciones menos habituales.

## Características

Al igual que GNU arch y al contrario que Subversion, Monotone se basa en un modelo distribuido de control de versiones. Usa hashes SHA-1 en lugar de números de versión a la hora de identificar ficheros o grupos de ficheros específicos, al igual que Git y Mercurial.
Aunque Monotone solía admitir varios protocolos de red para sincronizar árboles, ahora usa de forma exclusiva un protocolo propio bautizado netsync, que es más robusto y eficiente (sin embargo, desde la versión 0.27, es posible usar el protocolo netsync sobre otros medios, incluyendo conexiones ssh). No existe un servidor específico debido a que cualquier cliente Monotone puede actuar como servidor, de acuerdo con el principio end-to-end (comunicación directa entre extremos, que aparece en el diseño de TCP).
Algunas otras características de Monotone son:
* Buen soporte de internacionalización y localización
* Diseño portable, implementado en C++
* Monotone puede importar proyectos de CVS.
* Firma de las revisiones usando certificados RSA
* Fácil de aprender, debido a un juego de órdenes similar al de CVS
* Buena documentación
En enero de 2008, entre las posibles desventajas de Monotone se incluían:
* Menor popularidad que algunos sistemas en competencia, como Git o Mercurial
* Problemas de rapidez en ciertas operaciones (más evidente en la clonación inicial)
* Ausencia general de interfaces gráficas estables, aunque hay algunas en vías de desarrollo, como TracMtn, un plugin para Trac que permite navegar por un repositorio y su histórico, o guitone, un frontal escrito en Qt para gestionar bases de datos y espacios de trabajo.

## 'Milestones'

La versión 0.26 de Monotone introdujo grandes cambios a la estructura interna de la base de datos, incluyendo una nueva estructura conocida como roster por los desarrolladores de Monotone. Las bases de datos de Monotone creadas con la versión 0.26 no pueden intercambiar revisiones con otras más antiguas. Estas últimas han de ser actualizadas antes al nuevo formato. El nuevo protocolo netsync es incompatible con versiones anteriores de Monotone.

## Implementación

Monotone está implementado en un C++ de dialecto moderno sobre la biblioteca de sistema Boost, la biblioteca criptográfica Botan y la base de datos SQLite. Monotone admite personalización y extensión mediante funciones de enganche (hooks) escritos en el Lenguaje de programación Lua. El proceso de construcción de monotone está automatizado usando BuildBot e incluye pruebas de regresión exhaustivas.

## Monotone como inspiración de Git

En abril de 2005, Monotone disfrutó de un interés creciente dentro de la comunidad del software libre tras mencionarlo Linus Torvalds como un posible reemplazo para BitKeeper en el proceso de desarrollo de Linux. En lugar de adoptar Monotone, Torvalds escribió su propio sistema SCM, Git. El diseño de Git usa algunas ideas Monotone, pero los proyectos no comparten nada en su código central.
Uno de los problemas claves debatidos fue si el reemplazo de BitKeeper debía admitir la técnica denominada cherry picking, mediante la cual el encargado de un árbol puede aprobar un subconjunto de cambios mientras que rechaza otros, de forma individual.
Linus argumenta que este enfoque "da como resultado una dinámica y psicologías equivocadas en el sistema", pasando los problemas a los mantenedores principales en lugar de forzar a los que contribuyen los cambios a hacer el esfuerzo de mantener sus propios árboles libres de basura.
Además, argumenta que Monotone sostiene la actitud correcta en su aversión a ofrecer esta técnica como característica, para luego, sin embargo, estropearlo al no llevar esta actitud lo suficientemente lejos como para facilitar la "expulsión" de árboles de trabajo sucios después de que hayan servido su propósito. Además, hizo saber su impresión de que Monotone no había alcanzado por entonces el nivel de rendimiento precisado por un proyecto tan grande como el desarrollo del núcleo Linux.
Este argumento es contrario a la percepción de muchos desarrolladores de software del cherry picking como característica avanzada que una herramienta SCM debería admitir. Otras herramientas, como Darcs, son particularmente potentes en este aspecto. Incluso Git lo admite ahora, mediante la orden "git cherry-pick".

## Soporte técnico

En la actualidad, el soporte de este software se encuentra disponible mediante las listas de correo electrónico, IRC y un wiki de soporte.

## Usuarios de Monotone

* Xaraya Un marco de creación de aplicaciones para PHP
* OpenEmbedded, usado para crear distribuciones Linux para sistemas embebidos.
* El IM Pidgin (anterior proyecto Gaim) usa Monotone ahora tanto para Pidgin como para libpurple (anteriormente, libgaim)