Bloqueando

Subversion generalmente trabaja mejor sin bloqueos, utilizando los métodos Copiar-Modificar-Fusionar que se describieron anteriormente en el “La solución copiar-modificar-fusionar”. Sin embargo, hay algunas pocas situaciones en las que puede querer implementar alguna forma de política de bloqueo.

Primero necesita asegurarse que su servidor de Subversion está actualizado al menos a la versión 1.2. Las versiones anteriores no tienen ningún soporte de bloqueos. Si está usando el acceso file://, sólo necesitará actualizar sus clientes, por supuesto.

The Three Meanings of Lock

In this section, and almost everywhere in this book, the words lock and locking describe a mechanism for mutual exclusion between users to avoid clashing commits. Unfortunately, there are two other sorts of lock with which Subversion, and therefore this book, sometimes needs to be concerned.

The second is working copy locks, used internally by Subversion to prevent clashes between multiple Subversion clients operating on the same working copy. Usually you get these locks whenever a command like update/commit/... is interrupted due to an error. These locks can be removed by running the cleanup command on the working copy, as described in “Limpieza”.

And third, files and folders can get locked if they're in use by another process, for example if you have a word document opened in Word, that file is locked and can not be accessed by TortoiseSVN.

You can generally forget about these other kinds of locks until something goes wrong that requires you to care about them. In this book, lock means the first sort unless the contrary is either clear from context or explicitly stated.

Cómo trabaja el bloqueo en Subversion

Por defecto, nada se bloquea y todo el mundo que tiene acceso de confirmación puede confirmar cambios a cualquier archivo en cualquier momento. Los demás actualizarán sus copias de trabajo periódicamente y los cambios en el repositorio se fusionarán con los cambios locales.

Si Obtiene un Bloqueo en un archivo, entonces sólo usted puede confirmar ese archivo. Las confirmaciones de los demás se bloquearán hasta que quite el bloqueo. Un archivo bloqueado no puede ser modificado de ninguna forma en el repositorio, por lo que no puede ser siquiera borrado o renombrado, excepto por el dueño del bloqueo.

Importante

Un bloqueo no se asigna a un usuario específico, sino a un usuario específico y a una copia de trabajo. Tener un bloqueo en una copia de trabajo también impide al mismo usuario hacer un commit del fichero bloqueado desde otra copia de trabajo.

Por poner un ejemplo, imagina que el usuario Jon tiene un copia de trabajo en el PC de su oficina. Allí empieza a trabajar en una imagen, y por lo tanto adquiere el bloqueo de ese fichero. Cuando deja su oficina aún no ha terminado con ese fichero, por lo que no libera dicho bloqueo. De vuelta a casa Jon también tiene una copia de trabajo y decide trabajar un poco más en el proyecto. Pero no puede modificar o hacer un commit de ese fichero de imagen, puesto que el bloqueo para el fichero se encuentra en la copia de trabajo de su oficina.

Sin embargo, los demás usuarios no necesariamente saben que usted ha obtenido un bloqueo. A menos que ellos comprueben el estado de bloqueo regularmente, la primera vez que sabrán sobre él es cuando sus confirmaciones fallen, lo que muchas veces no es muy útil. Para hacer más fácil el manejo de bloqueos, hay una nueva propiedad de Subversion svn:needs-lock. Cuando se establece esta propiedad (a cualquier valor) en un archivo, siempre que el archivo se obtiene o actualiza, la copia local se deja como sólo-lectura a menos que la copia de trabajo tenga un bloqueo para ese archivo. Esto actúa como una advertencia indicando que no debería modificar el archivo a menos que obtenga un bloqueo. Los archivos que están versionados y marcados como sólo-lectura se marcan con un ícono superpuesto especial en TortoiseSVN para indicar que necesita obtener un bloqueo antes de editar.

Los bloqueos se graban con el lugar de la copia local y también con el propietario. Si tiene varias copias de trabajo (en casa, en el trabajo) entonces sólo puede obtener un bloqueo en una de esas copias de trabajo.

Si uno de sus compañeros de trabajo obtiene un bloqueo y luego se va de vacaciones sin quitarlo, ¿qué hace? Subversion proporciona un método para forcar bloqueos. Quitar un bloqueo que tiene otra persona se define como Romper el bloqueo, y obtener forzosamente un bloqueo que tiene otro se define como Robar el bloqueo. Naturlamente estas no son cosas que hacer a la ligera si desea continuar siendo amigo de sus compañeros de trabajo.

Los bloqueos se guardan en el repositorio, y se crea un token de bloqueo en su copia local de trabajo. Si hay una discrepancia, por ejemplo si alguien ha roto el bloqueo, el token local se convierte en inválido. El repositorio siempre es la referencia definitiva.

Obteniendo un bloqueo

Seleccione el archivo o archivos en su copia de trabajo para los que desee obtener un bloqueo, y seleccione el comando TortoiseSVNObtener Bloqueo....

