Nous avons vu en détail comment Subversion stocke et récupère les différentes versions des fichiers et répertoires dans le dépôt. Des chapitres entiers ont décrit cette fonctionnalité fondamentale de l'outil. Et si la gestion de versions se limitait à ça, Subversion couvrirait déjà complètement les besoins attendus.
Mais ce n'est pas tout.
En plus de gérer les versions de vos répertoires et de vos fichiers, Subversion fournit une interface pour ajouter, modifier et supprimer des méta-données suivies en versions pour chacun de vos répertoires et de vos fichiers. On appelle ces méta-données des propriétés. Elles peuvent être pensées comme des tableaux à deux colonnes, qui associent des noms de propriétés à des valeurs arbitraires, pour chaque élément de votre copie de travail. En termes simples, vous pouvez assigner n'importe quel nom et n'importe quelle valeur à vos propriétés, à la seule condition que le nom soit un texte lisible par un humain. Et l'atout principal de ces propriétés réside dans le fait qu'elles sont également suivies en versions, tout comme le contenu textuel de vos fichiers. Vous pouvez modifier, propager et revenir en arrière sur les propriétés aussi facilement que sur le contenu des fichiers. L'envoi et la réception des changements concernant les propriétés intervient lors de vos propagations et mises à jour : vous n'avez pas à changer vos habitudes pour les utiliser.
Note | |
---|---|
Subversion a réservé pour son propre usage les propriétés
dont le nom commence par |
Les propriétés sont aussi présentes ailleurs dans Subversion. De la même manière que pour les fichiers et répertoires, chaque révision en tant que telle peut avoir des propriétés arbitraires associées. Les mêmes contraintes s'appliquent : nom lisible par un humain et valeur arbitraire, éventuellement binaire. La différence principale est que les propriétés des révisions ne sont pas suivies en versions. Autrement dit, si vous changez la valeur ou si vous supprimez une propriété d'une révision, il n'y a pas moyen, en utilisant Subversion, de revenir à la valeur précédente.
Subversion ne fournit pas de recommandation précise quant à
l'utilisation des propriétés. Il demande seulement de ne pas
utiliser de nom de propriété qui commence par le préfixe
svn:
. C'est l'espace de noms qu'il garde pour
son propre usage. Et Subversion utilise bien lui-même les
propriétés, suivies en versions ou pas. Certaines propriétés
suivies en versions ont une signification particulière ou des
effets particuliers quand elles font référence à un fichier ou à
un répertoire, ou stockent des informations relatives à la
révision à laquelle elles font référence. Certaines propriétés de
révision sont automatiquement rattachées à une révision par la
procédure de propagation et stockent des informations relatives à
cette révision. La plupart de ces propriétés sont mentionnées
ailleurs dans ce chapitre ou dans d'autres chapitres comme faisant
partie de sujets plus généraux. Pour une liste exhaustive des
propriétés pré-définies de Subversion, référez-vous à
la section intitulée « Propriétés dans Subversion ».
Dans cette section, nous examinons l'utilité des propriétés, à la fois pour l'utilisateur et pour Subversion lui-même. Vous apprendrez les sous-commandes svn relatives aux propriétés et comment la modification des propriétés change votre manière habituelle d'utiliser Subversion.
À l'instar de Subversion, qui utilise les propriétés pour stocker des méta-données sur les fichiers, les répertoires et les révisions qu'il gère, vous pouvez faire une utilisation similaire des propriétés. Vous pouvez trouver utile d'avoir un endroit, près de vos données suivies en versions, pour stocker des méta-données relatives à vos données.
Imaginons que vous vouliez créer un site Web qui héberge beaucoup de photos et qui les affiche avec une légende et une date. D'accord, mais votre collection de photos change constamment, donc vous voulez automatiser le plus possible la gestion du site. Ces photos peuvent être relativement volumineuses et vous voulez pouvoir fournir des miniatures à vos visiteurs, comme c'est généralement le cas sur ce genre de site.
Certes, vous pouvez le faire en utilisant des fichiers
traditionnels. C'est-à-dire que vous avez votre
image123.jpg
et une
image123-thumbnail.jpg
côte à côte dans un
répertoire. Ou, si vous voulez garder les mêmes noms de fichier,
vous placez vos miniatures dans un répertoire différent, comme
thumbnails/image123.jpg
. Vous pouvez
également stocker vos légendes et dates de la même façon,
séparées encore une fois du fichier image original. Mais le
problème est que votre collection de fichiers s'agrandit de
plusieurs fichiers à chaque nouvelle photo ajoutée au
site.
Maintenant, considérons le même site Web conçu en utilisant
les propriétés des fichiers fournies par Subversion. Imaginez un
simple fichier image, image123.jpg
, et un
ensemble de propriétés relatives à ce fichier nommées
légende
, date
et même
miniature
. À présent, le répertoire de votre
copie de travail se gère beaucoup plus facilement ; en fait,
vu du navigateur, il semble ne contenir que des images. Mais vos
scripts d'automatisation vont plus loin : ils savent qu'ils
peuvent utiliser les commandes svn (ou mieux,
ils peuvent utiliser les connecteurs spécifiques au langage
utilisé, voir la section intitulée « Utiliser les API ») pour
extraire les informations dont votre site a besoin sans avoir à
lire un fichier d'index ou à jouer avec des chemins de
fichiers.
Note | |
---|---|
Bien que Subversion n'impose que peu de restrictions sur les noms et les valeurs des propriétés, il n'a pas été conçu pour gérer de façon optimale des valeurs de propriétés de grande taille ou un grand nombre de propriétés sur un fichier ou un répertoire donné. Subversion garde souvent en mémoire en même temps tous les noms et valeurs de propriétés associés à un élément, ce qui peut engendrer des problèmes de performance lors de l'utilisation de très gros ensembles de propriétés. |
On utilise également fréquemment des propriétés de révisions
personnalisées. Une utilisation classique est d'avoir une
propriété qui contient un identifiant en provenance d'un autre
outil de gestion et de l'associer à une révision. Par exemple,
l'outil de gestion est utilisé pour suivre les bogues et la
révision corrige le bogue associé à l'identifiant. Il s'agit
parfois aussi d'utiliser des noms plus conviviaux pour les
révisions : il peut être difficile de se remémorer que la
révision 1935 correspond à une révision qui a subi la totalité
des tests, alors qu'une propriété
resultat-des-tests
avec la valeur
tout ok
est autrement plus utile.
La commande svn offre différentes possibilités pour ajouter ou modifier des propriétés sur les fichiers et les répertoires. Pour les propriétés avec des valeurs courtes, lisibles par un humain, la solution la plus simple est sûrement de spécifier le nom de la propriété et sa valeur en ligne de commande avec la sous-commande svn propset :
$ svn propset copyright '(c) 2006 Red-Bean Software' calc/bouton.c Propriété 'copyright' définie sur 'calc/bouton.c' $
Mais nous avons vanté la souplesse de Subversion pour
spécifier les valeurs des propriétés. Ainsi, si vous envisagez
d'avoir des valeurs de plusieurs lignes de texte, ou même une
valeur binaire, la passer en ligne de commande ne vous convient
pas. La sous-commande svn propset accepte donc
l'option --file
(-F
) pour
spécifier le nom d'un fichier qui contient la nouvelle valeur de
la propriété.
$ svn propset licence -F /chemin/vers/LICENCE calc/bouton.c Propriété 'licence' définie sur 'calc/bouton.c' $
Il y a quelques restrictions sur les noms de propriétés. Un
nom de propriété doit commencer par une lettre, le caractère
deux points (:
), ou le caractère souligné
(_
) ; ensuite, vous pouvez utiliser des
chiffres, des tirets (-
) et des points
(.
)
[9].
En plus de la commande propset,
svn dispose de la commande
propedit. Cette commande utilise l'éditeur de
texte pré-configuré (reportez-vous à la section intitulée « Fichier config
») pour ajouter ou
modifier des propriétés. Quand vous exécutez la commande,
svn lance votre éditeur de texte avec un
fichier temporaire qui contient la valeur actuelle de la
propriété (ou un contenu vierge si vous ajoutez une nouvelle
propriété). Vous pouvez alors modifier la valeur dans l'éditeur
de texte pour y placer votre nouvelle valeur, sauvegarder le
fichier temporaire et quitter l'éditeur. Si Subversion détecte
que la valeur a effectivement changé, il la prend en compte. Si
vous quittez l'éditeur sans faire de changement, la propriété
n'est pas modifiée :
$ svn propedit copyright calc/bouton.c ### sortez de l'éditeur sans faire de modification Pas de modification de la propriété 'copyright' sur 'calc/bouton.c' $
Vous pouvez noter que, à l'instar des autres commandes svn, celles relatives aux propriétés fonctionnent aussi sur des chemins multiples. Vous pouvez ainsi modifier les propriétés d'un ensemble de fichiers en une seule commande. Par exemple, nous aurions pu taper :
$ svn propset copyright '(c) 2006 Red-Bean Software' calc/* Propriété 'copyright' définie sur 'calc/Makefile' Propriété 'copyright' définie sur 'calc/bouton.c' Propriété 'copyright' définie sur 'calc/entier.c' … $
Toutes ces manipulations de propriétés ne seraient pas vraiment utiles si vous ne pouviez pas récupérer facilement la valeur d'une propriété. Subversion propose donc deux sous-commandes pour afficher les noms et les valeurs des propriétés associées aux fichiers et répertoires. La commande svn proplist fournit la liste des noms de propriétés qui existent dans un chemin. Une fois que vous connaissez les noms des propriétés d'un élément, vous pouvez obtenir les valeurs correspondantes avec la commande svn propget. Cette commande affiche sur la sortie standard la valeur de la propriété dont le nom et le chemin (ou l'ensemble des chemins) ont été passés en paramètres.
$ svn proplist calc/bouton.c Propriétés sur 'calc/bouton.c': copyright licence $ svn propget copyright calc/bouton.c (c) 2006 Red-Bean Software $
Il y a même une variante de la commande
proplist qui liste à la fois le nom et la
valeur de toutes les propriétés. Ajoutez simplement l'option
--verbose
(-v
) à la
commande :
$ svn proplist -v calc/bouton.c Propriétés sur 'calc/bouton.c': copyright : (c) 2006 Red-Bean Software license : ================================================================ Copyright (c) 2006 Red-Bean Software. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the recipe for Fitz's famous red-beans-and-rice. …
La dernière sous-commande relative aux propriétés est propdel. Puisque Subversion vous autorise à stocker des propriétés avec une valeur vide, vous ne pouvez pas supprimer une propriété en utilisant svn propedit ou svn propset. Par exemple, la commande suivante ne fournit pas le résultat escompté :
$ svn propset licence calc/bouton.c Propriété 'licence' définie sur 'calc/bouton.c' $ svn proplist -v calc/bouton.c Propriétés sur 'calc/bouton.c': copyright : (c) 2006 Red-Bean Software licence : $
Vous devez utiliser la sous-commande propdel pour supprimer complètement une propriété. La syntaxe est similaire aux autres commandes sur les propriétés :
$ svn propdel license calc/bouton.c Propriété 'licence' supprimée de 'calc/bouton.c'. $ svn proplist -v calc/bouton.c Propriétés sur 'calc/bouton.c': copyright : (c) 2006 Red-Bean Software $
Vous souvenez-vous des propriétés de révision non suivies en
versions ? Vous pouvez les modifier elles-aussi en
utilisant les mêmes sous-commandes svn que
nous venons de décrire. Il suffit juste d'ajouter l'option
--revprop
à la ligne de commande et de spécifier
la révision à laquelle s'applique la modification. Puisque les
numéros de révisions s'appliquent à l'ensemble de l'arborescence,
vous n'avez pas besoin d'indiquer un chemin pour ces commandes,
du moment que vous êtes dans une copie de travail du dépôt
contenant la révision dont vous voulez modifier la propriété.
Autrement, vous pouvez simplement fournir n'importe quelle URL
du dépôt en question (y compris l'URL racine). Par exemple,
imaginons que vous vouliez remplacer le message associé à la
propagation d'une révision précédente
[10].
Si le répertoire actuel fait partie de votre copie de travail du
dépôt, vous pouvez simplement lancer la commande
svn propset sans spécifier de
chemin :
$ svn propset svn:log '* bouton.c: Corrige un avertissement du compilateur.' -r11 --revprop Nouvelle valeur définie pour la propriété 'svn:log' à la révision du dépôt '11' $
Et même si vous n'avez pas extrait de copie de travail du dépôt, vous pouvez toujours modifier la propriété en indiquant l'URL racine du dépôt :
$ svn propset svn:log '* bouton.c: Corrige un avertissement du compilateur.' -r11 --revprop \ http://svn.exemple.com/depot/projet Nouvelle valeur définie pour la propriété 'svn:log' à la révision du dépôt '11' $
Notez que le droit de modifier cette propriété non suivie en versions doit être explicitement ajouté par l'administrateur du dépôt (voir la section intitulée « Correction des messages de propagation »). En effet, la propriété n'étant pas suivie en versions, vous risquez une perte d'informations si vous la modifiez à tort et à travers. L'administrateur du dépôt peut mettre en place des protections contre ce type d'incident et, par défaut, la modification de propriétés non suivies en versions est désactivée.
Astuce | |
---|---|
Dans la mesure du possible, il est recommandé d'utiliser svn propedit au lieu de svn propset. Bien que le résultat soit identique, la première permet de visualiser la valeur actuelle de la propriété que l'on veut modifier, ce qui aide à vérifier que l'on fait bien ce que l'on pense faire. C'est particulièrement vrai dans le cas des propriétés non suivies en versions. Il est aussi beaucoup plus facile de modifier un texte de plusieurs lignes dans un éditeur de texte qu'en ligne de commande. |
Maintenant que vous êtes familier avec toutes les sous-commandes svn relatives aux propriétés, voyons comment la modification des propriétés change le cycle habituel d'utilisation de Subversion. Comme mentionné précédemment, les propriétés des fichiers et répertoires sont suivies en versions, à l'instar du contenu des fichiers. En conséquence, Subversion offre les mêmes possibilités pour fusionner (proprement ou quand apparaissent des conflits) vos modifications avec celles des autres collaborateurs.
De même que pour le contenu des fichiers, les modifications de propriétés sont locales. Elles ne deviennent permanentes que quand vous les propagez dans le dépôt via svn commit. Vos modifications sur les propriétés peuvent aussi être annulées facilement : la commande svn revert restaure vos fichiers et répertoires dans leur état d'avant les modifications, y compris pour les propriétés. Vous pouvez également obtenir des informations intéressantes sur l'état des propriétés de vos fichiers et répertoires en utilisant les commandes svn status et svn diff.
$ svn status calc/bouton.c M calc/bouton.c $ svn diff calc/bouton.c Modification de propriétés sur calc/bouton.c ___________________________________________________________________ Ajouté: copyright + (c) 2006 Red-Bean Software $
Remarquez que la sous-commande status
place le M
dans la deuxième colonne plutôt
que dans la première. C'est parce que nous avons modifié les
propriétés de calc/bouton.c
, mais pas son
contenu. Si nous avions changé les deux, nous aurions vu le
M
dans la première colonne également
(reportez-vous à la section intitulée « Avoir une vue d'ensemble des changements
effectués »).
Vous avez peut-être remarqué que Subversion affiche les différences au niveau des propriétés d'une manière non standard. Certes, vous pouvez toujours rediriger la sortie de svn diff pour créer un fichier correctif utilisable : le programme patch ignore ce qui concerne les propriétés (comme il ignore tout ce qu'il ne comprend pas). Malheureusement, cela signifie aussi que pour appliquer intégralement un correctif généré par svn diff, les modifications concernant les propriétés doivent être faites à la main.
Les propriétés constituent une fonctionnalité très puissante de Subversion et sont un élément central de nombreuses fonctionnalités de Subversion présentées ailleurs dans ce chapitre ainsi que dans les autres chapitres : comparaisons et fusions textuelles, substitution de mots-clés, transformation des retours à la ligne, etc. Mais pour profiter pleinement des propriétés, il faut les placer sur les répertoires et fichiers adéquats. Malheureusement, cette étape peut passer à la trappe dans le train-train quotidien, d'autant plus qu'oublier de configurer une propriété n'engendre généralement pas une erreur qui saute aux yeux (du moins comparativement à oublier d'ajouter un fichier dans la gestion de versions). Pour vous aider à placer vos propriétés au bon endroit, Subversion propose deux fonctionnalités simples mais néanmoins utiles.
Au moment d'introduire un fichier en suivi de versions à
l'aide de la commande svn add ou
svn import, Subversion essaie de vous aider
en configurant automatiquement certaines propriétés communes des
fichiers. D'abord, sur les systèmes d'exploitation dont le
système de fichiers utilise un bit « exécutable »,
Subversion ajoute automatiquement la propriété
svn:executable
aux nouveaux fichiers, ajoutés
ou importés, qui ont ce bit activé (voir la section intitulée « Fichiers exécutables ou non » pour plus de
détails sur cette propriété).
Ensuite, Subversion essaie de déterminer le type MIME du
fichier. Si vous avez configuré le paramètre
mime-types-files
, Subversion essaie de
trouver un type MIME correspondant à l'extension du nom de
fichier. Si un tel type MIME existe, il définit
automatiquement la propriété svn:mime-type
avec la valeur du type trouvé. S'il ne trouve pas de type MIME
correspondant ou s'il n'existe pas de fichier définissant les
correspondances, Subversion applique une heuristique très basique
pour déterminer si le contenu du fichier est lisible par un
humain. Si le résultat est négatif, Subversion ajoute
automatiquement la propriété svn:mime-type
à
ce fichier avec la valeur
application/octet-stream
(type MIME générique
indiquant « une suite d'octets »). Bien sûr, si
Subversion se trompe ou si vous voulez indiquer un type plus
précis (par exemple image/png
ou
application/x-shockwave-flash
), vous pouvez
toujours supprimer ou modifier cette propriété (pour d'avantage
d'informations sur la gestion des types MIME par Subversion,
reportez-vous à la section intitulée « Type de contenu des fichiers » plus loin dans
ce chapitre).
Subversion fournit également, via sa zone de configuration
(voir la section intitulée « Zone de configuration des exécutables »), une fonction de
renseignement automatique des propriétés, plus flexible, qui vous
permet de créer des associations entre, d'une part, des motifs de
noms de fichiers et, d'autre part, des noms de
propriétés / valeurs de propriétés. Là encore, ces
associations modifient le comportement des commandes
add et import, pouvant non
seulement passer outre la décision prise par défaut d'attribution
d'une propriété de type MIME mais pouvant aussi définir d'autres
propriétés, qu'elles soient utilisées par Subversion ou
personnalisées. Par exemple, vous pouvez créer une association
qui, à chaque ajout d'un fichier JPEG (c'est-à-dire dont le nom
est du type *.jpg
), fixe la propriété
svn:mime-type
de ce fichier à la valeur
image/jpeg
. Ou alors affecte à tout fichier
de type *.cpp
la propriété
svn:eol-style
avec la valeur
native
et la propriété
svn:keywords
avec la valeur
Id
. L'affectation automatique de propriétés
est sûrement l'outil de manipulation des propriétés le plus
commode de tout Subversion. Reportez-vous à la section intitulée « Fichier config
» pour plus
d'informations sur la configuration de cette fonction.
[9] Pour ceux qui connaissent le XML, c'est à peu près le sous-ensemble ASCII pour la syntaxe du champ "Name" en XML.
[10] Corriger les fautes d'orthographe, les erreurs de
grammaire et les informations simplement erronées au sein
des messages de propagation est peut-être l'usage le plus
courant de l'option --revprop
.