Tuesday, May 4, 2010

De CVS a Subversion

Des de que vaig conèixer els sistemes de control de versions els faig servir sempre que haig d'editar codi, encara que siguin els enunciats de les pràctiques de la UOC.

Des de fa molts anys he fet servir CVS (Concurrent Versions System) i estava encantadíssim. L'he instal·lat i configurat amb Windows i Linux, i he tingut estones molt "entretingudes" resolent problemes de branques, arxius ignorats, monitorització de canvis, publicació a través de firewalls, etc. Una cosa que m'agradava molt era que totes les dades del repositori eren text pla, així que resoldre alguns problemes era tema de grep i res més. Sentia parlar de subversion, però el fet de tenir el repositori en binari i que la integració amb Eclipse encara no era molt bona, feia que no em decidís.

Al projecte on sóc ara s'ha decidit fer servir Subversion (també conegut com svn), així que toca aprendre. Sembla que els conceptes de CVS s'apliquen directament i, de fet, era una cosa que van tenir en compte els creadors de Subversion: posar-li les coses fàcils als que venien de CVS.

M'ha sorprès que sigui tan fàcil d'instal·lar al Windows. Hi ha diferents maneres d'accedir al repositori. La més habitual és fer servir el protocol http, però requereix configurar un Apache. Jo, de moment, estic atacant amb el protocol svn i aleshores sí que és fàcil d'instal·lar. Jo he seguit aquest tutorial d'instal·lació de subversion. Per arrencar el servidor només s'ha de fer:
C:/> svnserve -d -r c:\svn-repo
Per instal·lar-lo com a servei he fet el següent:

C:/> sc create svn.local binPath= "\"C:\Program Files\Subversion\bin\svnserve.exe\" --service --root c:\svn-repo" DisplayName= "Subversion Repository"

Per fer-me més fàcil l'adaptació he llegit el The Top Ten Subversion Tips for CVS Users.
D'entrada el més diferent és el mecanisme de etiquetes (tags) i branques (branches). En comptes d'etiquetes sobre el codi el que es fa és una còpia de tot el projecte. El que passa és que a subversion manega aquestes còpies de manera que són molt eficients. Per aquesta raó, la configuració de les carpetes de projecte s'acostuma a fer de la següent manera:
  • projecte
    • tags
    • branches
    • trunk
Una vegada un company va confondre trunk amb el HEAD del CVS, però el subversion també té el concepte de HEAD. A trunk és on està el codi més actual del projecte i que es va evolucionant. A trunk hi ha una història, i pots recuperar el trunk de fa N dies. La darrera revisió del trunk és el HEAD. Fer una etiqueta (un tag) és fer una còpia del codi a la carpeta tags. El codi dintre de tags no s'hauria de canviar.

Una altra cosa diferent és com gestiona el números de les revisions. A CVS cada fitxer té un número de revisió diferent. El número té un format diferent si estàs a una branca. A Subversion, cada vegada que fas un commit el número de revisió de tot el projecte s'incrementa. Si faig un commit del fitxer A i em retorna el número de revisió 16. Quan faci un commit del fitxer B, em retornarà el número de revisió 17.

Una funcionalitat que em semblava fantàstica de CVS: el keyword expansion. Si en un fitxer poses el text $Id$ (per exemple) el CVS quan treguis el fitxer del repositori et substiturià l'etiqueta per tota la informació del fitxer (nom, autor, versió, data de darrera modificació). Això va molt bé per tenir identificades les versions de cada fitxer quan el projecte surt de l'entorn de desenvolupament. Sembla que aquesta característica no està habilitat per defecte a subversion, però he trobat un document que explica com es pot activar le keyword expansion a subversion. Espero dominar més el tema, però de moment tinc aquesta xuleta:
  • A l'Eclipse fer clic amb el botó dret a la carpeta del projecte, triar Team=>Set Property
  • Posar el nom de la propietatsvn:keywords
  • Posar el text de la propietat: Author Date Id Revision HeadURL
  • Marcar "Set property recursively"

He estat fent servir el subversion des d'Eclipse (integració excel·lent), amb línia de comandes Linux i amb el TortoiseSVN i es veu molt madur tot plegat i cada cop veig més els avantatges davant CVS.

Hi ha més coses que xoquen d'entrada, però cada cop em sento més còmode. També m'estic llegint un llibre de Subversion que m'està ajudant força (i que ja comentaré al Estic llegint).

Ara toca adoctrinar en l'ús de subversion, resoldre incidències dels desenvolupadors i, el més difícil, convèncer a desenvolupadors de PL/SQL a que és millor que no codifiquin directament sobre la base de dades.

1 comment:

Toni Tassani said...

Es pot afegir a la comanda de creació un --listen-port per que escolti per un port diferent del 3690.