Depuis quelques temps, je travaille en utilisant de nouveaux outils et l'un d'entre eux est TFS (... Je sais, je sais, ça fait longtemps que ça existe ! Mais, j'utilisais SVN Stick out tongue).
Devant assurer le suivi et le support d'un projet d'un consultant qui a fini sa mission, je me suis mis à la recherche de toutes les documentations de ce projet en interne... Malheureusement rien Sad. Une des particularités de ce projet vient du fait aussi que, ce qu'il a développé , est un patch/correctif pour une application existante... Donc, il a modifié des fichiers de l'application principale, et malheureusement aussi, sans avoir laissé de changelog ou de traces écrites. La seule façon pour moi de voir quels sont les fichiers impactés et de savoir était donc de regarder l'historique dans TFS.

Etant donné la grande quantité d'historique et de modifications faites, et afin de mieux cibler quels fichiers j'allais pouvoir modifier, j'ai développé un tout petit script permettant de récupérer l'historique d'un projet vers un fichier csv (que je vais trier manuellement). Pourquoi ai je procédé ainsi ? Parce que, je n'ai pas trouvé la possibilité de générer via TFS un simple report d'historique ...

Voici la liste des namespaces nécessaires :

using System;
using System.Collections;
using System.IO;
using System.Net;

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;


Pour les 2 derniers, il est indispensable que vous ayez installé le SDK de TFS. (Trouvable via le SDK de Visual Studio).

Ensuite, voici le bout de code permettant d'arriver à votre fin (récupérer l'historique d'un projet) :

TeamFoundationServer tfsServer = new TeamFoundationServer("TFSServerAddress", CredentialCache.DefaultCredentials);
VersionControlServer vcs = (VersionControlServer)tfsServer.GetService(typeof(VersionControlServer));

String bp = "$/Projects/MySubProjects";
String output = @"D:\tfs_report.csv";

IEnumerable cs = vcs.QueryHistory(bp, VersionSpec.Latest, 0, RecursionType.Full, null /* ou alors, le nom d'un utilisateur */, null, null, Int32.MaxValue, true, true);

try {
    using (StreamWriter sw = new StreamWriter(output, false)) {
sw.WriteLine("ChangeSet;User;Date;Comments;ItemId;FileName;Folder;Changes;ItemType");
   foreach (Changeset c in cs)
   {
       if (c.Changes.Length > 0)
       {
         foreach (Change ch in c.Changes) {
           sw.Write("{0};{1};{2};{3};", c.ChangesetId, c.Committer, c.CreationDate, c.Comment);
           sw.Write("{0};{1};{2};{3};{4}", ch.Item.ItemId, Path.GetFileName(ch.Item.ServerItem), Path.GetDirectoryName(ch.Item.ServerItem), ch.ChangeType, ch.Item.ItemType);
           sw.WriteLine();
         }
       }
   }
  }
}
catch (Exception ex) {
    throw ex;
}


Il existe surement d'autres outils permettant de le faire plus rapidement ou d'autres méthodes, mais, c'est la plus rapide qui m'est venue à l'esprit! Smile

Voilà ! Bonne fin de journée.

A +