Darcs es un sistema de control de versiones distribuido creado por David Roundy . Las características principales incluyen la capacidad de elegir qué cambios aceptar de otros repositorios, la interacción con otros repositorios locales (en disco) o repositorios remotos a través de SSH , HTTP o correo electrónico, y una interfaz inusualmente interactiva. Los desarrolladores también enfatizan el uso de herramientas de software avanzadas para verificar la corrección: el sistema de tipos expresivos del lenguaje de programación funcional Haskell hace cumplir algunas propiedades, y las pruebas aleatorias a través de QuickCheck verifican muchas otras. [3] El nombre es un acrónimo recursivo de Darcs Advanced Revision Control System . [4]
Darcs trata a los parches como ciudadanos de primera clase . Para el usuario, un repositorio puede verse como un conjunto de parches, donde cada parche no está necesariamente ordenado con respecto a otros parches, es decir, el conjunto de parches es solo un conjunto parcialmente ordenado . En muchos casos, los parches se pueden transmitir de forma independiente entre varios repositorios.
Muchas operaciones de ramificación, fusión y selección de elementos que requerirían comandos adicionales con sistemas basados en instantáneas como Git o Mercurial se pueden realizar directamente con Darcs con los comandos "pull" y "push" habituales. En términos de interfaz de usuario, esto significa que Darcs tiene menos comandos. Estos comandos son más interactivos: uno puede elegir con mayor precisión qué parches desea intercambiar con repositorios remotos.
Los parches de un repositorio se ordenan linealmente. Darcs calcula automáticamente si los parches se pueden reordenar (una operación llamada conmutación) y cómo hacerlo. Estos cálculos implementan la denominada "teoría de parches".
Un parche de Darcs puede contener cambios de los siguientes tipos:
La noción de dependencia entre parches se define sintácticamente. Intuitivamente, un parche B depende de otro parche A si A proporciona el contenido que B modifica. Esto significa que los parches que modifican diferentes partes del código se consideran, por defecto, independientes. Para abordar los casos en los que esto no es deseable, Darcs permite al usuario especificar dependencias explícitas entre parches.
Desde la versión 2.10, Darcs utiliza la diferencia de paciencia [ cita requerida ] de forma predeterminada.
Darcs surgió de los esfuerzos de David Roundy por diseñar un nuevo formato de parches para GNU Arch en junio de 2002. Estas discusiones no llevaron a que se enviara código a Arch, pero sí a la concepción de la teoría de parches. Después de escribir una versión inicial de Darcs en C++ , la versión Haskell se escribió en otoño de 2002 y se lanzó al público en abril de 2003. Darcs 2.0 se lanzó en abril de 2008 e introdujo un formato de repositorio más robusto, así como una nueva semántica de parches llamada "darcs-2", destinada a minimizar los conflictos de fusión exponencial . [5] La estrategia de desarrollo actual se centra en implementar optimizaciones y agregar nuevas características, manteniendo al mismo tiempo el mismo formato de repositorio.
Darcs ha sido criticado por sus problemas de rendimiento. [6] [7] Esto incluye desafíos relacionados con los algoritmos de fusión de Darcs 1.x, que mostraron un trabajo exponencial para fusionar ciertos conflictos. Aunque no se resolvió por completo en las versiones posteriores de Darcs, [8] la frecuencia de fusiones exponenciales mostró reducciones notables.
Todavía quedan errores en los que falla la fusión de conflictos recursivos. [9]