Verrouiller

Subversion fonctionne généralement mieux sans verrouillage, en utilisant les méthodes « Copier-Modifier-Fusionner » décrites précédemment dans la section intitulée « La solution Copier-Modifier-Fusionner ». Cependant il y a quelques cas où vous pouvez devoir appliquer une certaine forme de politique de verrouillage.

Premièrement, vous devez vous assurer que votre serveur Subversion est mis à jour au moins à la version 1.2. Les versions antérieures ne supportent pas du tout le verrouillage. Si vous utilisez un accès de type file://, alors bien sûr seul votre client doit être mis à jour.

Les Trois Significations de « Verrou »

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 la section intitulée « Nettoyer ».

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.

Comment le verrouillage fonctionne dans Subversion

Par défaut, rien n'est verrouillé et quiconque a un accès en livraison peut livrer des modifications de n'importe quel fichier à tout moment. Les autres mettront à jour leurs copies de travail périodiquement et les modifications du dépôt seront fusionnées avec les modifications locales.

Si vous obtenez un verrou sur un fichier, alors vous seul pouvez livrer ce fichier. Les livraisons des autres utilisateurs seront bloquées jusqu'à ce que vous retiriez le verrou. Un fichier verrouillé ne peut être modifié d'aucune façon dans le dépôt, il ne peut donc pas non plus être supprimé ou renommé, sauf par le propriétaire du verrou.

Important

Un verrou n'est pas assigné à un utilisateur spécifique, mais à un utilisateur spécifique et une copie de travail. Avoir un verrou sur une copie de travail empêche également le même utilisateur d'effectuer des livraisons des fichiers verrouillés depuis d'autres copies de travail.

As an example, imagine that user Jon has a working copy on his office PC. There he starts working on an image, and therefore acquires a lock on that file. When he leaves his office he's not finished yet with that file, so he doesn't release that lock. Back at home Jon also has a working copy and decides to work a little more on the project. But he can't modify or commit that same image file, because the lock for that file resides in his working copy in the office.

