Darcs



Anteriormente hemos hablado de sistemas de control de versiones basados en repositorios centralizados, con la clásica arquitectura cliente-servidor. Ahora hablaremos de darcs , donde cada copia del proyecto es un repositorio válido, y por lo tanto, es un potencial servidor.

Una arquitectura descentralizada como la de darcs tiene importantes ventajas: Las distintas ramas de desarrollo son más fáciles de administrar, y no es necesario crear cuentas de usuario en distintas máquinas para dar acceso a los desarrolladores. Si uno quiere trabajar solo, la administración es mínima, por lo que es muy bueno para quienes nunca han usado control de versiones y quieren comenzar ahora. Másss .

David Roundy es un físico dedicado a estudiar maneras de representar el cambio. Cuando se dio cuenta de que sus resultados podrían ser aplicados a sistemas de control de versiones, entonces nació Darcs, que de partida arranca con la ventaja de tener una buena base teórica sobre parches.

Pero vamos a lo práctico. Supongamos que darcs está instalado en nuestro sistema, y que tenemos un proyecto llamado sushi ubicado en un directorio homónimo. Para crear un repositorio, simplemente tenemos que ubicarnos en el directorio donde se encuentra el proyecto, y ejecutar en la linea de comandos

$ darcs init

y listo. Tenemos un repositorio válido, aunque por ahora vacío. Para agregar los archivos debemos hacer

$ darcs add *

y luego grabamos los cambios (en este caso la adición de los archivos).

$ darcs record --all

Esa acción nos pedirá un nombre para el parche y un comentario descriptivo. El repositorio ya está funcionando y puede ser adquirido por otras personas usando darcs. Si cambiamos algo en el proyecto, lo registramos nuevamente con darcs record generando un nuevo parche. Como no hay servidor , no hay necesidad de estar conectado para registrar todos los cambios o para echar marcha atrás. Yo considero esto una ventaja importante, sobre todo para trabajar solo.

Veamos ahora la manera de coordinar el trabajo con otras personas. Supongamos que el directorio es visible en una URL. Una copia del proyecto se genera de la siguiente manera.

$ darcs get http://alguna.parte.sk/sushi

Ahora existen 2 repositorios válidos del proyecto, y por supuesto, a partir de ambos se pueden generan más copias. No existe repositorio central (a menos que por consenso se genere uno). Es importante saber que cada operación de tipo record, sólo será registrado en el repositorio local. Para poder compartir los cambios entre repositorios es necesario ejecutar los comandos darcs push y darcs pull. El primero empuja cambios a otro repositorio, y el segundo trae los cambios desde otro repositorio. Aquí viene la otra ventaja. Supongamos que el otro usuario generó los parches A, B y C. A mí sólo me interesan los parches A y C. Entonces, cuando ejecuto darcs pull, puedo elegir qué parches aplicar. No tengo porqué actualizar con la última versión del proyecto.

Pushing y pulling se hace de una manera segura a través de conexiones vía ssh. Desafortunadamente, esto requiere que uno administre adecuadamente las cuentas de usuario. Pero, si uno quiere evitarse ese problema, darcs ofrece una alternativa que a mi me gusta mucho. Luego de registrar los cambios con record, se ejecuta

$ darcs send -o parche

lo que generará un archivo, llamado "parche" en este ejemplo, que puedo enviar por email como attachment. Al otro lado, quien quiera aplicar los cambios en su repositorio debe hacer

$ darcs apply parche

y seleccionar los parches que quiera para su repositorio. Como ven, todo funciona realmente de manera descentralizada.

La desventaja que tiene darcs, es que no es tan maduro como CVS o SVN, por lo tanto tiene que seguir evolucionando para mejorar algunas cosas, pero es ciertamente una buena alternativa a considerar para el control de versiones de cualquier proyecto.

 

Comentarios

Imagen de are

Error al generar el parche

Siguiendo este paso-a-paso llego a punto muerto cuando hago:

$ darcs send -o parche

Porque me sale:

