Acceso SVN a Sourceforge Proyecto EQAlign Francisco José Calvo Fernández fran@isoplut.com Revisión 1.0, Agosto 2006 (c) Equipo de desarrollo de EQAlign 1 SUBVERSION 1. 1.1. 1 Subversion Necesidad Normalmente en un proyecto software se ven involucradas varias personas, raro es el software que es desarrollado por una sola persona; por tanto surge una necesidad de forma inmediata: la coordinación del trabajo. Los desarrolladores tendrán acceso al árbol de archivos fuentes, pero ¿cómo ponerse de acuerdo en qué líneas de qué archivos han sido modificadas, cómo fusionar los cambios de forma rápida, etc...? Subversion nos ofrece soluciones a estos problemas, siendo ideal para desarrollar de forma distribuida, cuando algún desarrollador desea realizar cambios a un archivo, Subversion en lugar de reemplazar el archivo original, guarda sólo los cambios que se le han realizado, por cada cambio realizado, se incrementa el número de versión del archivo, siendo posible volver a versiones anteriores, y, por tanto, deshacer los cambios si no los creemos adecuados, por ejemplo, podemos obtener una copia del proyecto tal y como se encontraba hace un mes, hace un año, o en el momento en el que vio la luz una versión concreta. Con Subversion también es posible desarrollar varias versiones de un mismo software, siendo, éstas independientes. Por su naturaleza, Subversion es utilizado en masa en el mundo del software libre, éste software es desarrollado por personas que quizás ni se conozcan personalmente, pero que colaboran en el desarrollo de un producto, siendo Subversion el punto de encuentro. Antes de comenzar ver más detalles sobre Subversion necesitamos aclarar varios términos que aparecen con mucha frecuencia cuando se utiliza este software: Repositorio Será el lugar dónde se almacene el proyecto, pudiendo ser local o remoto; cada proyecto de software que deseemos que sea gestionado por Subversion ha de poseer un único repositorio. Módulo Los módulos son los encargados de dividir un repositorio en distintas categorías, según su función, por ejemplo, podemos dentro de un repositorio crear un módulo que utilicemos para gestionar la documentación del proyecto y otro para gestionar el código fuente. Rama Las ramas permiten dividir el repositorio en categorías basadas en la versión del software, permitiendo el desarrollo paralelo de ambas; por ejemplo, imagínese que tenemos un software que se encuentra en su versión 1.0, y queremos comenzar el desarrollo de la versión 2.0, que tendrá importantes cambios, pero no deseamos abandonar el desarrollo de la 1.0, ya que necesitará corregir fallos, pues podemos crear dos ramas dentro del repositorio, una para la versión 1 y otra para la 2. Copia de trabajo 1 SUBVERSION 2 Como el propio nombre indica, se corresponde con una copia especial del repositorio Subversion. si deseamos enviar cambios al repositorio Subversion, lo primero que hemos de hacer es obtener una copia de trabajo, que contendrá los archivos fuentes tal y como se encontraban en el momento que nosotros indiquemos, ya que no es posible enviar a un repositorio Subversion cambios si previamente no hemos obtenido la copia de trabajo. Conflicto En caso de que varias personas en un momento determinado hayan realizado modificaciones a un mismo bloque de código, Subversion informará de que se ha producido un conflicto, en este caso hemos de determinar qué cambio es el que deseamos. Será vital, por tanto, una correcta coordinación y asignación de trabajos para evitar los conflictos. 1.2. Introducción Subversion o SVN es, al igual que CVS un sistema de control de versiones. Subversión puede reemplazar a los sistemas CVS, ya que posee todas sus características, pero intenta solventar sus principales problemas. La primera versión estable de SVN vio la luz en febrero de 2004, aunque ya desde el 2001 se ha venido utilizando en múltiples sistemas en producción. SVN aporta una serie de mejoras respecto a CVS, entre las que podemos destacar las siguientes: Posibilidad de renombrar los ficheros y directorios de un repositorio, hacer ésto en CVS simplemente es imposible, únicamente podremos copiar el actual fichero o directorio y eliminar el anterior, con la consiguiente pérdida del historial. Subversion nos ofrece comandos que nos van a permitir copiar y mover archivos o directorios incluso sin tener una copia de trabajo del repositorio, usando para ello dos URLs como origen y destino. Los números de revisión se establecen por cada commit y no por cada fichero, asimismo los registros se asocian a cada revisión y no de forma redundante, como ocurre en CVS Subversion detecta automáticamente el tipo de archivo, y lo trata adecuadamente, por lo que se hace innecesario la opción -kb de CVS para los ficheros binarios, como las imágenes. En caso de duda sobre el tipo de fichero se trata como binario, para evitar pérdidas de información. Integra un módulo para Apache2 de forma que es posible acceder al repositorio a través de un navegador web, en CVS para realizar lo mismo hay que acudir a sofware de terceros. Soporta autenticaciones a través de HTTP o al igual que CVS, a través de su propio demonio o SSH. 1 SUBVERSION 3 Las salidas que genera Subversion son más legibles y menos caóticas, por lo que pueden ser más fácilmente interpretables. Crear ramas es más elegante, y es que la forma de trabajar con Subversion es algo diferente respecto a CVS. El repositorio contiene un árbol de directorios, con sus correspondientes archivos y subdirectorios, en lugar de módulos. Si ese repositorio tan sólo almacena un proyecto, lo habitual es que en ese árbol, haya un directorio trunk (tronco), y un directorio branches (ramas). SVN se ha diseñado desde el principio para poseer una arquitectura cliente/servidor, para evitar algunos de los problemas del CVS. En general y a modo de resumen podemos llegar a la conclusión de que SVN es un CVS mejorado ya que es mucho más moderno y se ha aprendido de los errores que por su antiguo diseño arrastra CVS. 1.3. Instalación de un cliente de SVN EQAlign utiliza el repositorio de Sourceforge, con lo que no hemos de instalar ningún servicio adicional, simplemente en la interfaz de gestión del proyecto se ha de activar el soporte de SVN (y desactivar el de CVS), junto con la gestión de privilegios (acceso anónimo de lectura o como desarrollador). Por tanto, necesitamos un cliente de svn, Sourceforge recomienda para sistemas Windows el software TortoiseSVN, descargable libremente desde http://tortoisesvn.sourceforge.net, es muy simple y se integra en el explorador de Windows; para Unix es recomendable el cliente oficial disponible en http://subversion.tigris.org. 1.4. Primeros pasos en SVN Partiremos de una estructura de archivos que queremos sea manejada por SVN, será el código fuente de la última versión de EQAlign. Crear el repositorio (sólo el administrador) Para comenzar a trabajar, lo primero que necesitamos es crear el repositorio. Para crear un repositorio en SVN hemos de utilizar TortoiseSVN o la herramienta oficial svnadmin. El proceso de creación, al igual que con CVS, consiste en generar una estructura de ficheros y directorios que van a contener la versión inicial de nuestro código basándonos en el contenido antes mostrado. Para ello, siga los pasos descritos a continuación: Si usamos TortoiseSVN : 1. Hemos de conocer la ruta al repositorio que nos ofrece Sourceforge, para EQAlign es: https://svn.sourceforge.net/svnroot/eqalign 1 SUBVERSION 4 a) Desde el explorador de archivos localizamos el directorio del código fuente y sobre el directorio, con el botón derecho del ratón vamos al menú TortoiseSVN ->Export Figura 1: Acceso a la configuración del repositorio. b) Posteriormente, completamos el campo URL of repository, con la URL antes comentada, el campo Export directory ha de fijarse al directorio del código fuente. Figura 2: Valores del entorno SVN. 2. Vamos a importar los archivos de nuestro proyecto software al repositorio SVN realizando, por tanto la importación inicial al repositorio, para ello, de nuevo, 1 SUBVERSION 5 desde el explorador de archivos localizamos el directorio del código fuente y sobre dicho directorio, con el botón derecho del ratón vamos al menú TortoiseSVN ->Import, fijamos la URL anterior, que nos saldrá en la lista. Figura 3: Valores del entorno SVN. Si utilizamos la versión en línea de comandos de SVN: 1. Creamos el repositorio que almacenará el código de nuestro proyecto, la herramienta svnadmin se encarga de ello: svnadmin create https://svn.sourceforge.net/svnroot/eqalign 2. El repositorio creado no contiene ningún fichero y el numero de revisión es 0; vamos a importar los archivos de nuestro proyecto software al repositorio SVN realizando, por tanto la importación inicial al repositorio. Para ello nos situamos en el directorio en el que hasta ahora almacenábamos el código de nuestro proyecto o bien indicamos su ruta completa: svn import /ruta/al/directorio/del/proyecto https://svn.sourceforge.net/svnroot/eqalign -m ”Importación inicial al repositorio” Veamos cada opción detenidamente: a) El comando import se utiliza para realizar una importación de código al repositorio, al igual que ocurría con CVS, seguido del directorio o archivo a importar y el repositorio donde deseamos importar (nótese la notación en forma de URL). b) La opción -m especifica que vamos a crear un módulo; el texto que va entre comillas realmente no es importante, sólo indica el nombre de la transacción que vamos a realizar. 1 SUBVERSION 6 Hemos de resaltar que la opción import sólo hemos de utilizarla para crear nuevos módulos dentro del repositorio, nunca para actualizar los contenidos. Tras seguir estos pasos ya tenemos sentadas las bases para que Subversion pueda gestionar nuestro proyecto, pero aún necesitamos realizar algunas acciones para poder comenzar a trabajar de forma adecuada. Obtener una copia de trabajo Si queremos que Subversion se encargue de gestionar nuestro proyecto, de nuevo, hemos de dejar de trabajar directamente con los archivos de dicho proyecto, no hemos de preocuparnos, en su lugar hemos de obtener una copia de trabajo, que contendrá todos los contenidos que existían en el directorio del proyecto y metainformación de control para SVN. El código antiguo, lo guardamos en una copia de seguridad por si fuera necesario en el futuro. Para ello, seguimos los pasos siguientes: 1. Nos situamos en el directorio donde deseemos almacenar la copia de trabajo (lo ideal es crear un directorio previamente), y que a partir de ahora será también el directorio de nuestro proyecto, puede seleccionar el directorio que quiera; sobre dicho directorio, con el botón derecho del ratón vamos al menú SVN Checkout, fijamos la URL del módulo que deseamos obtener o bien https://svn.sourceforge.net/svnroot/eqalign (en este caso obtendremos una copia de todo el repositorio, con todos sus módulos), y el directorio donde se almacenará la copia de trabajo. Figura 4: Obtención de una copia completa de trabajo. 2. Si optamos por la versión en línea de comandos, simplemente le pasamos el comando checkout seguido del nombre del módulo que deseamos obtener, donde nombreDirectorio puede ser lo que queramos, ya que se corresponde con el directorio donde almacenaremos los archivos que representarán nuestra copia de trabajo: svn checkout https://svn.sourceforge.net/svnroot/eqalign nombreDirectorio 1 SUBVERSION 7 Podremos notar que en nuestro directorio se ha creado otro directorio con el nombre del módulo , que contiene una copia de los contenidos del repositorio, perfectamente editables y que contienen un directorio (oculto) llamado .svn, con la metainformación necesaria para que SVN pueda gestionar nuestros cambios. Ahora éste será el directorio de nuestro proyecto, con éstos archivos trabajaremos. Pasaremos a ver, a continuación el trabajo diario a realizar con Subversion. Obtener los cambios que otros hayan realizado Antes de comenzar a realizar nuestro trabajo diario con el proyecto software lo más recomendable será pedir a SVN que nos envíe las modificaciones que nuestros compañeros hayan podido realizar, y así tener una copia actualizada. Para obtener una copia actualizada mediante Tortoise SVN basta con hacer click con el botón derecho del ratón sobre el directorio que almacena nuestra copia de trabajo e ir a SVN Update. Figura 5: Actualización de una copia de trabajo. Si deseamos utilizar la versión en línea de comandos, basta con invocar el comando update de SVN, desde el directorio de la copia de trabajo: cd /directorio/copia/trabajo svn update En ambos casos, veremos una salida similar a: svn update U main.cpp Updated to revision 3. Si interpretamos la salida, quiere decir que alguien ha modificado el fichero main.cpp, y lo hemos actualizado, de ahí la U (Update) que aparece en la línea resaltada. Si no 1 SUBVERSION 8 obtenemos ningún mensaje de este tipo, querrá decir que no existe ninguna diferencia entre lo almacenado en el repositorio y nuestra copia local. En caso de desear información detallada sobre los cambios existentes entre su copia local y el repositorio, podemos enviar el comando diff a Subversion o mediante Tortoise SVN ->Check for modifications. cvs diff 1 Lo que puede producir la siguiente salida: svn diff svn diff Index: main.cpp ============================ — main.cpp (revision 3) +++ main.cpp (working copy) @@ -1,5 +1,5 @@ /* -* Ejemplo básico de uso de las QT (2): +* Ejemplo básico de uso de las QT, editor de textos: * Ejecute: qmake -project qmake make @@ -47,7 +47,7 @@ WidgetPrincipal::WidgetPrincipal( QWidget *parent, const char *name ) : QWidget( parent, name ) { - setMinimumSize( 200, 120 ); + //setMinimumSize( 200, 120 ); //setMaximumSize( 400, 240 ); /* Si lo que deseamos es ver el log o registro de modificaciones puede ejecutar cvs log2 o Tortoise SVN ->Show log, y obtendrá una salida parecida a: svn log main.cpp 1 Las líneas que comienzan por - han sido cambiadas por las que comienzan por + 2 La mayoría de comandos que enviamos al repositorio aceptan como argumento un fichero, que será sobre el que se realice la acción, por ejemplo, si sólo nos interesa el historial de cambios realizados a main.cpp, ejecutamos svn log main.cpp 1 SUBVERSION 9 ———————————————————————— r3 | boreal | 2004-08-07 18:08:48 +0200 (Sat, 07 Aug 2004) | 1 line He añadido comentarios al código ———————————————————————— r2 | boreal | 2004-08-07 18:03:52 +0200 (Sat, 07 Aug 2004) | 1 line He cambiado el nombre del ejecutable ———————————————————————— r1 | boreal | 2004-08-07 17:31:34 +0200 (Sat, 07 Aug 2004) | 1 line Importación inicial al repositorio SVN ———————————————————————— Enviar mis propios cambios Cuando concluyamos nuestro trabajo diario, es el momento de enviar nuestros cambios al repositorio, para ello, simplemente hemos de invocar al comando commit de SVN o SVN Commit sobre el directorio de la copia de trabajo. Dichos comandos nos preguntarán por el log que queremos añadir a nuestros cambios, es muy recomendable que se indiquen los cambios, para que el resto de desarrolladores no tengan que jugar a ser adivinos. cd /home/boreal/Proyectos/miProyecto svn commit –message "Desactivación del tamaño mínimo de la ventana" Tras lo cual obtendremos una salida similar a: svn commit –message "Desactivación del tamaño mínimo de la ventana" Sending main.cpp Transmitting file data . Committed revision 4. Gestionar ficheros y directorios Puede que en algún momento necesite añadir o eliminar ficheros o directorios a su proyecto, realizar ésto es muy sencillo si usamos Tortoise SVN, al realizar el commit se nos desplegará una ventana informando de ello, simplemente activamos o desactivamos la casilla correspondiente para añadir o eliminar ficheros/directorios. 1 SUBVERSION 10 Figura 6: Nuevo fichero detectado al realizar un commit Si optamos por la herramienta en línea de comandos: Para añadir un directorio (hemos de crearlo antes en nuestra copia de trabajo): svn add directorio Para añadir un fichero (también ha de existir en la copia de trabajo): svn add fichero Tras ejecutar alguna de las acciones anteriores, realizamos el commit: svn commit Para crear un nuevo directorio bajo control de versiones en la copia de trabajo: svn mkdir Si deseamos borrar un fichero, basta con ejecutar: rm fichero svn delete fichero (si es un directorio, SVN no lo borra inmediatamente, sino que espera hasta que hagamos el commit para borrarlo tanto de la copia local como del repositorio) svn commit 2 2. MÓDULOS EN EL REPOSITORIO 11 Módulos en el repositorio Tenemos los siguientes módulos disponibles en el repositorio de Sourceforge: eqalign-win, módulo EQAlign para Windows sobre MS.NET. installer, submódulo contenedor de los scripts del instalador. trunk, rama de desarrollo principal (inestable). branches, distintas ramas/releases, normalmente estables. eqalign-win-1_0, rama 1.0 de eqalign, estable. installer-win-1_0, rama 1.0 del instalador, estable. eqalign-mono, EQAlign para Linux/Windows sobre Mono. trunk, rama de desarrollo principal, inestable. doc, módulo contenedor de la documentación sobre EQAlign. Es posible obtenerlos todos al mismo tiempo realizando un checkout del repositorio https://svn.sourceforge.net/svnroot/eqalign o bien obtenerlos individualmente, por ejemplo, para obtener una copia de trabajo de la rama estable 1.0, habría que realizar un checkout de: https://svn.sourceforge.net/svnroot/eqalign/eqalign-win/branches/eqalign-win-1_0. Si lo deseas puedes navegar por estos módulos en la url https://svn.sourceforge.net/svnroot/eqalign/