Toutefois, les autres utilisateurs ne sauront pas nécessairement que vous avez posé un verrou. À moins qu'ils ne vérifient le verrouillage régulièrement, ils ne le découvriront que lorsque leur livraison échouera, ce qui n'est pas très utile dans la plupart des cas. Pour rendre la gestion des verrous plus facile, il existe une nouvelle propriété Subversion svn:needs-lock. Quand cette propriété est définie (avec n'importe quelle valeur) sur un fichier, chaque fois que le fichier est extrait ou mis à jour, la copie locale est mise en lecture seule à moins que cette copie de travail ne détienne un verrou pour le fichier. Cela agit comme un avertissement de ne pas éditer ce fichier à moins que vous n'ayez d'abord posé un verrou. Les fichiers qui sont versionnés et en lecture seule sont identifiés par une coloration spéciale dans TortoiseSVN, pour indiquer que vous devez poser un verrou avant l'édition.

Les verrous sont enregistrés par emplacement de copie de travail et par propriétaire. Si vous avez plusieurs copies de travail (à la maison, au travail) alors vous ne pouvez détenir un verrou que dans une de ces copies de travail.

Si l'un de vos collègues pose un verrou et part ensuite en vacances sans le retirer, que faites-vous ? Subversion fournit un moyen de forcer les verrous. Retirer un verrou détenu par quelqu'un d'autre est décrit comme Casser le verrou et prendre de force un verrou déjà détenu par quelqu'un d'autre s'appelle Voler le verrou. Naturellement, ce ne sont pas des choses que vous devriez faire à la légère, si vous voulez rester en bons termes avec vos collègues.

Les verrous sont enregistrés dans le dépôt et un jeton de verrouillage est créé dans votre copie de travail locale. S'il y a une incohérence, par exemple si quelqu'un d'autre a cassé le verrou, le jeton de verrouillage local devient invalide. Le dépôt est toujours la référence absolue.

Obtenir un verrou

Sélectionnez les fichiers de votre copie de travail pour lesquels vous voulez un verrou, puis sélectionnez la commande TortoiseSVNObtenir un verrou....

Figure 4.59. La boîte de dialogue Verrouiller

La boîte de dialogue Verrouiller


Une boîte de dialogue apparaît, vous permettant de saisir un commentaire, pour que les autres puissent voir pourquoi vous avez verrouillé le fichier. Le commentaire est facultatif et actuellement utilisé avec les seuls dépôts basés sur Svnserve. Si (et seulement si ) vous deviez voler le verrou de quelqu'un d'autre, cochez la case Voler les verrous, cliquez ensuite sur OK.

You can set the project property tsvn:logtemplatelock to provide a message template for users to fill in as the lock message. Refer to la section intitulée « Configuration des projets » for instructions on how to set properties.

Si vous sélectionnez un dossier et utilisez ensuite TortoiseSVNObtenir un verrou... la boîte de dialogue Verrouiller s'ouvrira avec tous les fichiers de tous les sous-dossiers choisis pour les verrouiller. C'est la bonne manière de faire si vous voulez vraiment verrouiller une arborescence complète, cependant vous pourriez devenir très impopulaire auprès de vos collègues si vous les empêchez d'accéder au projet. À utiliser avec parcimonie...

Retirer un verrou

Pour vous assurer de ne pas oubliez de retirer un verrou dont vous n'avez plus besoin, les fichiers verrouillés sont affichés dans la boîte de dialogue de livraison et sélectionnés par défaut. Si vous continuez la livraison, les verrous que vous détenez sur les fichiers sélectionnés sont supprimés, même si les fichiers n'ont pas été modifiés. Si vous ne voulez pas retirer les verrous de certains fichiers, vous pouvez les décocher (s'ils ne sont pas modifiés). Si vous voulez garder un verrou sur un fichier que vous avez modifié, vous devez activer la case à cocher Garder les verrous avant de livrer vos changements.

Pour retirer un verrou manuellement, sélectionnez les fichiers de votre copie de travail dont vous voulez retirer les verrous, choisissez ensuite la commande TortoiseSVNRetirer un verrou Il n'y a rien d'autre préciser, et TortoiseSVN va communiquer avec le dépôt et retirer les verrous. Vous pouvez aussi utiliser cette commande sur un dossier pour retirer tous les verrous récursivement.

Vérifier le statut des verrous

Figure 4.60. La boîte de dialogue Vérifier les modifications

La boîte de dialogue Vérifier les modifications


Pour voir quels verrous les autres et vous détenez, vous pouvez utiliser TortoiseSVNVérifier les modifications.... Les jetons de verrouillage détenus localement s'afficheront immédiatement. Pour vérifier les verrous détenus par les autres (et voir si l'un de vos verrous est cassé ou volé) vous devez cliquer sur Vérifier le dépôt.

À partir du menu contextuel accessible ici, vous pouvez aussi bien obtenir et retirer des verrous, que casser et voler des verrous détenus par d'autres.

Évitez de casser et de voler les verrous

Si vous cassez ou volez le verrou de quelqu'un d'autre sans le lui dire, vous pourriez potentiellement causer une perte de travail. Si vous travaillez avec des types de fichier non fusionnables et que vous volez le verrou de quelqu'un d'autre, une fois que vous retirez le verrou, il est libre de livrer ses modifications et d'écraser les vôtres. Subversion ne perd pas de données, mais vous avez perdu la protection de travail d'équipe que le verrouillage vous avait donnée.

Mettre les fichiers non verrouillés en Lecture seule

Comme mentionné ci-dessus, la façon la plus efficace d'utiliser le verrouillage est de mettre la propriété svn:needs-lock sur les fichiers. Référez-vous à la section intitulée « Configuration des projets » pour les instructions sur le mode d'activation des propriétés. Les fichiers avec cette propriété activée seront toujours extraits et mis à jour avec l'attribut Lecture seule activé à moins que votre copie de travaill ne détienne un verrou.

Pour vous le rappeler, TortoiseSVN utilise une coloration spéciale pour l'indiquer.

Si vous appliquez une politique où tout fichier doit être verrouillé, vous pouvez trouver alors plus facile d'utiliser la fonctionnalité auto-props de Subversion pour activer la propriété automatiquement à chaque fois vous ajoutez de nouveaux fichiers. Lisez la section intitulée « Configuration de TortoiseSVN » pour plus d'informations.

Les scripts hook de verrouillage

Quand vous créez un nouveau dépôt avec Subversion 1.2 ou supérieur, quatre modèles de hooks sont créés dans le répertoire hooks du dépôt. Ceux-ci sont appelés avant et après l'obtention d'un verrou et avant et après le retrait d'un verrou.

C'est une bonne idée d'installer un script hook post-lock et post-unlock sur le serveur qui envoie un e-mail indiquant que le fichier a été verrouillé. Avec une tel script d'installé, tous vos utilisateurs peuvent être informés si quelqu'un verrouille/déverrouille un fichier. Vous pouvez trouver un script hook d'exemple hooks/post-lock.tmpl dans le dossier de votre dépôt.

Vous pourriez aussi utiliser des hooks pour ne pas permettre la casse ou le vol de verrous, ou peut-être les limiter à un administrateur nommé. Ou peut-être vous voulez envoyer un email au propriétaire quand l'un de ses verrous est cassé ou volé.

Lisez la section intitulée « Scripts de hook côté serveur » pour en savoir plus.