Cuando comienzas a desarrollar en una nueva plataforma con nuevas herramientas siempre te ocurre lo mismo, necesitas encontrar un sistema que te garantice un control con las versiones. En este post quiero ofrecer un pequeño tutorial para que todo el mundo que desarrollea bajo XCode pueda tener un control de versiones de forma gratuita, si bien al final de este tutorial recomendaré una aplicación muy útil y que no es demasiado cara.
En este tutorial os ofreceré pequeños scripts que facilitarán la tarea de crear repositorios, proyectos, etiquetar versiones, realizar ramificaciones en el código, el motivo de este tutorial es realizar un acercamiento al control de versiones y si bien subversión dispone de servidores que trabajan bajo Apache, en este tutorial usaremos svnserve que es un versión ligera para desarrollos individuales, y que viene instalado por defecto con OS X. Si deseas usar el servidor con Apache en la web de Apple encontrarás información suficiente como para dar el paso una vez que hayas aprendido lo básico con este tutorial.
Bueno y que mejor forma de empezar que poniendonos manos a la obra, en primer lugar vamos a crear un repositorio donde se alojará el control de versiones, podemos tener tantos repositorios como queramos, al igual que dentro de un repositorio podremos tener distintos proyectos, la organización en ellos dependerá de nuestros intereses y del alcance de los proyectos. Yo os recomiendo un repositorio por proyecto grande.
Creación de un repositorio
Un repositorio es el lugar donde se almacena nuestro proyecto y sus versiones. Como XCode solo permite tener un proyecto en la carpeta raiz del repositorio, crearemos una carpeta Porojects que contendrá a los proyectos individuales.El siguiente script nos permitirá crear un repositorio con su carpeta Projects en la carpeta raiz. Si os fijáis las primeras lineas del script ponemos un ruta en hardcode, esa ruta será donde se ubicarán nuestros repositorios, podeis cambiarla si quereis.
#!/bin/ksh
# Script para generar un repositorio nuevo SVN
# Ponemos la ruta donde se creará el repositorio para Subversion
# la ruta debe existir, yo la creo aquí abajp
mkdir -p /Library/Subversion/Repository
reporoot=/Library/Subversion/Repository/
# Nombre de la carpeta de proyectos
projdir=Projects
# Crea el repositorio
echo "Introduce el nombre para el nuevo repositorio:"
read repo
echo
echo Creando el repositorio: $repo
svnadmin create $reporoot/$repo
echo
echo Creando el directorio para proyectos: $projdir
svn mkdir -m "Directorio para Proyectos" file://$reporoot/$repo/$projdir
echo
echo Creación del repositorio finalizado
echo Puedes crear un proyecto nuevo...
echo
Creación de un Proyecto
La creación de un proyecto en subversión tiene una estructura basada en tres carpetas, branches, tags y trunk. Trunk es la carpeta donde se encuentra la versión de codigo que se está siguiendo en la actualidad. La carpeta tags se usa para marcar las versiones que se tratan como releases (versiones estables). La carpeta branches se usa para tratar versiones de código experimentales o mejoras que se hace al código pero dada su complejidad se prefiere ramificarlo y sacarlo de la versión actual.
Con el siguiente script generaremos un proyecto dentro del repositorio. Al igual que en el script de creación de repositorio las primeras lineas son la ruta donde se encuentra el repositorio, deberéis ponerlas en sintonia con el anterior script.
#!/bin/ksh
# Script para crear un nuevo proyecto para Subversion
# Remplaza esto con la dirección de donde esta tu repositorio de proyectos
# En mi caso Safe es el nombre del repositorio y Projects la carpeta de proyectos
reporoot=/Library/Subversion/Repository/Safe/Projects
# Creamos un nuevo proyecto
echo "Introduce un nombre de proyecto:"
read project
# Limpiamos el directorio tmp
rm -rf /tmp/project
echo
echo Creando directorios temporales
mkdir -p /tmp/project/$project/trunk /tmp/project/$project/branches /tmp/project/$project/tags
echo
echo Importando $project a Subversion
svn import /tmp/project/ file://$reporoot -m "Initial import"
echo
echo Limpiando…
rm -rf /tmp/project
echo
echo "Directorios creados!"
echo "Importa tu proyecto a través de SCM en Xcode"
echo
Una vez que tenemos generado el esqueleto de nuestro proyecto en Subversion, llega el momento de trabajar desde Xcode para pasar nuestro proyecto al control de versiones.
Subversion en Xcode
Lo primero que vamos a hacer es habilitar el SSH Server en nuestro Mac, para realizarlo nos vamos a las Preferencias del sistema, dentro del grupo Internet y conexiones inalámbricas seleccionamos Compartir.
Dentro de compartir activamos la opción Sesión Remota, ahora el servidor SSH está en ejecución y podemos seguir adelante.Una vez activado el servidor SSH nos queda la asignación del repositorio en Xcode, para ellos ejecutamos Xcode, y sin abrir ningún proyecto nos vamos a la opción de menu SCM, dentro de SCM seleccionamos “Configure SCM Repositories…” Esto nos abrirá la pantalla de configuración de repositorios, seleccionamos el botón +, para añadir un nuevo repositorio, e indicamos que es de tipo Subversion y le damos un nombre.
Ahora tenemos que configurar el acceso a nuestro repositorio. Deberemos introducir los datos de Scheme, Host, Path, Port, User, Password.En el apartado Scheme, pondremos svn+ssh, en Host el nombre de la maquina.local o bien localhost, en Path el path absoluto hasta el repositorio que hemos creado, en Port lo dejamos en blanco, User el usuario que usamos para el inicio de sesión y la password correspondiente a ese usuario. Una vez completados estos datos, veremos como automaticamente se rellena el campo URL y si todo lo hemos puesto de forma correcta, veremos que abajo nos pone Authenticated, si no fuera así revisar todos los datos por que seguro que nos habremos equivocado en alguno, una vez solucionado, veréis como nos autentica correctamente.
Ahora nos toca configurar nuestros proyectos, hay que recordar que bajo el control de versiones queremos poner los ficheros que modificamos nosotros, así que será una tontería meter los ficheros que crea el sistema en las compilaciones, pues estos son automáticos y se generan a partir de nuestros fuentes. Así que vamos a modificar nuestros proyectos para que el directorio de compilación sea distinto al de los fuentes. Pulsamos botón derecho del ratón sobre el proyecto y seleccionamos “Get Info”.
Ahora en los apartados de “Place build products”, y “Place Intermediate Build files”, cambiamos sus destinos para que apunten a otros directorios distintos a los de los fuentes, y así los sacaremos del control de versiones.Bueno, bueno… ya estamos muy cerca de tener nuestro código bajo el control de subversion. Pero antes de añadir el proyecto veamos la configuración de nuestro repositorio. Nos vamos de nuevo al menu de Xcode SCM y seleccionamos “Repositories”.
Vemos una nueva pantalla en la que podemos navegar por los repositorios que hayamos registrado. Dentro del repositorio veremos, la carpeta Projects, dentro de ella los distintos proyectos y dentro de estos a su vez los directorios trunk, tags y branches que ya explicamos para que los íbamos a utilizar.Vamos a realizar la importación de uno de nuestros proyectos al gestor de versiones subversion, para ello nos situamos en la carpeta trunk del proyecto , y pulsamos sobre el botón “Import”.
Bueno vamos a dar un breve repaso antes de seguir, al principio con el script nos hemos creado un repositorio, después ejecutamos otro script para crearnos un proyecto, posteriormente hemos configurado XCode y hemos agregado el repositorio que creamos en los primeros pasos y configuramos nuestro proyecto para que compile en directorios separados al del fuente ¿Ahora que vamos a hacer? Pues vamos a decirle a subversion a traves de Xcode que coja nuestro fuente y lo incorporé a su repositorio de control de versiones, es importante en este punto que en ese directorio no haya ningún directorio de compilación, no es por nada pero no queremos tener ficheros bajo control de versión carentes de sentido.Ahora ya si, pulsamos el botón “Import” y buscamos nuestro proyecto de XCode, una vez seleccionado pulsamos el botón Import y Subversion automaticamente poblará nuestro directorio trunk en el repositorio.
¿Ya está todo? ¿Ya podemos trabajar con el control de versiones? No aún no, como hemos dicho ya tenemos importado el proyecto en subversion pero necesitamos crear una copia de trabajo en otro directorio y sobre esa será sobre la que trabajemos (tendremos un representante de la versión en el directorio que le digamos), yo lo que suelo hacer es renombro la carpeta original que importé con el sufijo temp y así tengo el origen antes de ponerlo en el gestor de versiones (luego una vez que todo se ha hecho correctamente lo borro). Para generar esta copia de trabajo seleccionamos el icono “CheckOut”, al seleccionarlo nos pedirá un directorio donde copiar los fuentes que estarán bajo control de versión, y ya tenemos el proyecto listo para comenzar a trabajar.
Una vez que hemos realizado el “Checkout” XCode nos preguntará si queremos abrir el proyecto en XCode para comenzar a trabajar. En nuestro caso abrimos el proyecto y modificamos la clase Point.h, le damos a guardar y vemos como hay una nueva columna a la izquierda que nos marca con una M que ese fichero lo hemos modificado.
Si creamos un nuevo fichero este aparecerá con el signo ? hasta que guardemos el nuevo fichero y entonces veremos como lo marca con una A y el archivo del proyecto lo marcará con una M. A partir de este momento todo esta bajo el control de versiones.Si estas familiarizado con el control de versiones, verás como ahora desde el menu SCM tenemos acceso a las distintas opciones, “Commit Changes…” nos marcará los cambios que hayamos hecho como una nueva versión en el repositorio, “Discard Changes…” descartará los cambios que hayamos realizado y nos situará en la versión base que nos habiamos obtenido con anterioridad, también podemos realizar estas tareas de forma individual para cada fichero accediendo al menu contextutal, botón derecho del ratón sobre el fichero.
Al igual que podremos realizar las tareas de comparar versiones distintas de código, obtener las diferencias, actualizar nuestra versión local por si se han realizado cambios y queremos estar al tanto de dichos cambios, etc. Como tutorial de entrada y pensando que estamos trabajando de forma individual, no tendremos problemas de conflictos entre modificaciones, pero tener en cuenta que cuando trabajemos en un equipo y varios miembros toquen un mismo fichero, se podrán generar situaciones de conflictos que se resolverán con Merge, este tema está fuera del alcance de este post.
Cada vez que realicemos un “Commit” es interesante que indiquemos con una descripción precisa los cambios realizados, así cuando tengamos que comparar versiones podremos buscar rápidamente entre ellas. Una opción de menu muy importante es “Get Info”, ya que desde esta opción y en la pestaña de SCM veremos el árbol de versiones existente para ese fichero.
Seleccionando cada versión veremos la fecha, el número de revisión, la anotación que pusimos, etc. Y ademas podremos seleccionar dos versiones y compararlas, ver diferencias, etc. En este caso os muestro la compraración entre la revisión 39 y 40. Como podeis observar el cambio ha sido quitar la coordenada Z. Es interesante que cuando estes probando esto, useis en primera instancia un proyecto tonto hasta que domineis todos los conceptos del control de versiones.Si bien XCode da soporte a Subversion y nos permite de una forma comoda e intuitiva llevar nuestro control sin software externo alguno, es cierto que tiene algunas carencias importantes, que podremos encontrar en clientes comerciales de subversion como por ejemplo CornerStone, o incluso en clientes de subversion gratuitos como por ejemplo svnX.
Para finalizar os voy a dejar un par de scripts, uno que nos permitirá etiquetar una revisión, y otro que nos permitirá realizar una ramificación. Es decir llevarlos a los directorios tags y branches, anteriormente ya dijimos para que se usaban estos directorios.
Etiquetar una revisión
#!/bin/ksh
# Script para marcar un código como version
reporoot=/Library/Subversion/Repository/
projdir=Projects
# Nombre del repositorio
echo "Introduce el nombre del repositorio:"
read repo
# Nombre del proyecto
echo "Introduce nombre del proyecto:"
read project
# Numero de release
echo "Introduce numero de release:"
read release
# versionamos la release
svn copy file://$reporoot/$repo/$projdir/$project/trunk file://$reporoot/$repo/$projdir/$project/tags/release-$release -m "Versionando la release $release del proyecto ‘$project‘."
echo
echo Completada la Version de la release $release del proyecto $project
echo
Ramificar una revisión
#!/bin/ksh
# A script to branch a SVN trunk
reporoot=/Library/Subversion/Repository/
projdir=Projects
# Prompt for repository name
echo "Enter repository name:"
read repo
# Prompt for project name
echo "Enter project name:"
read project
# Prompt for branch name
echo "Enter branch name:"
read branch
# Create branch
svn copy file://$reporoot/$repo/$projdir/$project/trunk file://$reporoot/$repo/$projdir/$project/branches/$branch -m "Creating a branch of the ‘$project‘ project."
echo
echo Creating a branch of the $project project Complete!
echo
Con este breve tutorial ya deberíais ser capaces de trabajar de una forma más correcta con vuestro código fuente.
Cliente de subversion de pago, CornerStone
Yo por mi parte os recomendaría la adquisición de CornerStone, una herramienta que nos ayudará de forma sencilla y potente a la gestión de nuestras versiones. Nos permitirá volver a cualquier revisión que queramos, no solo a la última como podemos hacer desde XCode, podremos etiquetar y ramificar las revisiones de una forma visual y rápida, creación del esqueleto del proyecto de forma visual, etc. Es decir nos ayuda a gestionar de forma visual todo el repositorio (o repositorios) sin tener que ejecutar ningún script. Lo dicho CornerStone es casi una herramienta obligatoria si no quieres pelearte con subversion a través de la linea de comandos.
Con CornerStone además podremos editar los ficheros tanto en la working copy como desde el repositorio remoto, visualizandolo con la herramienta adecuada. Podremos ver la evolución del proyecto en su Timeline, es decir nos facilitará mucho el trabajo y si nuestro entorno de desarrollo no es XCode, entonces su compra se torna en obligada. Un excelente Cliente SVN que merece la pena por lo menos que le echéis un ojo a su versión de prueba.
Ojo la gestión de versiones no solo se usa para codigo fuente, es posible llevar tambien un control de versiones para cualquier tipo de fichero que imaginemos, como por ejemplo una simple foto (Cada cual que le vea su utilidad).
Como colofón de fin de fiesta os adjunto una dirección para la descarga de un libro sobre control de versiones con Subversion, totalmente en castellano y en formato libre.





















Excelente. Estoy me vendrá muy bien! Merci por compartirlo