Révisions : Numéros, Identifiants Symboliques et Dates, Oulah !

Avant de commencer, vous devriez savoir le minimum sur la manière d'identifier une révision particulière dans votre dépôt. Comme vous l'avez appris dans the section called “Révisions”, une révision est un “instantané” de votre dépôt à un moment particulier dans le temps. A mesure que vous continuez à propager des modifications et que votre dépôt grossit, vous avez besoin d'un mécanisme pour retrouver ces instantanés.

Vous indiquez ces révisions en utilisant l'option --revision (-r) suivie de la révision souhaitée (svn --revision REV) ou vous pouvez indiquer un intervalle en séparant deux révisions par deux points (svn --revision REV1:REV2). Et Subversion vous permet de faire référence à ces révisions par numéro, identifiant symbolique ou date.

Numéros de Révision

Lorsque vous créez un nouveau dépôt Subversion, il commence sa “vie” à la revision zero et chaque propagation successive incrémente de un le numéro de révision. Après chacune de vos propagations réussies, le client Subversion vous informe du nouveau numéro de révision :

$ svn commit --message "Nombre de tranches de fromage corrigé."
Sending        sandwich.txt
Transmitting file data .
Committed revision 3.

A chaque fois que vous voudrez, dans le futur, faire référence à cette révision (nous verrons comment et pourquoi vous pourriez vouloir le faire plus tard dans ce chapitre), vous pourrez le faire avec le numéro “3”.

Identifiants de Révision Symboliques

Le client Subversion est capable de reconnaître un certain nombre d'identifiants de révision symboliques. Ces identifiants peuvent être utilisés en tant qu'argument de l'option --revision à la place d'un nombre entier, et sont interprétés comme des numéros de révision spécifiques par Subversion :

Note

Chaque répertoire dans votre copie de travail contient un répertoire d'administration nommé .svn. Pour chaque fichier dans un répertoire, Subversion en garde une copie dans la zone d'administration. Cette copie est une copie non modifiée (pas de substitution de mots-clés, pas de conversion des caractères de fin de ligne, rien) du fichier tel qu'il existe dans la dernière révision (appelée la révision de “BASE”) que vous avez récupérée dans votre copie de travail en effectuant une mise à jour (update). Nous appelons ce fichier la copie originale [9] de votre fichier, et c'est toujours une copie exacte, à l'octet près, du fichier tel qu'il existe dans le dépôt.

HEAD

La dernière révision dans le dépôt.

BASE

La révision “originale” d'un élément de votre copie de travail.

COMMITTED

The last revision in which an item changed before (or at) BASE.

PREV

The revision just before the last revision in which an item changed. (Technically, COMMITTED - 1.)

Note

PREV, BASE et COMMITTED ne peuvent être utilisés que pour des chemins locaux, pas sur des URL.

Voici quelques exemples concrets d'utilisation d'identifiants de révision symboliques. Ne vous inquiétez pas si le sens des commandes vous échappe pour l'instant; nous les expliquerons plus en détail durant ce chapitre :

$ svn diff --revision PREV:COMMITTED foo.c
# affiche les derniers changements propagés pour foo.c

$ svn log --revision HEAD
# affiche l'entrée de journal de la dernière propagation dans le dépôt

$ svn diff --revision HEAD
# compare votre copie de travail (modifications locales incluses) avec
# la dernière version du dépôt

$ svn diff --revision BASE:HEAD foo.c
# compare votre “copie originale” de foo.c (sans modifications 
# locales) avec la dernière version dans le dépôt

$ svn log --revision BASE:HEAD
# affiche toutes les entrées de journal apparues depuis votre
# dernière mise à jour (svn update)

$ svn update --revision PREV foo.c
# Annule la dernière propagation effectuée pour foo.c
# (la révision dans votre copie de travail pour foo.c est décrémentée)

Ces identifiants vous permettent d'accomplir de nombreuses opérations courantes (et utiles) sans avoir à préciser un numéro de révision spécifique ou à vous souvenir de l'exacte révision de votre copie de travail.

Dates de Révision

Partout où vous pouvez utiliser un numéro de révision ou un identifiant de révision symbolique, vous pouvez aussi indiquer une date entre accolades “{}”. Vous pouvez accéder à un ensemble de changements dans le dépôt en utilisant ensemble des dates et des numéros de révision !

Voici quelques exemples de formats de date que Subversion accepte. N'oubliez pas d'utiliser des guillemets pour délimiter les dates qui contiennent des espaces.

$ svn checkout --revision {2002-02-17}
$ svn checkout --revision {15:30}
$ svn checkout --revision {15:30:00.200000}
$ svn checkout --revision {"2002-02-17 15:30"}
$ svn checkout --revision {"2002-02-17 15:30 +0230"}
$ svn checkout --revision {2002-02-17T15:30}
$ svn checkout --revision {2002-02-17T15:30Z}
$ svn checkout --revision {2002-02-17T15:30-04:00}
$ svn checkout --revision {20020217T1530}
$ svn checkout --revision {20020217T1530Z}
$ svn checkout --revision {20020217T1530-0500}
…

Lorsque vous indiquez une date en tant que révision, Subversion cherche la plus récente révision du dépôt par rapport à cette date :

$ svn log --revision {2002-11-28}
------------------------------------------------------------------------
r12 | ira | 2002-11-27 12:31:51 -0600 (Wed, 27 Nov 2002) | 6 lines
…

Vous pouvez aussi utiliser un intervalle de dates. Subversion cherchera toutes les révisions entre les dates demandées, ces dernières incluses :

$ svn log --revision {2002-11-20}:{2002-11-29}
…

Comme mentionné précédemment, vous pouvez mélanger dates et numéros de révisions :

$ svn log --revision {2002-11-20}:4040

Il existe une subtilité dans la manière qu'a Subversion de gérer les dates qui pourrait être une source de dysfonctionnement et dont les utilisateurs devraient être conscients. Etant donné que la date d'une révision est stockée en tant que propriété de révision — une propriété modifiable et non versionnée — les dates de révision peuvent être modifiées ou supprimées et donc fausser complètement la chronologie. Cela corromprait les conversions internes date/révision effectuées par Subversion.



[9] En anglais, deux termes sont utilisés pour faire référence à ce fichier : pristine copy ou text-base version (NDT)