Recherche sur le blog

jeudi 4 août 2016

[Java] Log d'un repository SVN

Tout d'abord, télécharger SVNKit sur svnkit.com (lien ici). Choisir la version "standalone" puis décompresser les librairies qui se trouvent dans "\lib", à l'aide de WinRAR ou 7zip par exemple.

Ajoutez ensuite les différentes archives JAR à votre projet. Clic droit sur le projet dans Eclipse -> Properties -> Java Build Path, onglet Libraries. Cliquez sur le bouton "Add Library", choisissez "User Library". Indiquez un nom et sélectionnez les fichiers précédemment extraits. 

Dans le code, il faut réaliser les manipulations suivantes : 
DAVRepositoryFactory.setup();
On indique que l'on va interroger un repository SVN dont on renseignera l'URL, en HTTP ou HTTPS.
String ls_url = "http://xxx.com/svn/mySVN";
String ls_username = "";
String ls_password = "";
Il faut ensuite définir quelques variables dont l'URL, le nom d'utilisateur et le mot de passe. Dans le code d'exemple ils sont en dur mais on peut imaginer les récupérer par une saisie utilisateur.

On va maintenant s'identifier.
sUrl = SVNEncodingUtil.autoURIEncode(ls_url);
SVNRepository repo = SVNRepositoryFactory.create(
   SVNURL.parseURIEncoded(sUrl)); 
ISVNAuthenticationManager authManager = 
   SVNWCUtil.createDefaultAuthenticationManager(
   ls_username, ls_password.toCharArray());
repo.setAuthenticationManager(lo_authManager);
On doit donc :
  • Instancier un objet SVNRepository à l'aide de la fabrique SVNRepositoryFactory. On passe en paramètre un objet SVNURL.
  • Créer un gestionnaire d'authentification à l'aide de la classe SVNWCUtil. On passe en paramètre de la fonction le nom d'utilisateur et le mot de passe (ce dernier étant passé sous forme de tableau de caractères).
  • Une fois celui-ci créé, on le lie au repository. 
On peut savoir quelle est la dernière révision en appelant
SVNDirEntry entry = repo.info(".", -1);
Pour récupérer les entrées entre deux révisions on procède comme suit :
Collection<SVNLogEntry> colLogEntries = null;
colLogEntries = repo.log(new String[] {""}, null, 
   lStartRevision, lEndRevision, true, true);
On déclare d'abord une collection dans laquelle on pourra stocker le résultat. Ensuite, on appelle la fonction "log" sur notre repository précédemment créé. On passe en paramètre un tableau vide (chemins cible), la valeur nulle pour le second paramètre (qui attend une collection), la révision de début, la révision de fin, et deux flags ("changed paths" - pour lister tout ce qui a été modifié, et "strict node"). Voir plus de détails dans la documentation.

Astuce : on peut aussi utiliser getDatedRevision(Date date) pour retrouver un numéro de révision correspondant à la date donnée en paramètre, ou du moins proche de celle-ci.

Parcourir la collection récupérée.
for(SVNLogEntry entry : colLogEntries)
{
  System.out.println(logEntry.getRevision());
  System.out.println(logEntry.getAuthor());
  ...
}
On peut afficher différentes informations (auteur, message, numéro de révision, date). Dans cette boucle, on peut en rajouter une autre : 
Set<String> changedPathsSet = 
      logEntry.getChangedPaths().keySet();
for (String sFullPath : changedPathsSet) 
{
  SVNLogEntryPath entryPath = 
    (SVNLogEntryPath) logEntry.getChangedPaths()
     .get(sFullPath);
  System.out.println(entryPath.getPath());
  System.out.println(entryPath.getType());
  ...
}
Ce qui va permettre d'afficher les chemins des fichiers modifiés et le "type" de modification (M = modified, A = added, D = deleted). Reste à afficher tout cela de manière bien plus sympa que dans une simple console...

Et pour fermer proprement la session :
repo.closeSession();
Voilà, c'est tout pour aujourd'hui !

Aucun commentaire: