34 votes

Comment déterminez-vous le dernier numéro de révision SVN enraciné dans un répertoire ?

Je voudrais commencer à baliser mes binaires déployés avec le numéro de révision SVN le plus récent.

Cependant, étant donné que SVN est basé sur les fichiers et non sur les répertoires/projets, je dois parcourir tous les fichiers du répertoire et des sous-répertoires pour déterminer le numéro de révision le plus élevé.

Utiliser svn info à la racine ne fonctionne pas (il rapporte simplement la version de ce répertoire, pas des fichiers dans les sous-répertoires):

Je me demandais s'il existe un raccourci en utilisant la commande svn pour le faire. Sinon, quelqu'un peut-il suggérer un script simple et efficace (je préférerais qu'il n'accède pas du tout au serveur distant)?

Je comprends aussi qu'une approche alternative est de maintenir un fichier de version avec les svn:keywords. Cela fonctionne (je l'ai utilisé sur d'autres projets), mais je me lasse de devoir m'assurer que le fichier est modifié et de gérer les conflits de fusion inévitables.

Réponse J'ai réalisé que mon problème venait du fait que je n'avais pas effectué un svn up adéquat avant d'appeler svn info dans le répertoire racine:

$ svn info
Chemin: .
...
Auteur de la dernière modification: fak
Révision de la dernière modification: 713
Date de la dernière modification: 2008-08-29 00:40:53 +0300 (Ven, 29 août 2008)

$ svn up
À la révision 721.

$ svn info
Chemin: .
...
Révision: 721
Auteur de la dernière modification: reuben
Révision de la dernière modification: 721
Date de la dernière modification: 2008-08-31 22:55:22 +0300 (Dim, 31 août 2008)

24voto

Charles Miller Points 2377

Une façon. Lorsque vous consultez le code, regardez la dernière ligne de la sortie svn :

$ svn up
...trucs...
Mis à jour à la révision 66593.

Une façon plus directe :

$ svn info
Chemin: .
URL: https://svn.example.com/svn/myproject/trunk
Racine du dépôt: https://svn.example.com/svn/
UUID du dépôt: d2a7a951-c712-0410-832a-9abccabd3052
Révision: 66593
Type de nœud: répertoire
Planifié: normal
Auteur de la dernière modification : bnguyen
Révision de la dernière modification : 66591
Date de la dernière modification : 2008-09-11 18:25:27 +1000 (jeu., 11 sep 2008)

22voto

hasseg Points 5440

svnversion semble être la manière la plus propre de le faire :

svnversion -c /chemin/vers/votre-copie-de-travail-locale-de-vos-projets/. | sed -e 's/[MS]//g' -e 's/^[[:digit:]]*://'

La commande ci-dessus supprimera les lettres M et S (indiquant des modifications locales ou un changement de source) de la sortie, ainsi que le petit numéro de révision au cas où svnversion renverrait une plage plutôt qu'un seul numéro de révision (voir la documentation pour plus d'informations). Si vous ne voulez pas filtrer la sortie, supprimez le pipe et la partie sed de cette commande.

Si vous voulez utiliser svn info, vous devez utiliser l'argument "récursif" (-R) pour obtenir les infos de tous les sous-répertoires également. Comme la sortie devient alors une longue liste, vous devrez faire un peu de filtrage pour obtenir le dernier numéro de révision modifié de tous ceux qui est le plus élevé :

svn info -R /chemin/vers/votre-copie-de-travail-locale-de-vos-projets/. | awk '/^Last Changed Rev:/ {print $NF}' | sort -n | tail -n 1

Cette commande prend toutes les lignes contenant la chaîne "Last Changed Rev", puis supprime tout de chacune de ces lignes sauf le dernier champ (c'est-à-dire le numéro de révision), puis trie ces lignes numériquement et supprime tout sauf la dernière ligne, donnant ainsi juste le numéro de révision le plus élevé. Si vous utilisez Windows, je suis sûr que vous pouvez le faire assez facilement en PowerShell également, par exemple.

Pour être clair : les approches ci-dessus vous donnent le dernier numéro de révision modifié récursif du chemin dans le dépôt que votre copie de travail locale représente, pour cette copie de travail locale, sans interroger le serveur. Donc, si quelqu'un a mis à jour quelque chose dans ce chemin sur le serveur de dépôt après votre dernière svn update, cela ne sera pas reflété dans cette sortie.

Si ce que vous voulez est le dernier numéro de révision modifié de ce chemin sur le serveur, vous pouvez faire :

svn info /chemin/vers/votre-copie-de-travail-locale-de-vos-projets/.@HEAD | awk '/^Last Changed Rev:/ {print $NF}'

7voto

Sam Stokes Points 7118

Doublon de cette question. Comme je l'ai posté là-bas, la commande svnversion est votre ami. Pas besoin d'analyser la sortie, pas besoin de mettre à jour d'abord, elle fait juste le travail.

3voto

jan Points 938

Je ne sais pas si vous utilisez MSBuild (Visual Studio) pour construire vos binaires. Mais si oui : il est possible d'établir une connexion entre Subversion et MSBuild à travers MSBuild Community Tasks Project

Voici une partie de notre script de construction : notre application (C#) inclut le numéro de révision svn :

...
    AssemblyVersion="$(Major).$(Minor).$(Build).$(Revision)"
     AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)"

Jan

2voto

Blair Conrad Points 56195

Les réponses fournies par @Charles Miller et @Troels Arvin sont correctes - vous pouvez utiliser la sortie de la svn update ou svn info, mais comme vous l'indiquez, ce dernier ne fonctionne que si le dépôt est à jour. Cependant, je ne suis pas sûr de la valeur de n'importe quel numéro de révision pour vous si une partie de votre arborescence source est sur une révision différente d'une autre partie. Cela me semble vraiment comme si vous devriez travailler sur une arborescence homogène. Je suggère soit de mettre à jour avant d'exécuter info (ou si vous avez déjà mis à jour pour votre installation, vous êtes au top) ou d'utiliser svn info URL-de-la-source.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X