Curso Subversion: Temas avanzados

Temas avanzados

Bloqueos

En algunas ocasiones, especialmente cuando se trabaja con ficheros binarios, es conveniente que no se permita trabajar en paralelo sobre un fichero, ya que los conflictos que podrían provocarse serían de muy difícil solución.

En esos casos conviene bloquear el/los fichero/s en cuestión para prevenir que nadie pueda subir una modificación antes de que el desarrollador que bloquea lo haga.

Un bloqueo se hace así:

Sobre la copia de trabajo:

svn lock archivo1 archivo2 ...

Y se desbloquea así:

svn unlock archivo1 archivo2 ...

Con svn st -u se pueden descubrir los ficheros bloqueados por otros desarrolladores:

$ svn status -u
M               23   bar.c
M    O          32   raisin.jpg
        *       72   foo.h
Status against revision:     105

Los bloqueos no son sacrosantos y otros usuarios pueden desbloquearlos haciendo simplemente:

svn unlock --force http://curso-svn.juandarodriguez.es/mapbundle/trunk/composer.json

No obstante, si alguien ve que hay un fichero bloqueado, debería preguntarse que por algo será. Y se debería poner en contacto con el equipo para saber por que está bloqueado antes de desbloquearlo con --force.

En el caso de que alguien desbloquee con --force, cuando el usuario que creó el bloqueo por primera vez hace svn update -u, recibe el código B.

$ svn status -u
 B          32   raisin.jpg
Status against revision:     105

El administrador de svn también puede desbloquear con:

svnadmin rmlocks /var/svn/repos/mapbundle/trunk/composer.json

Propiedades

Las propiedades son metadatos que podemos asociar a los ficheros y directorios que están bajo control de versiones. Las propiedades llevan asociadas un valor y pueden ser definidas por los usuarios de una manera libre. Simplemente hay que evitar que su nombre comience por svn:, ya que el propio subversion utiliza propiedades para su uso interno y todas ellas comienza por dicho prefijo. Además el nombre de las propiedades debe contener únicamente caracteres ASCII. Las propiedades de ficheros y directorios son versionadas de la misma manera que cualquier otro item.

Las propiedades se pueden asociar también a las revisiones como un todo. Estas propiedades, no obstante, no son versionadas. Es decir, si cambiamos o borramos una propiedad asociada a una revisión, no hay manera de recuperar sus valores anteriores.

Utilidad de las propiedades

Ejemplo del libro: Un conjunto de imágenes a las que se añaden un título y texto descriptivo.

Un ejemplo de propiedades de revisiones: colocar un trackerID para sistemas de bugtracking.

Crear y modificar propiedades

Se pueden asignar directamente:

svn propset copyright '(c) 2006 Red-Bean Software' calc/button.c

O obtenerlas de un archivo con el modificado -F:

svn propset license -F /path/to/LICENSE calc/button.c

Las propiedades asociadas a ficheros y directorios se suben al repositorio al hacer commit.

Las propiedades asociadas a revisiones se realizan en el momento de hacer el commit:

svn commit -m "corrijo bug 455" --with-revprop "testresult=all passing"

También se pueden editar la propiedades con propedit desde el editor que se tenga configurado:

svn propedit copyright calc/button.c

NOTA:

Para configurar un editor para subversion basta que exista una variable de entorno denominada EDITOR, SVN_EDITOR o VISUAL, con el nombre del editor a utilizar.

Listar propiedades

svn proplist calc/button.c
svn proplist *
svn proplist . --recursive
svn proplist calc/button.c -v

Borrar propiedades

svn propdel license calc/button.c

Subversion también asocia automáticamente propiedades. Por ejemplo, a todos los ficheros ejecutables, se les asocia la propiedad svn:executable. Y los logs de una revisión no son más que la propieda svn:log de la revisión.

svn propget svn:log --revprop -r 3

Además estas propiedades que asigna automáticamente subversion pueden ser cambiadas con:

svn propset svn:log "cambio el log" -r10 --revprop

Aunque para que esto último sea posible es necesario que el repositorio esté configurado para permitir cambios en las propiedades. Lo cual se hace añadiendo un hook denominado revprop-change. El concepto de hook lo veremos en la siguiente unidad.

Externals

Es muy frecuente que al desarrollar una aplicación se utilice código de terceros (librerías por ejemplo) que no deseamos modificar.

Subversion proporciona la posibilidad de asociar al proyecto los repositorios que alojan estas librerías de terceros para que al hacer checkout o update del proyecto, se haga también checkout o update del código de terceros.

Para ellos se utiliza la propiedad svn:externals, que como cualquier otra podemos editar con svn propset o svn propedit.

Pongamos un ejemplo:

$ svn propget svn:externals calc
      http://svn.example.com/repos/sounds third-party/sounds
-r148 http://svn.example.com/skinproj third-party/skins
-r21  http://svn.example.com/skin-maker third-party/skins/toolkit

Si se hace checkout o update del directorio calc, subversion continuará haciendo checkout de todos los repositorios listados en la propiedad svn:externals, en la revisión indicada, y los colocará en el directorio establecido en dicha propiedad.

Parches

Un parche no es más que un archivo donde se especifican los cambios que se han realizado en todos los ficheros de un determinado changeset. Dichos cambios se muestran como lineas añadidas y eliminadas. Una linea modificada se muestra como una linea borrada y otra añadida.

Estos archivos son procesables con el programa patch, que puede aplicar los cambios indicados sobre los archivos de un proyecto.

Creando el patch:

Sobre los cambios realizado en una copia de trabajo:

svn diff > patch.diff

Sobre los cambios realizados en una revisión concreta:

svn diff -r 20 > patch.diff

Sobre los cambios realizados entre dos revisiones:

svn diff -r 10:20 > patch.diff

Sobre los cambios realizados entre dos revisiones del repositorio:

svn diff http://curso-svn.juandarodriguez.es/svn/mapbundle/tags/1.0
         http://curso-svn.juandarodriguez.es/svn/mapbundle/tags/1.1

Aplicando el patch con svn:

svn patch patch.diff

Aplicando el patch con patch (no requiere copia de trabajo):

patch -p0 -i patch.diff

Utilidad de los parches:

Administración del repositorio >>>