# Darcs

Darcs es un sistema de control de versiones distribuido creado por David Roundy. Las características clave son: la habilidad de escoger que cambios aceptar de otros repositorios, interacción con otros repositorios locales (en disco) o repositorios remotos vía SSH, HTTP o correo electrónico, y una inusual interfaz interactiva. Los desarrolladores también hacen hincapié en el uso de herramientas de software avanzadas para la verificación de la corrección: el sistema de tipo expresivo del lenguaje de programación funcional Haskell hace cumplir algunas propiedades, y las pruebas al azar a través de QuickCheck verifica muchos otros. El nombre es un acrónimo recursivo para el sistema de control de versiones avanzada Darcs Advanced Revision Control System.

## Modelo

Darcs trata los parches como ciudadanos de primera clase. Para el usuario, un repositorio puede ser visto como un conjunto de parches, donde cada parche no es necesariamente requerido con relación a otros parches es decir, el conjunto de parches es sólo un conjunto parcialmente ordenado. En muchos casos, los parches pueden ser transmitidos de forma independiente entre varios repositorios.
Muchas operaciones de ramificación, fusión y cherry-picking que requieren comandos adicionales con sistemas basadas en snapshots como Git o Mercurial, se pueden hacer directamente con Darcs con los comandos comunes "pull" y "push". En cuanto a la interfaz de usuario, esto significa que Darcs tiene menos comandos. Además estos comandos son más interactivos ya que se puede elegir con más precisión que parches se quiere intercambiar con repositorios remotos.
En el sistema de archivos, los parches de un repositorio están ordenados linealmente. Darcs calcula automáticamente si los parches se pueden reordenar (una operación llamada conmutación), y la forma de hacerlo. Estos cálculos implementar la llamada "teoría de parches".
Un parche Darcs puede contener cambios de los siguientes tipos:
* Cambios en las líneas
* Creación y eliminación de archivos y directorios
* Movimiento de archivos y directorios
* Sustitución de palabras (utilizado normalmente en la refactorización de código, por ejemplo, cambiar el nombre de todas las apariciones de "foo" en un archivo determinado)
La noción de dependencia entre los parches se define sintácticamente. Intuitivamente, un parche B depende de otro parche A si A proporciona los contenidos que B modifica. Esto significa que los parches que modifican diferentes partes del código se consideran, de forma predeterminada, independientes. Para hacer frente a los casos en que esto no es deseable, Darcs permite al usuario especificar dependencias explícitas entre parches.
Desde la versión 2.10, Darcs usa patience diff por defecto.

## Historia

Darcs evolucionaron a partir de los esfuerzos de David Roundy para diseñar un nuevo formato de parche para GNU arch en junio de 2002. Estas discusiones no llevaron a ningún código que se está comprometido con Arch, pero dieron lugar a su teoría de parches. Después de escribir una primera versión de Darcs en C++, la versión Haskell fue escrito en otoño de 2002 y lanzado al público en abril de 2003. Darcs 2.0 ya lanzado en abril de 2008 e introdujo un formato de repositorio más robusto y una nueva semántica de parches llamados darcs-2, con el objetivo de minimizar los problemas de fusión de exponenciales. La línea actual de desarrollo contiene muchas optimizaciones y nuevas características, manteniendo el mismo formato de repositorio.

## Deficiencias

Darcs ha sido criticado por motivos de rendimiento. La peor de estas cuestiones fue el algoritmo de fusión de Darcs 1.x que, en el peor de los casos, podría hacer un trabajo exponencial de fusionar algunos conflictos. Aunque el tema no ha sido completamente corregida en Darcs 2, las fusiones exponenciales han sido minimizadas. Aún permanecen errores en el que la fusión de los conflictos recurrentes falla.