Figura 4.61. El diálogo Bloquear

El diálogo Bloquear


Aparece un diálogo, que le permite introducir un comentario, para que los demás vean por qué ha bloqueado el archivo. El comentario es opcional, y de momento sólo se utiliza con repositorios basados en Svnserve. Si (y sólo si) necesita robar el bloqueo de alguien, marque la casilla Robar bloqueo, y luego pulse Aceptar.

Puede activar la propiedad tsvn:logtemplatelock para proporcionar una plantilla de mensaje para que la rellenen los usuarios como el mensaje del bloqueo. Consulte “Configuración del proyecto” para las instrucciones sobre cómo activar las propiedades.

Si selecciona una carpeta y luego utiliza TortoiseSVNObtener Bloqueo... se abrirá el diálogo de bloquear con todos los archivos en todas las subcarpetas seleccionados para bloquearlos. Si realmente quiere bloquear una jerarquía completa, ésta es la forma de conseguirlo, pero puede ganarse la antipatía de sus compañeros de trabajo si les bloquea todo el proyecto. Utilícelo con cuidado...

Quitando un bloqueo

Para asegurarse que no se olvida de quitar un bloqueo que no necesita más, los archivos bloqueados se muestran en el diálogo de confirmar y se seleccionan por defecto. Si continúa con la confirmación, los bloqueos que tenga sobre los archivos seleccionados se quitan, incluso si los archivos no se han modificado. Si no desea quitar el bloqueo en algunos archivos, puede desmarcarlos (si no están modificados). Si desea mantener los bloqueos en un archivo que ha modificado, tiene que habilitar la casilla Mantener bloqueos antes de confirmar sus cambios.

Para quitar un bloqueo manualmente, seleccione el archivo o archivos de su copia de trabajo para los que desee quitar el bloqueo, y luego seleccione el comando TortoiseSVNQuitar Bloqueo. No hay nada más que introducir por lo que TortoiseSVN contactará con el repositorio y quita los bloqueos. También puede utilizar este comando en una carpeta para quitar todos los bloqueos recursivamente.

Comprobando el estado de los bloqueos

Figura 4.62. El diálogo Comprobar modificaciones

El diálogo Comprobar modificaciones


Para ver qué bloqueos tiene usted y los de los demás, puede utilizar el comando TortoiseSVNComprobar Modificaciones.... Los tokens de bloqueos que se tienen localmente se muestran inmediatamente. Para comprobar los bloqueos que tienen los demás (y para ver si alguno de sus bloqueos se han roto o han sido robados) necesita pulsar Comprobar Repositorio.

Desde el menú contextual aquí, también puede obtener y quitar bloqueos, además de romper y robar bloqueos que tienen otros.

Evite romper y robar bloqueos

Si ha roto o robado el bloqueo de otro sin decírselo, puede causar una pérdida potencial de trabajo. Si está trabajando con tipos de archivos no fusionables y roba el bloqueo de otro, una vez que usted quite el bloqueo ellos son libres de confirmar sus cambios y sobreescribir los suyos. Subversion no pierde datos, pero ha perdido la protección para trabajo en equipo que el bloqueo le proporcionaba.

Configurando los archivos no-bloqueados como de sólo-lectura

Como se menciona arriba, la manera más efectiva de utilizar los bloqueos es establecer la propiedad svn:needs-lock en los archivos. Consulte “Configuración del proyecto” para obtener instrucciones sobre cómo establecer propiedades. Los archivos con esta propiedad establecida siempre se obtendrán y actualizarán con la marca de sólo-lectura a menos que su copia de trabajo tenga un bloqueo.

Como recordatorio, TortoiseSVN utiliza un ícono de superpuesto especial para indicarlo.

Si opera una política donde todos los archivos han de ser bloqueados, puede que encuentre más fácil utilizar la característica de Subversion auto-props para establecer la propiedad automáticamente cada vez que añada nuevos archivos. Para más información, lea “Establecer propiedades automáticamente”.

Los scripts ganchos de bloqueo

Cuando crea un nuevo respositorio con Subversion 1.2 o superior, se crean cuatro plantillas en el directorio hooks del repositorio. Éstos se llaman antes y después de obtener un bloqueo, y antes y después de quitar un bloqueo.

Es una buena idea instalar un script gancho post-lock y post-unlock en el servidor que envíe un email indicando el archivo que se ha bloqueado. Poniendo este script en su sitio, todos sus usuarios serán informados si alguien bloquea/quita el bloqueo de un archivo. Puede encontrar un script gancho de ejemplo hooks/post-lock.tmpl en su carpeta del repositorio.

También puede utilizar ganchos para no permitir romper o robar bloqueos, o quizás para limitarlo a un administrador designado para ello. O quizás desea enviar un email al propietario cuando uno de sus bloqueos se haya roto o robado.

Para más información, lea la “Scripts gancho en el lado del servidor”.