igor@403: \chapter{Introducción}
igor@402: \label{chap:intro}
igor@402: 
igor@403: \section{Acerca del control de revisiones}
igor@403: 
igor@403: El control de revisiones es el proceso de administrar diferentes
igor@403: versiones de una pieza de información. En su forma más simple es algo
igor@403: que la mayoría de gente hace a mano: cada vez que usted modifica un
jerojasro@509: fichero, lo graba con un nuevo nombre que contiene un número, cada uno
jerojasro@509: mayor que el anterior.
jerojasro@509: 
jerojasro@509: Administrar manualmente muchas versiones de incluso sólo un fichero es una tarea
igor@403: propensa a errores, a pesar de que hace bastante tiempo hay
igor@403: herramientas que ayudan en este proceso.  Las primeras herramientas
igor@403: para automatizar el control de revisiones fueron pensadas para que un
igor@403: usuario administrara un solo fichero.  En las décadas pasadas, el
igor@403: alcance de las herramientas de control de revisiones ha ido aumentando
igor@408: considerablemente; ahora manejan muchos ficheros y facilitan el
igor@403: trabajo en conjunto de varias personas. Las mejores herramientas de
igor@403: control de revisiones de la actualidad no tienen problema con miles de
jerojasro@509: personas trabajando en proyectos que consisten de cientos de miles de
igor@403: ficheros.
igor@403: 
igor@403: \subsection{¿Por qué usar control de revisiones?}
igor@403: 
igor@403: Hay muchas razones por las cuales usted o su equipo desearía usar una
igor@403: herramienta automática de control de revisiones para un proyecto.
igor@402: \begin{itemize}
jerojasro@517: \item Llevar registro del historial y la evolución de su proyecto, para
jerojasro@509:   evitar hacer la tarea manualmente. Por cada cambio, tendrá una
igor@403:   bitácora de \emph{quién} lo hizo; \emph{por qué} se hizo;
igor@403:   \emph{cuándo} se hizo; y de \emph{qué} se trataba el cambio.
igor@403: \item Cuando trabaja con más personas, los programas de control de
igor@403:   revisiones facilitan la colaboración.  Por ejemplo, cuando varias
jerojasro@509:   personas hacen cambios potencialmente incompatibles de forma casi
jerojasro@509:   simultánea, el programa le ayudará a identificar y resolver tales
igor@403:   conflictos.
igor@403: \item Puede ayudarle a recuperarse de equivocaciones. Si aplica un
igor@403:   cambio que posteriormente se evidencia como un error, puede
igor@403:   revertirlo a una versión previa a uno o muchos ficheros. De hecho,
igor@403:   una herramienta \emph{realmente} buena, incluso puede ayudarle
igor@403:   efectivamente a darse cuenta exactamente cuándo se introdujo el
jerojasro@509:   error (para más detalles ver la sección~\ref{sec:undo:bisect}).
jerojasro@509: \item Le ayudará a trabajar simultáneamente, y a manejar las diferencias
igor@403:   entre múltiples versiones de su proyecto.
igor@402: \end{itemize}
jerojasro@476: La mayoría de estas razones son igualmente válidas ---por lo menos en
jerojasro@509: teoría--- así esté trabajando en un proyecto solo usted, o con mucha gente.
igor@403: 
igor@403: Algo fundamental acerca de lo práctico de un sistema de control de
jerojasro@509: revisiones en estas dos escalas (``un hacker solitario'' y ``un equipo
igor@403: gigantesco'') es cómo se comparan los \emph{beneficios} con los
igor@403: \emph{costos}.  Una herramienta de control de revisiones que sea
igor@403: difícil de entender o usar impondrá un costo alto.
igor@403: 
igor@403: Un proyecto de quinientas personas es muy propenso a colapsar
jerojasro@509: solamente con su peso inmediatamente sin una herramienta y un proceso
jerojasro@509: de control de versiones. En este caso, el costo de usar control de
jerojasro@476: revisiones ni siquiera se tiene en cuenta, puesto que \emph{sin} él,
igor@403: el fracaso está casi garantizado.
igor@403: 
igor@403: Por otra parte, un ``arreglo rápido'' de una sola persona, excluiría
igor@403: la necesidad de usar una herramienta de control de revisiones, porque
igor@403: casi seguramente, el costo de usar una estaría cerca del costo del
igor@403: proyecto. ¿No es así?
igor@403: 
jerojasro@509: Mercurial soporta \emph{ambas} escalas de de desarrollo de manera
jerojasro@509: única. Puede aprender lo básico en pocos minutos, y dado su bajo
igor@403: sobrecosto, puede aplicar el control de revisiones al proyecto más
igor@403: pequeño con facilidad. Su simplicidad significa que no tendrá que
igor@403: preocuparse por conceptos obtusos o secuencias de órdenes compitiendo
igor@403: por espacio mental con lo que sea que \emph{realmente} esté tratando
igor@403: de hacer.  Al mismo tiempo, Mercurial tiene alto desempeño y su
jerojasro@509: %TODO distribuida? en vez de p2p
igor@403: naturaleza peer-to-peer le permite escalar indoloramente para manejar
igor@403: grandes proyectos.
igor@403: 
igor@403: Ninguna herramienta de control de revisiones puede salvar un
igor@403: proyecto mal administrado, pero la elección de herramientas puede
jerojasro@509: hacer una gran diferencia en la fluidez con la cual usted puede
jerojasro@509: trabajar en un proyecto.
igor@403: 
igor@403: \subsection{La cantidad de nombres del control de revisiones}
igor@403: 
jerojasro@509: El control de revisiones es un campo amplio, tan amplio que no hay un
igor@403: acrónimo o nombre único. A continuación presentamos un listado de
igor@403: nombres comunes y acrónimos que se podrían encontrar:
igor@402: \begin{itemize}
igor@403: \item Control de revisiones (RCS)
jerojasro@510: \item Manejo de Configuraciones de Programas (SCM), o administracón de
igor@403:   configuraciones
igor@403: \item Administración de código fuente
igor@403: \item Control de Código Fuente, o Control de Fuentes
jerojasro@510: \item Control de Versiones (VCS)
igor@402: \end{itemize}
igor@403: Algunas personas aducen que estos términos tienen significados
jerojasro@526: diversos, pero en la práctica se sobreponen tanto que no hay una
jerojasro@509: forma acordada o incluso adecuada de separarlos.
igor@403: 
igor@403: \section{Historia resumida del control de revisiones}
igor@403: 
igor@403: La herramienta de control de revisiones más antigua conocida es SCCS 
igor@403: (Sistema de Control de Código), escrito por Marc Rochkind en Bell
jerojasro@510: Labs, a comienzos de los setentas (1970s).  SCCS operaba sobre ficheros
igor@403: individuales, y requería que cada persona que trabajara en el proyecto
igor@403: tuviera acceso a un espacio compartido en un solo sistema.  Solamente
igor@408: una persona podía modificar un fichero en un momento dado; el
igor@403: arbitramiento del acceso a los ficheros se hacía con candados. Era
igor@403: común que la gente pusiera los candados a los ficheros, y que
igor@403: posteriormente olvidara quitarlos, impidiendo que otro pudiera
igor@403: modificar los ficheros en cuestión sin la intervención del
igor@403: administrador.
igor@403: 
jerojasro@509: Walter Tichy desarrolló una alternativa gratuita a SCCS a comienzos
jerojasro@510: de los ochentas (1980s); llamó a su programa RCS (Sistema de Control de
igor@403: Revisiones).  Al igual que SCCS, RCS requería que los desarrolladores
igor@403: trabajaran en un único espacio compartido y colocaran candados a los
jerojasro@509: ficheros para evitar que varias personas los modificaran
igor@403: simultáneamente.
igor@403: 
igor@403: Después en los ochenta, Dick Grune usó RCS como un bloque de
igor@403: construcción para un conjunto de guiones de línea de comando, que
jerojasro@509: inicialmente llamó cmt, pero que renombró a CVS (Sistema Concurrente de
igor@403: Versiones).  La gran innovación de CVS era que permitía a los
igor@403: desarrolladores trabajar simultáneamente de una forma más o menos
igor@403: independiente en sus propios espacios de trabajo. Los espacios de
jerojasro@509: trabajo personales impedían que los desarrolladores se pisaran las
igor@403: mangueras todo el tiempo, situación común con SCCS y RCS.  Cada
jerojasro@509: desarrollador tenía una copia de todos los ficheros del proyecto y podía
jerojasro@509: modificar sus copias independientemente, Tenían que fusionar sus
igor@403: ediciones antes de consignar los cambios al repositorio central.
igor@403: 
igor@403: Brian Berliner tomó los scripts originales de Grune y los reescribió
jerojasro@509: en~C, publicando en 1989 el código sobre el cual se ha
jerojasro@509: desarrollado la versión moderna de CVS.  CVS adquirió posteriormente 
igor@403: la habilidad de operar sobre una conexión de red, dotándolo de una
igor@403: arquitectura, cliente/servidor. La arquitectura de CVS es
jerojasro@516: centralizada; el historial del proyecto está únicamente en el
igor@403: repositorio central.  Los espacios de trabajo de los clientes
igor@403: contienen únicamente copias recientes de las versiones de los
igor@403: ficheros, y pocos metadatos para indicar dónde está el servidor. CVS
igor@403: ha tenido un éxito enorme; Es probablemente el sistema de control de
igor@403: revisiones más extendido del planeta.
igor@402: 
jerojasro@509: A comienzos de los noventa~(1990s), Sun MicroSystems desarrollo un
jerojasro@509: temprano sistema distribuido de control de revisiones llamado
jerojasro@509: TeamWare.
jerojasro@517: Un espacio de trabajo TeamWare contiene una copia completa del
jerojasro@516: historial del proyecto. TeamWare no tiene la noción de repositorio
jerojasro@516: central. (CVS se basaba en RCS para el almacenamiento de su historial;
igor@404: TeamWare usaba SCCS.)
igor@404: 
jerojasro@509: A medida que avanzaba la decada de los noventa, se empezó a
jerojasro@509: evidenciar los problemas de CVS.  Almacena cambios simultáneos a muchos
igor@408: ficheros de forma individual, en lugar de agruparlos como una
igor@404: operación única y atómica lógicamente.  No maneja bien su jerarquía de
jerojasro@509: ficheros; es fácil desordenar un repositorio al renombrar ficheros
igor@404: y directorios. Peor aún, su código fuente es difícil de leer y
jerojasro@509: mantener, lo que hizo que su ``umbral de dolor'' para arreglar sus
jerojasro@509: problemas arquitecturales fuera algo prohibitivo.
igor@404: 
igor@404: En 2001, Jim Blandy y Karl Fogel, dos desarrolladores que habían
igor@404: trabajado en CVS, comenzaron un proyecto para reemplazarlo con una
igor@404: herramienta con mejor arquitectura y código más limpio.  El resultado,
igor@404: Subversion, no se separó del modelo centralizado cliente/servidor de
igor@404: CVS, pero añadió consignaciones atómicas de varios ficheros, mejor
jerojasro@509: manejo de espacios de nombres , y otras características que lo hacen
igor@404: mejor que CVS. Desde su versión inicial, ha ido creciendo en
jerojasro@509: popularidad rápidamente.
igor@404: 
igor@404: Más o menos en forma simultánea Graydon Hoare comenzó a trabajar en un
jerojasro@509: ambicioso sistema distribuido de control de versiones que llamó
igor@404: Monotone. Mientras que Monotone se enfocaba a evitar algunas fallas de
igor@404: diseño de CVS con una arquitectura peer-to-peer, fue mucho más
jerojasro@509: allá de las herramientas anteriores (y posteriores) de
igor@404: control de revisiones en varios aspectos innovadores. Usa hashes
igor@404: criptográficos como identificadores, y tiene una noción integral de 
igor@404: ``confianza'' para código de diversas fuentes.
igor@404: 
igor@404: Mercurial nació en el 2005.  Algunos de sus aspectos de de diseño
igor@404: fueron influenciados por Monotone, pero Mercurial se enfoca en la
igor@404: facilidad de uso, gran rendimiento y escalabilidad para proyectos muy
igor@404: grandes.
igor@404: 
igor@404: \section{Tendencias en el control de revisiones}
igor@404: 
jerojasro@509: Ha habido una tendencia inconfundible en el desarrollo y uso de las herramientas
jerojasro@509: de control de revisiones en las cuatro décadas pasadas, mientras la
jerojasro@509: gente se ha hecho familiar con las capacidades de sus herramientas y
jerojasro@509: se ha visto restringida por sus limitaciones.
igor@404: 
igor@408: La primera generación comenzó administrando ficheros individuales en
igor@404: computadores por persona. A pesar de que tales herramientas
igor@404: representaron un avance importante frente al control de revisiones
jerojasro@509: manual, su modelo de candados y la dependencia a un sólo computador
jerojasro@509: los limitó a equipos de trabajo pequeños y acoplados.
igor@404: 
igor@404: La segunda generación dejó atrás esas limitaciones moviéndose a
igor@404: arquitecturas centradas en  redes, y administrando proyectos completos
jerojasro@509: a la vez. A medida que los proyectos crecían, nacieron nuevos
igor@404: problemas. Con la necesidad de comunicación frecuente con los
igor@404: servidores, escalar estas máquinas se convirtió en un problema en
jerojasro@509: proyectos realmente grandes. Las redes con poca estabilidad podrían
jerojasro@509: impedir que usuarios remotos se conectaran al servidor. A medida que
jerojasro@509: los
jerojasro@509: proyectos de código abierto comenzaron a ofrecer acceso de sólo lectura
jerojasro@509: de forma anónima a cualquiera, la gente sin permiso para consignar
igor@404: vio que no podían usar tales herramientas para interactuar en un
igor@404: proyecto de forma natural, puesto que no podían guardar sus cambios.
igor@404: 
jerojasro@509: La generación actual de herramientas de control de revisiones es
jerojasro@509: peer-to-peer por naturaleza.  Todos estos sistemas han eliminado la
igor@404: dependencia de un único servidor central, y han permitido que la
igor@404: gente distribuya sus datos de control de revisiones donde realmente se
igor@404: necesita. La colaboración a través de Internet ha cambiado las
jerojasro@509: limitantes tecnológicas por la cuestión de elección y consenso. Las
jerojasro@509: herramientas modernas pueden operar sin conexión indefinidamente y
igor@404: autónomamente, necesitando una conexión de red solamente para
igor@404: sincronizar los cambios con otro repositorio.
igor@404: 
igor@404: \section{Algunas ventajas del control distribuido de revisiones}
igor@404: 
igor@404: A pesar de que las herramientas para el control distribuido de
jerojasro@509: revisiones lleva varios años siendo tan robustas y usables como la
jerojasro@509: generación previa de sus contrapartes, algunas personas que usan las
jerojasro@509: herramientas más antiguas no se han percatado de sus ventajas.  Hay
jerojasro@509: gran cantidad
igor@404: de situaciones en las cuales las herramientas distribuidas brillan
igor@404: frente a las centralizadas.
igor@404: 
igor@404: Para un desarrollador individual, las herramientas distribuidas casi
igor@404: siempre son más rápidas que las centralizadas. Por una razón sencilla:
igor@404: Una herramienta centralizada necesita comunicarse por red para las
igor@404: operaciones más usuales, debido a que los metadatos se almacenan en
igor@404: una sola copia en el servidor central. Una herramienta distribuida
igor@404: almacena todos sus metadatos localmente.  Con todo lo demás de la
igor@404: misma forma, comunicarse por red tiene un sobrecosto en una
igor@404: herramienta centralizada. No subestime el valor de una herramienta de
igor@404: respuesta rápida: Usted empleará mucho tiempo interactuando con su
igor@404: programa de control de revisiones.
igor@404: 
igor@404: Las herramientas distribuidas son indiferentes a los caprichos de su
igor@404: infraestructura de servidores, de nuevo, debido a la replicación de
igor@404: metadatos en tantos lugares. Si usa un sistema centralizado y su
igor@404: servidor explota, ojalá los medios físicos de su copia de seguridad
igor@404: sean confiables, y que su última copia sea reciente y además
igor@404: funcione. Con una herramienta distribuida tiene tantas copias de
igor@404: seguridad disponibles como computadores de contribuidores.
igor@404: 
igor@404: La confiabilidad de su red afectará las herramientas distribuidas de
jerojasro@509: una forma mucho menor que a las herramientas centralizadas. Usted no puede
igor@404: siquiera usar una herramienta centralizada sin conexión de red,
jerojasro@509: excepto por algunas órdenes muy limitadas. Con herramientas
igor@404: distribuidas, si sus conexión cae mientras usted está trabajando,
igor@404: podría nisiquiera darse cuenta. Lo único que que no podrá hacer es
igor@404: comunicarse  con repositorios en otros computadores, algo que es
igor@404: relativamente raro comparado con las operaciones locales. Si tiene
jerojasro@509: colaboradores remotos en su equipo, puede ser importante.
igor@404: 
igor@404: \subsection{Ventajas para proyectos de código abierto}
igor@404: 
igor@404: Si descubre un proyecto de código abierto y decide que desea comenzar
igor@404: a trabajar en él, y ese proyecto usa una herramienta de control
jerojasro@509: distribuido de revisiones, usted es de inmediato un par con la gente que se
jerojasro@509: considera el ``alma'' del proyecto.  Si ellos publican sus
jerojasro@516: repositorios, usted puede copiar inmediatamente el historial del proyecto,
igor@404: hacer cambios y guardar su trabajo, usando las mismas herramientas de
igor@404: la misma forma que ellos. En contraste, con una herramienta
jerojasro@509: centralizada, usted debe usar el programa en un modo ``sólo lectura'' a
igor@404: menos que alguien le otorgue permisos para consignar cambios en el
igor@404: repositorio central. Hasta entonces, no podrá almacenar sus cambios y
igor@404: sus modificaciones locales correrán el riesgo de dañarse cuando trate
igor@404: de actualizar su vista del repositorio.
igor@404: 
jerojasro@509: \subsubsection{Las bifurcaciones (forks) no son un problema}
igor@404: 
igor@404: Se ha mencionado que las herramientas de control distribuido de
igor@404: versiones albergan un riesgo a los proyectos de código abierto, puesto
jerojasro@509: que se vuelve muy sencillo hacer una ``bifurcación''\ndt{fork.} del
jerojasro@509: desarrollo del proyecto.  Una bifurcación sucede cuando hay diferencias
jerojasro@509: de opinión o actitud entre grupos de desarrolladores que desemboca en
igor@404: la decisión de la imposibilidad de continuar trabajando juntos. Cada
igor@404: parte toma una copia más o menos completa del código fuente del
igor@404: proyecto y toma su propio rumbo.
igor@404: 
igor@404: En algunas ocasiones los líderes de las bifurcaciones reconcilian sus
igor@404: diferencias. Con un sistema centralizado de control de revisiones, el
igor@404: proceso \emph{técnico} de reconciliarse es doloroso, y se hace de
jerojasro@516: forma muy manual.  Usted tiene que decidir qué historial de revisiones va a
jerojasro@509: ``ganar'', e injertar los cambios del otro equipo en el árbol de alguna
igor@404: manera. Con esto usualmente se pierde algo o todo del historial de la
igor@404: revisión de alguna de las partes.
igor@404: 
igor@404: Lo que las herramientas distribuidas hacen con respecto a las
igor@404: bifurcaciones, es que las bifurcaciones son la \emph{única} forma de
igor@404: desarrollar un proyecto. Cada cambio que usted hace es potencialmente
igor@404: un punto de bifurcación. La gran fortaleza de esta aproximación es que
igor@404: las herramientas distribuidas de control de revisiones tiene que ser
igor@404: bueno al \emph{fusionar} las bifurcaciones, porque las bifurcaciones
igor@404: son absolutamente fundamentales: pasan todo el tiempo.
igor@404: 
jerojasro@509: Si todas las porciones de trabajo que todos hacen, todo el tiempo, se
jerojasro@509: enmarcan en términos de bifurcaciones y fusiones, entonces a aquello a
igor@404: lo que se refiere en el mundo del código abierto a una ``bifurcación''
igor@404: se convierte \emph{puramente} en una cuestión social. Lo que hacen las
igor@404: herramientas distribuidas es \emph{disminuir} la posibilidad de una
igor@404: bifurcación porque:
igor@402: \begin{itemize}
jerojasro@509: \item Eliminan la distinción social que imponen las herramientas
jerojasro@509:   centralizadas: aquélla entre miembros (personas con permiso de
jerojasro@509:   consignar) y forasteros (los que no tienen el permiso).
igor@404: \item Facilitan la reconciliación después de una bifurcación social,
igor@404:   porque todo lo que concierne al programa de control de revisiones es
igor@404:   una fusión.
igor@402: \end{itemize}
igor@402: 
igor@404: Algunas personas se resisten a las herramientas distribuidas porque
igor@404: desean mantener control completo sobre sus proyectos, y creen que las
jerojasro@509: herramientas centralizadas les dan tal control. En todo caso, si este
jerojasro@509: es su parecer, y usted publica sus repositorios de CVS o Subversion, hay
jerojasro@516: muchas herramientas disponibles que pueden obtener el historial
jerojasro@516: completo (aunque sea lentamente) y recrearlo en otro sitio que usted no
igor@407: controla. Siendo así un control ilusorio, puesto que está impidiendo
igor@407: la fluidez de colaboración en lugar de prevenir que alguien se sienta
jerojasro@516: impulsado a obtener una copia y hacer una bifurcación con su historial.
igor@407: 
igor@407: \subsection{Ventajas para proyectos comerciales}
igor@407: 
igor@407: Muchos proyectos comerciales tienen grupos de trabajo distribuidos
igor@407: alrededor del globo.  Quienes contribuyen y están lejos de un
jerojasro@509: repositorio central verán una ejecución más lenta de los comandos y tal
igor@407: vez menos confiabilidad. Los sistemas de control de revisión
igor@407: comerciales intentan amortiguar estos problemas con adiciones de
igor@407: replicación remota que usualmente son muy costosos y complicados de
jerojasro@509: administrar. Un sistema distribuido no padece estos problemas. Mejor
igor@407: aún, puede colocar varios servidores autorizados, por ejemplo, uno por
igor@407: sitio, de tal forma que no haya comunicación redundante entre
igor@407: repositorios sobre enlaces de conexión costosos.
igor@407: 
igor@407: Los sistemas de control de revisiones distribuidos tienden a ser poco
jerojasro@509: escalables. No es inusual que costosos sistemas centralizados caigan
igor@407: ante la carga combinada de unas cuantas docenas de usuarios
jerojasro@509: concurrentes. De nuevo, las respuestas típicas de replicación tienden
igor@407: a ser costosas y complejas de instalar y administrar. Dado que la
igor@407: carga en un servidor central---si es que tiene uno---es muchas veces
jerojasro@509: menor con una herramienta distribuida (debido a que los datos están
jerojasro@509: replicados en todas partes), un solo servidor económico puede tratar
igor@407: las necesidades de equipos mucho más grandes, y la replicación para
jerojasro@509: balancear la carga se vuelve cosa de guiones.
igor@407: 
igor@407: Si tiene un empleado en el campo, se beneficiará grandemente de un
igor@407: sistema distribuido de control de versiones al resolver problemas en
igor@407: el sitio del cliente. La herramienta le permitirá generar
igor@407: construcciones a la medida, probar diferentes arreglos de forma
jerojasro@516: independiente y buscar de forma eficiente las fuentes de fallos en el
jerojasro@516: historial y regresiones en los ambientes de los clientes, todo sin
igor@407: necesidad de conectarse al servidor de su compañía.
igor@407: 
igor@407: \section{¿Por qué elegir Mercurial?}
igor@407: 
igor@407: Mercurial cuenta con un conjunto único de propiedades que lo hacen
jerojasro@509: una elección particularmente buena como sistema de control de
igor@407: revisiones, puesto que:
igor@402: \begin{itemize}
igor@407: \item Es fácil de aprender y usar.
igor@407: \item Es liviano.
igor@407: \item Escala de forma excelente.
igor@407: \item Es fácil de acondicionar.
igor@402: \end{itemize}
igor@402: 
igor@407: Si los sistemas de control de revisiones le son familiares, debería
jerojasro@509: estar listo para usar Mercurial en menos de cinco minutos. Si no, sólo va a
igor@407: tomar unos pocos minutos más. Las órdenes de Mercurial y su conjunto
igor@407: de características son uniformes y consistentes generalmente, y basta
igor@407: con que siga unas pocas reglas generales en lugar de un montón de
igor@407: excepciones.
igor@407: 
jerojasro@509: En un proyecto pequeño, usted puede comenzar a trabajar con Mercurial en
jerojasro@509: pocos momentos. Crear nuevos cambios y ramas, transferir cambios (localmente
jerojasro@516: o por la red); y las operaciones relacionadas con el estado y el
jerojasro@516: historial son rápidas. Mercurial buscar ser ligero y no incomodar en su
igor@407: camino combinando poca sobrecarga cognitiva con operaciones
igor@407: asombrosamente rápidas.
igor@407: 
igor@407: La utilidad de Mercurial no se limita a proyectos pequeños: está
igor@407: siendo usado por proyectos con centenas de miles de contribuyentes,
igor@407: cada uno conteniendo decenas de miles de ficheros y centenas de
igor@407: megabytes de código fuente
igor@407: 
igor@407: Si la funcionalidad básica de Mercurial no es suficiente para usted,
igor@407: es muy fácil extenderlo. Mercurial se comporta muy bien con tareas de
igor@407: scripting y su limpieza interna junto con su implementación en Python
igor@407: permiten añadir características fácilmente en forma de extensiones.
igor@407: Hay un buen número de extensiones útiles y populares en este momento,
jerojasro@509: desde ayudar a identificar fallos hasta mejorar su desempeño.
igor@407: 
igor@407: \section{Comparación de Mercurial con otras herramientas}
igor@407: 
igor@407: Antes de leer, por favor tenga en cuenta que esta sección
jerojasro@509: necesariamente refleja mis propias experiencias, intereses y (tengo que
igor@407: decirlo) mis preferencias. He usado cada una de las herramientas de
igor@407: control de versiones listadas a continuación, y en muchos casos por
igor@407: varios años.
igor@402: 
igor@402: 
igor@402: \subsection{Subversion}
igor@402: 
igor@407: Subversion es una herramienta de control de revisiones muy popular,
jerojasro@509: desarrollada para reemplazar a CVS.  Tiene una arquitectura
jerojasro@509: centralizada tipo cliente/servidor.
jerojasro@509: 
jerojasro@509: Subversion y Mercurial tienen comandos con nombres similares para hacer
igor@407: las mismas operaciones, por lo que si le son familiares en una, será
igor@407: sencillo aprender a usar la otra. Ambas herramientas son portables en
igor@407: todos los sistemas operativos populares.
igor@407: 
igor@407: Antes de la versión 1.5, Subversion no tenía soporte para fusiones. En
igor@407: el momento de la escritura, sus capcidades para llevar cuenta de las
igor@407: funciones son nuevas,
igor@407: \href{http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.finalword}{complicadas
igor@409:   y poco estables\ndt{buggy}}.
igor@407: 
jerojasro@509: Mercurial tiene una ventaja considerable en desempeño sobre
igor@407: Subversion en cualquier operación de control de revisiones que yo haya
igor@407: medido. He medido sus ventajas con factores desde dos hasta seis veces
igor@408: comparando con almacenamiento de ficheros \emph{ra\_local}
igor@407: Subversion~1.4.3, el cual es el método de acceso más rápido.  En los
jerojasro@509: escenarios más realistas incluyendo almacenamiento con la red de por
igor@407: medio, Subversion se encuentra en desventaja aún mayor. Dado que casi
igor@407: todas las órdenes de Subversion deben tratar con el servidor y
jerojasro@509: Subversion no tiene utilidades de replicación adecuadas, la capacidad
igor@407: del servidor y el ancho de banda se convierten en cuellos de botella
igor@407: para proyectos modestamente grandes.
igor@407: 
jerojasro@509: Adicionalmente, Subversion tiene un sobrecosto considerable en
jerojasro@509: almacenamiento para evitar transacciones por red en algunas
jerojasro@509: operaciones,
jerojasro@510: tales como encontrar ficheros modificados (\texttt{status}) y desplegar
jerojasro@510: información frente a la revisión actual (\texttt{diff}).  Como
igor@407: resultado, la copia de trabajo de Subversion termina siendo del mismo
igor@407: tamaño o más grande que un repositorio de Mercurial y el directorio de
jerojasro@516: trabajo, a pesar de que el repositorio de Mercurial contiene el
jerojasro@516: historial completo  del proyecto.
igor@407: 
igor@407: Subversion tiene soporte amplio de otras herramientas. Mercurial por
igor@407: ahora está bastante atrás en este aspecto.  Esta diferencia está
igor@409: disminuyendo, y algunas de las herramientas GUI\ndt{Interfaz de
igor@407:   Usuario Gráfica}, eclipsan sus equivalentes de Subversion. Al igual
igor@407: que Mercurial, Subversion tiene un excelente manual de usuario.
igor@402: 
jerojasro@516: Dado que Subversion no almacena el historial de revisiones en el
igor@408: cliente, es muy bueno para administrar proyectos que tienen muchos
igor@408: ficheros binarios grandes y opacos. Si consigna cincuenta revisiones
igor@408: de un fichero de 10MB que no es comprimible, el esapacio en el cliente
igor@408: de Subversion se mantendrá constante mientras que el espacio usado por
igor@408: cualquier Sistema Distribuido de Control de Revisiones crecerá
igor@408: rápidamente en proporción con el número de revisiones, debido a que
igor@408: las diferencias entre cada revisión es grande.
igor@408: 
igor@408: Adicionalmente, generalmente es difícil o más bien, imposible mezclar
igor@408: diferentes versiones de un fichero binario. La habilidad de Subversion
igor@408: para permitirle al usuario poner una cerradura  a un fichero, de modo
igor@408: que tenga un permiso exclusivo para consignar cambios, puede ser una
igor@408: ventaja significativa en un proyecto donde los ficheros binarios sean
igor@408: usados ampliamente.
igor@408: 
jerojasro@516: Mercurial puede importar el historial de revisiones de un repositorio
jerojasro@516: de Subversion. También puede exportar el historial de revisiones a un
igor@408: repositorio de Subversion.  De esta forma es sencillo ``dar un
igor@408: vistazo'' y usar Mercurial y Subversion en paralelo antes de decidirse
jerojasro@517: a dar el paso. La conversión del historial es incremental, de modo
igor@408: que puede aplicar una conversión inicial, y después conversiones
igor@408: pequeñas y adicionales posteriormente para traer nuevos cambios.
igor@402: 
igor@402: \subsection{Git}
igor@402: 
igor@408: Git es una herramienta distribuida de control de revisiones
jerojasro@509: desarrollada para administrar el arbol del kernel de Linux.  Al igual
igor@408: que Mercurial los principios de su diseño fueron influenciados por 
igor@408: Monotone.
igor@408: 
jerojasro@509: Git tiene un conjunto de órdenes muy grande; en la versión~1.5.0
igor@408: ofrece~139 órdenes individuales.  Tiene cierta reputación de ser
igor@408: difícil de aprender. Comparado con Git, Mercurial tiene un fuerte
igor@408: enfoque hacia la facilidad.
igor@408: 
igor@408: En términos de rendimiento, Git es extremadamente rápido. En muchos
igor@408: casos, es más rápido que Mercurial, por lo menos en Linux, mientras
igor@408: que Mercurial se comporta mejor en otras operaciones.  De todas
igor@408: maneras en Windows, el desempeño y el nivel general de soporte que
jerojasro@509: ofrece Git, al momento de la escritura, está bastante atrás de
igor@408: Mercurial.
igor@408: 
igor@408: Mientras que el repositorio de Mercurial no requiere mantenimiento, el
jerojasro@509: repositorio de Git requiere frecuentes ``reempaquetados'' de sus metadatos.
jerojasro@509: Sin estos, el desempeño se degrada y el uso de espacio crece rápidamente. Un
igor@408: servidor que contenga repositorios de Git que no sean reempacados
jerojasro@509: rigurosa y frecuentemente requerirá trabajo intenso de disco durante
igor@408: las copias de seguridad, y ha habido situaciones en copias de
jerojasro@509: seguridad diaria que toman más de~24 horas como resultado. Un
igor@408: repositorio recién reempacado de Git es un poco más pequeño que un
igor@408: repositorio de Mercurial, pero un repositorio sin reempacar es varios
igor@408: órdenes de magnitud más grande.
igor@408: 
igor@408: El corazón de Git está escrito en C.  Muchas órdenes de Git están
jerojasro@509: implementadas como guiones de línea de comandos o de Perl y la calidad de esos
jerojasro@509: guiones varía ampliamente. He encontrado muchas situaciones en las
jerojasro@509: cuales los guiones no tuvieron en cuenta la presencia de errores que
igor@408: podrían haber sido fatales.
igor@408: 
igor@408: Mercurial puede importar el historial de revisiones de un repositorio
igor@408: de Git.
igor@402: 
igor@402: \subsection{CVS}
igor@402: 
igor@408: CVS es probablemente la herramienta de control de revisiones más
igor@408: ampliamente usada en el planeta.  Debido a su edad y su poca pulcritud
jerojasro@509: interna, ha sido ligeramente mantenida en muchos años.
igor@408: 
igor@408: Tiene una arquitectura centralizada cliente/servidor. No agrupa
jerojasro@509: cambios relacionados en consignaciones atómicas, pemitiendo que con
igor@408: facilidad la gente ``rompa la construcción'': una persona puede
igor@408: consignar exitósamente parte del cambio y estar bloqueada por la
igor@408: necesidad de una mezcla, forzando a otras personas a ver solamente una
igor@408: porción del trabajo que estaban buscando hacer.  Esto afecta también
jerojasro@516: la forma como usted trabaja con el historial del proyecto. Si quiere
igor@408: ver todas las modificaciones que alguien hizo como parte de una tarea,
igor@408: necesitará inspeccionar manualmente las descripciones y las marcas de
jerojasro@509: tiempo de cambio de cada fichero involucrado (esto, si usted saber
igor@408: cuáles eran tales ficheros).
igor@408: 
igor@408: CVS tiene una noción confusa de etiquetas y ramas que yo no trataría
igor@408: incluso de describir.  No soporta renombramiento de ficheros o
jerojasro@509: directorios adecuadamente, facilitando el corromper un
igor@408: repositorio. Casi no tiene chequeo de consistencia interna, por lo
igor@408: tanto es casi imposible identificar por que o cómo se corrompió un
igor@408: repositorio. Yo no recomendaría un repositorio de CVS para proyecto
igor@408: alguno, ni existente ni nuevo.
igor@408: 
jerojasro@516: Mercurial puede importar el historial de revisiones de CVS.  De todas
jerojasro@509: maneras hay ciertas precauciones que aplican; las cuales también son
jerojasro@509: necesarias para cualquier herramienta importadora de historial de
igor@408: CVS. Debido a la falta de atomicidad de cambios y el no versionamiento
jerojasro@509: de la jerarquía del sistema de ficheros, es imposible reconstruir
jerojasro@516: completamente el historial de CVS con precisión; hay cierto trabajo de
igor@408: conjetura involucrado y los renombramientos tampoco se
igor@408: mostrarán. Debido a que gran parte de la administración avanzada de
igor@408: CVS tiene que hacerse manualmente y por lo tanto es proclive al error,
igor@408: es común que los importadores de CVS encuentren muchos problemas con
jerojasro@509: repositorios corruptos (marcas de tiempo totalmente desubicadas y
jerojasro@509: ficheros que han permanecido con candados por más de una década son
jerojasro@509: dos de los problemas menos interesantes de los que puedo retomar de mi
igor@408: experiencia personal).
igor@408: 
jerojasro@516: Mercurial puede importar el historial de revisiones de un repositorio
igor@408: CVS.
igor@408: 
igor@408: \subsection{Herramientas comerciales}
igor@408: 
igor@408: Perforce tiene una arquitectura centralizada cliente/servidor sin
jerojasro@509: almacenamiento de dato alguno de caché en el lado del cliente. A diferencia de
igor@408: las herramientas modernas de control de revisiones, Perforce requiere
jerojasro@509: que un usuario ejecute un comando para informar al servidor acerca de
igor@408: todo fichero que se vaya a editar.
igor@408: 
igor@408: El rendimiento de Perforce es muy bueno para equipos pequeños, pero se
igor@408: degrada rápidamente cuando el número de usuarios va más allá de pocas
igor@408: docenas. Instalaciones modestamente grandes de Perforce requiere la
igor@408: organización de proxies para soportar la carga que sus usuarios generan.
igor@408: 
igor@408: \subsection{Elegir una herramienta de control de revisiones}
igor@408: 
igor@408: Con la excepción de CVS, toda las herramientas que se han listado
jerojasro@509: anteriormente tienen fortalezas únicas que las hacen valiosas de acuerdo al
igor@408: tipo de trabajo. No hay una única herramienta de control de revisiones
igor@408: que sea la mejor en todas las situaciones.
igor@408: 
igor@408: Por ejemplo, Subversion es una buena elección para trabajar con
igor@408: edición frecuente de ficheros binarios, debido a su naturaleza
igor@408: centralizada y soporte para poner candados a ficheros.
igor@408: 
igor@408: Personalmente encuentro las propiedades de simplicidad, desempeño, y
igor@408: buen soporte de fusiones de Mercurial una combinación llamativa que ha
igor@408: dado buenos frutos por varios años.
igor@408: 
igor@408: 
igor@408: \section{Migrar de otra herramienta hacia Mercurial}
igor@408: 
igor@408: Mercurial viene con una extensión llamada \hgext{convert}, que puede
igor@408: importar historiales de revisiones de forma incremental desde varias
igor@408: herramientas de control de revisiones. Por ``incremental'', quiero
jerojasro@516: decir que puede migrar toda el historial de un proyecto en una primera
igor@408: instancia y después volver a ejecutar la migración posteriormente para
igor@408: obtener los nuevos cambios que han sucedido después de la migración
igor@408: inicial.
igor@408: 
jerojasro@509: A continuación presentamos las herramientas de revisiones que soporta
jerojasro@509: el comando \hgext{convert}:
igor@402: \begin{itemize}
igor@402: \item Subversion
igor@402: \item CVS
igor@402: \item Git
igor@402: \item Darcs
igor@402: \end{itemize}
igor@402: 
igor@408: Adicionalmente, \hgext{convert} puede exportar cambios de Mercurial
igor@408: hacia Subversion.  Lo que hace posible probar Subversion y Mercurial
igor@408: en paralelo antes de lanzarse a un migración total, sin arriesgarse a
igor@408: perder trabajo alguno.
igor@408: 
jerojasro@509: El comando \hgxcmd{conver}{convert} es sencillo de usar. Basta con
jerojasro@509: apuntarlo hacia la ruta o el URL del repositorio fuente, opcionalmente
igor@408: darle el nombre del nombre del repositorio destino y comenzará a hacer
igor@408: su trabajo. Después de la conversión inicial, basta con invocar de
jerojasro@509: nuevo el comando para importar cambios nuevos.
igor@402: 
igor@402: 
igor@402: %%% Local Variables: 
igor@402: %%% mode: latex
igor@402: %%% TeX-master: "00book"
igor@402: %%% End: