Tutorial Inicial Eclipse / SVN Introducción El objetivo de este documento es presentar varias herramientas que utilizamos comunmente en los proyectos de desarrollo de software. Las herramientas que vamos a comentar son: SVN Eclipse ¿Qué es SVN? SVN o mejor dicho Subversion es un sistema de control de versiones o SCM, permite la integración y el trabajo de un grupo de personas distribuido. Además de sincronizar y distribuir versiones de archivos, permite el manejo de versiones de los mismos. Esto nos facilita la forma de trabajo y nos permite que múltiples personas interactúen sobre los mismos archivos, por supuesto con cierto cuidado. Trabaja teniendo una copia local (working copy) donde el usuario actúa sobre los archivos como si fueran archivos comunes, y una copia de los mismos en el servidor. En el servidor se mantienen todas las versiones, permitiendo volver a cualquiera de ellas, las versiones se aplican a nivel de archivos, o sea puedo traerme la versión x de un archivo y la x+n de otro. El usuario trabaja sobre su working copy, generando cambios sobre archivos, creando nuevos o borrando archivos. Una vez que considera que tiene cambios que quiere propagar a todo el equipo hace un commit, que es impactar los cambios de sus archivos en el servidor generando una nueva versión (revision). Cuando hacer commit (o commitear en spanglish) va a depender de como trabaja cada grupo, se considera políticamente correcto no commitear cosas que rompan todo el proyecto, pero tampoco es políticamente correcto commitear cada 6 meses ya que es más que probable que se modifiquen los mismos archivos por varios usuarios. En caso de que se modifique el mismo archivo en dos usuarios distintos, el svn trata de hacer un merge (integrar o mergear los archivos) pero si no puede porque tocaron las mismas líneas o parecidas va a generar un conflicto que se debe resolver a mano. Existen clientes y servidores de Subversion para distintas plataformas, todas pueden interactuar entre sí, básicamente para este tutorial se van a mostrar todos los pasos necesario. Pero es posible usar clientes visuales como TortoiseSVN (para Windows) o RapidSVN (para Linux). TortoiseSVN tiene el beneficio de integrarse con el explorador de archivos, permitiendo hacer las operaciones con un click del botón derecho. Además de los clientes standalone existen plugins para integrar SVN con los IDE más utilizados, no solo de Java, sino de casi cualquier cosa. Subversion: http://subversion.tigris.org/ TortoiseSVN: http://tortoisesvn.net/ Subclipse (plugin de Eclipse): http://subclipse.tigris.org/ 1 - Como crear un repositorio Para la gestión de un proyecto vamos a necesitar un servidor de SVN. Para esto hay varias posibilidades, por un lado se puede tener un servidor svn en un servidor privado (en el cual se instala el servidor de SVN y se le da acceso a los participantes del proyecto), o bien, se puede utilizar un servidor gratuito como http://www.xp-dev.com/ (en internet hay muchas más posibilidades, es cuestión de curiosear un poco), en si, la configurarción de estos servidores, consta en que una de las personas cree un usuario, luego un repositorio (un repositorio no es más que una carpeta en el servidor, pero de ahora en más, la vamos a llamar respositorio, porque eso es lo que representa, un repositorio de nuestro código en un servidor), y luego los demás participantes del proyecto también crean sus propios usuarios, a los cuáles el creador del repositorio irá dándoles permisos (creador significa creador, nada más, no es el dueño, es simplemente que esta tarea, la debe hacer sólo uno la primera vez). No olvidemos que lo más importante de la herramienta es que podamos compartir el código, nadie es propietario del código, ni de niguna parte de él, sino que todos colaboramos en la construcción de un mismo sistema. El código es de todos. Una vez que hayamos terminado de crear el repositorio, tenemos que obtener una url (url del servidor/nombreDelRepositoro) con la cual vamos a interactuar desde el cliente SVN ¿y esto? Esto lo próximo que vamos a ver. Más adelante vamos a ver bien que tenemos que hacer con esta url, pero en un rato, por ahora, mantengamos en mente que lo que tenemos hasta ahora, es un servidor de svn, con un repositorio donde vamos a tener nuestro proyecto versionado y una url, para poder acceder a él. 2 - Instalación del Eclipse y del plugin SVN Este paso lo pueden cambiar por la IDE que más les guste. Para poder instalar Eclipse es necesario bajarlo de Internet, se encuentra http://www.eclipse.org/downloads/, preferentemente la versión para Java EE Developers. en Para realizar la instalación se deberá descomprimir el paquete en donde va a quedar instalado. Si se instalo correctamente la JDK al hacer doble click debería abrir el Eclipse. Para poder integrar SVN, y Eclipse hay que instalar un plugin para SVN, esto se hace desde el eclipse: Help -> Install New Software -> y ahí tienen que poner el site del plugin que van a bajar. Está el botón de Add para agregar uno que no tengan, o bien, ahi abajo tienen un link “Available Software Sites”, donde pueden buscar el plugin. Luego tienen que seleccionar de la listita que les aparece ahí abajo lo que se van a bajar, y después el eclipse los va a ir guiando en la instalación del plugin. Listo, entonces ahora ya tenemos, un repositorio svn donde va a estar nuestro proyecto, y el cliente svn en el eclipse para que podamos interactuar con él, entonces ya podemos empezar a laburar. 3 - Agregar el repositorio en el eclipse ¿Qué es lo primero que hay que hacer? Bueno, lo primero sería subir una primera versión del proyecto en el svn. Pero antes, volvamos al tema repositorio que nos faltan dos cositas más: Primero en el eclipse vamos a la perspectiva del svn para agregar ahí la url ¿se acuerdan? La url del repositorio, entonces vamos a Window -> Open Perspective -> SVN Repository Exploring, eso nos abre la perspectiva de svn (esta perspectiva la tenemos después de que instalamos el plugin de SVN en el eclipse, si por algun razón la instalación salió mal, entonces no está, tenemos que primero asegurarnos de tener le plugin bien instalado), ahi, botón derecho, New -> Repository Location, y ahí pegan la url (les va a pedir el usuario, la contraseña) y listo! Ya tenemos a nuestro cliente SVN en el eclipse, conectado con nuestro servidor SVN. Es decir, en esta ventana, vamos a ver el proyecto como está en el servidor SVN (la versión más posta del proyecto). Hasta aca, esto deben hacerlo TODOS los integrantes del equipo. Pero ahora el repositorio está vacío, así que ahí (siempre desde nuestra perspectiva del eclipse), alguno (sólo uno) debe crear 3 carpetas (esta es la segunda cosita que nos falta), la carpeta trunk, tags, y branches (esto lo estaríamos haciendo directamente sobre el servidor). Trunk va a ser nuestro proyecto, es decir, lo que nosotros vemos en el eclipse como nuestro poyecto java, donde adentro van a estar las carpetas src y test, eso mismo va a ser el trunk. Tags y branches van a ser carpetas donde vamos a guardar otras versiones del mismo proyecto. Luego vamos a ahondar sobre este tema. Entonces ahora si: 4 - Subir un proyecto al SVN Basta con ponerse de acuerdo, y uno de los integrantes del proyecto, crea el proyecto en su eclipse y lo sube al repositorio, luego todos los demás se lo bajarán en sus máquinas. Entonces, este paso se hace de la siguiente manera (recuerdan que esto se hace una sola vez, por una de las personas del equipo): Se crea un proyecto Java en el eclipse, preferentemente con la siguiente estructura: dos Source Folders, una que se llame src, para las clases del proyecto, y otra que se llame tests, para poner la clases de tests. Listo, con esto (y/o con cualquier otra cosa que quiera agregarle) ya puedo subir el proyecto al repositorio, para esto, click derecho sobre el proyecto, Team -> Share Project, eligen la opción SVN, y ahí tienen dos opciones: “Create a new repository location” si no la tienen, y ahí pongo la url del repositorio que debería ser algo parecido a: http://svn.nombreDelServidor.com.ar/tp/trunk por ejemplo. “Use existing repository location” si ya la tienen y la elijen de la listita (si pasaron por le paso 3, ya lo deberían tener). Y ahora me pregunta el nombre que le quiero poner a la carpeta. Una de las opciones que me propone es “Use project name as folder name”, esto significa que va a crear en el repositorio una carpeta con el mismo nombre que nuestro proyecto, y ahí va a poner todos los archivos de nuestro proyecto. Y la otra opción es “Use specified folder name”. Por supuesto que hay muchas maneras de subir el proyecto al repositorio por eso existen tantas opciones, nosotros en la materia vamos a proponer una que es standard, pero sepan que existen diferentes formas de hacer esto. Entonces, como nosotros queremos guardar nuestro proyecto en el trunk (más bien, el trunk ES nuestro proyecto) entonces vamos a elegir la segunda opción, y nosotros le vamos a decir donde lo tiene que guardar, así que ahí vamos a “Select...” y elegimos la carpeta “trunk”. Y listo, con esto, el proyecto ya está disponible, en esa dirección. Debería quedar algo así: Y ahí Finish. Esto debería llevarnos a otra perspectiva que vamos a usar mucho de ahora en más: Team Synchronizing. Esta vista lo que nos va a mostrar son los cambio locales que van a subir el servidor, y viceversa, los cambios del servidor que nosotros deberíamos agregar localmente. Es decir, mediante esta perspectiva vamos a mantener la comunicación entre nuestro proyecto local y el proyeto que está en el servidor. En esta vista deberíamo ver algo como: Esto significa que, hay cambios “salientes” (es decir, desde nuestro poryecto hacia el servidor, por eso la flecha para afuera) y el signo “+” significa que estos archivos/carpeta no existen en el servidor. Vemos que está todo bien, todo esto hay que subirlo al servidor. De vuelta ahora tenemos dos forma de hacer: Botón derecho sobre el proyeto -> Commit O bién, podemor apretar le botoncito que aparece arriba, redondeado en rojo, que hace lo mismo, “commietamos” (nuevo verbo que agregamos a nuestro vocabulario nerdístico) todos los cambios locales. Ahí nos aparece una ventana para dejemos un mensaje de lo que estamos subiendo. Es importante dejar un mensaje de lo que estoy commiteando así cuando quiera buscar algo con el mensaje lo voy a poder indentificar más rápidamente. Y listo! (por fin...) Para verificar que lo subí bien, en la perspectiva del SVN debería verse dentro de la carpeta trunk todas las carpetas y archivos de nuestro proyecto (de la misma manera que se ve dentro del proyecto java en el eclipse). 5 - Obtención del Proyecto desde el SVN Bién, hasta acá, ya tenemos: el servidor SVN, el cliente SVN en el eclipse, el repositorio creado en el servidor, y el proyecto subido al trunk del repositorio, ya casi!! Ahora, ese alguién que se tomo todo este trabajo, tiene que avisar al resto, que el proyecto ya está disponible para que todos empiecen a trabajar, en un esquema de código compartido. ¿Y que hacen los demás? Todos a esta altura deberíamos poder ver el repositorio desde el eclipse (sino, volver al paso 3). Así que vamos a la perspectiva SVN Repositories Exploring, nos paramos en la carpeta trunk (importante este paso... SOBRE la carpeta trunk) botón derecho -> Checkout. Y ahí “Check out as a project in the workspace”, le ponen el nombre que ustedes quieran (total este nombre sólo lo van a ver ustedes) -> Finish. Esto les va a crear un proyecto eclipse con el nombre que ustedes eligieron en el paso anterior. Esta carpeta debería contener lo mismo que contiene la carpeta trunk en el servidor. ¿Entonces que hice acá? Lo que hicimos hasta acá es bajar la última versión que hay del proyecto en el servidor en ese momento, y el eclipse automáticamente lo reconoce como un proyecto eclipse y lo agrega en mi repositorio local (lo que más arriba llamamos “working copy”), y acá es donde voy a trabajar localmente. ¿Localmente? Si, lo próximo que deberíamo ver es como subir todo mi trabajo local, al servidor. 6 - Commit, Sinchronize y update Ahora que ya tenemos el proyecto localmente (lo que tenemos es un copia de lo que hay en el servidor), entonces empezamos a hacerle cambios. Por ejemplo, agregamos un package con algunas clases, y un package test con una clase de test. Entonces, si vamos a la vista Team Synchronize, vamos a ver nuestro cambios, los que agregamos. Lo mismo que antes, verificamos que esté todo bien, y le damos commit. Hasta acá no hay ninguna ciencia. Ahora, que pasa si mientras nosotros estuvimos programando, hubo alguien que también se bajó el proyecto a su máquina, hizo sus cambios y “commiteó” antes que nosotros? Lo que pasa es que nuestro proyecto queda desactualizado, es decir, la última versión del proyecto, es la que está en el servidor, pero como alguien commiteó, entonces ahora la última versión cambió, y entonces nosotros ya no estamos trabajando sobre la última versión, sino sobre una anterior. El svn nos exige, que si nosotros vamos a subir cambios, lo hagamos sobre la última versión, ahora si nosotros hicimos cambios pero la última versión cambió, entonces, para subir nuestros cambios, primero, debemos estar parados sobre la última versión, para esto, vamos a la vista Team Synchronize, sobre el proyecto, botón derecho, Synchronizelo que conocemos como “sincronizar” (otro verbo que agregamos), justamente, para “sincronizarnos” con el proyecto que está en el servidor. Y en la vista de cambios entrantes vemos los cambios que están en el servidor, que no tenemos nostoros Ahí vemos el archivo que tiene cambios en el servidor, entonces, para bajarlo a nuestro proyecto local , sobre el proyecto hacemos botón derecho -> update. Esto actualiza nuestra versión del proyecto, con la que está en el servidor. Ahora que ya estamos parados sobre la última versión del servidor, ya estamos en condiciones de commitear nuestros cambios. 7 - Solución de conflictos Ahora, que pasa cuando esa persona justo justo modifió lo mismo que yo, es decir, modificó algún archivo, en el mismo lugar que yo, por ejemplo, en una clase Persona, donde ya había un atributo nombre, yo decido agregarle el atributo legajo, pero la otra persona que ya commiteó, le agregó el atributo domicilio, justo abajo del atributo nombre, en el mismo lugar donde lo puse yo!! Acá el svn no sabe que hacer, porque tiene un conflicto, cuando quiso actualizar nuestro proyecto con lo que está en el servidor, se encontró con que yo, en ese lugar tengo otra cosa, entonces el svn, no pisa los cambio, pero nos avisa que tenemos un conflico, el archivo nos aparece de la siguiente manera: El rombito rojo nos indica que en ese archivo, hay un conflico, si le damos doble click al archivo, el svn, nos va a mostrar donde está el conflico exactamente: Observemos atentamente este archivo, porque en verdad, nos está dando muchísima información: Primero lo que vemos es las dos versiones del archivo, la local, y la que está en el servidor. Lo que está en rojo, está claro, es donde tuvo el conflicto, donde no supo que hacer, ahí, a mano, hay que decirle como querría yo que me quede el archivo local. Entonces, copiamos la línea del servidor, a nuestro archivo, hasta que nos quede así: Después hay otra marca en negro (que marca un cambio nuestro hacia el servidor) y otra en azul, marcando lo contrario, un cambio en el servidor, que deberíamos tener nosotros. Al estar en azul, significa que, el svn ve que hay un cambio en el servidor que nosotros no tenemos localmente, pero que no tiene un conlicto, con lo que, apretando en el cuadradito que aparece en el medio (redondeado en rojo) lo pasa a nuestro archivo, y listo, el archivo ya estaría “mergeado” ¿que significa mergeado? Que ya junte todos los cambios, los mios y los del servidor, entonces, le aviso el eclipse que ya terminé de hacer el merge, para esto, botón derecho sobre el archivo -> Mark as Merge (este paso es importantísimo!! Hasta que no haga esto, el svn sigue pensando que estamos en conlicto y no nos va a dejar commitear. Ahora si, deberían irse todos los rombos colorados, lo que nos deja en la última versión, y en condiciones de commitear. Entonces vamos a la viste de cambios saliente: Y ahora si, botón derecho, commit. Ahora nosotros subimos al servidor, lo que sería la nueva última versión del proyecto. Aca, una buena práctica sería avisar al resto del equipo, que hay cambios subidos, para que el resto actualice su repositorio local. De todas maneras, SIEMPRE, cuando nos sentamos a trabjar, lo que primero que hacemos, en un sincronize, y un update, para asegurarnos siempre, de estar trabajando contra la última versión. Y con esto, ya somos regios usuario del svn.