No recorded local changes to send!

Y lógicamente no me crea el fichero parches

Si hago un darcs changes compruebo que hay cambios:

Wed Jun 28 10:09:42 CEST 2006  mi@mail.com
  * add html principal

Alguna pista? en que punto del proceso me he perdido?
gracias!

Imagen de Tchorix

Te falta el 'record'

Hola are.

Me alegro que le estés dando una oportunidad a darcs. Una vez que te vas acostumbrando las cosas van muy fáciles.... según lo que describes, lo que te falta es decidir qué cambios irán incluídos en el parche. Porque puede ser que no quieras incluir todo lo que haz cambiado hasta el momento. Entonces, tienes que hacer 'darcs record' e ir seleccionando que cambios incluyes. Ahora, si realmente quieres incluir todo, entonces haces 'darcs record --all'.

Ahora que tienes el parche creado puedes hacer el send.
Eso, ojalá que sirva.
Tchorix

Imagen de Alvaro

Como diría Humbertito, me asalta una duda....

....Qué tan útil es un sistema de control de versiones cuando se trabaja solo? Mi punto va a que probablemente sirva para estandarizar el sistema de respaldos dentro de una organización (suponiendo varias personas que trabajan en distintos proyectos de manera individual). Sin embargo, hay otras ventajas? Pregunto porque aunque he utilizado SVN nunca lo he considerado más que un overhead burocrático cuando me toca desarrollar proyectos en que soy el único que programa. Quizás no estoy considerando otras ventajas, algunas ideas al respecto?


Alvaro Graves - agraves [at] dcc punto uchile punto cl
MSN: no_mas_zpam [@] correocaliente punto com
AngulArt, rock prog
WordNet in RDF

Imagen de Tchorix

Marcha atrás

Yo lo uso más que todo por las marchas atrás.... cuando el código deja de pasar el test suite, y ya no tengo idea donde que rompió, con el controlador de versiones hecho marcha atrás y reimplemento de nuevo lo que está dando problema hasta encontrar y reparar la pifia.

Esa es la principal ventaja desde mi punto de vista.
saludos
Tchorix

Imagen de Geddy

Branching. Historia. Soporte.

1.- Conservas la historia de tu desarrollo.
2.- Te permite hacer branches de tu desarrollo en forma cómoda, para probar alternativas. (nueva estrategia de caching? se puede intentar si tener que dejar el proyecto irreparablemente hackeado en caso que la idea no sea buena)
3.- Estás trabajando en un proyecto que ya tiene una versión en producción. Tu jefe te trae un bug report desde terreno... pero la versión que está en producción no es exactamente la que tienes en tu ambiente de desarrollo, y la que tienes en tu ambiente no está lista para producción. Si tienes tu proyecto en SVN o algo así puedes hacer un checkout de la versión que está donde el cliente (¡ES IMPRESCINDIBLE LLEVAR CUENTA DE QU

Imagen de ChaTo

Si estás sólo ...

Efectivamente es una forma de estandarizar tus respaldos, PERO hay otro caso de uso para un usuario aislado (aunque el uso realmente importante es cuando hay dos o más personas):

Supongamos que haces el programa PROG y lo ejecutas, obteniendo la salida PROG.DAT la cual conservas. Luego vas mejorando tu programa y ya no es compatible con el formato de PROG.DAT, pero tienes que hacer algo con él ... bueno lógicamente restituyes una copia de tu programa al estado anterior, y logras trabajar con la salida que guardaste, pero encuentras un error, lo modificas, y luego te das cuenta que el error que encontraste aún existe en tus versiones más nuevas ... un sistema de control de versiones te permitiría aplicar ese cambio a la versión nueva automáticamente, uniendo las dos ramas.

De todos modos obviamente un sistema de control de versiones es mejor cuando trabajas con otra gente, pero mantener los respaldos bien organizados para mí es suficiente motivo como para usar uno, sobre todo si tiene poco overhead.

Saludos,

—ChaTo (ecosofia.org)