20 August 2013 HowTo, TFS Robert Muehsig

Passend zum letzten Blogpost “TFS API: Query Build-Definitions” möchte ich heute Team Foundation Server die letzten Changesets über die .NET API entlocken.

Der Code funktioniert allerdings nur wenn man die Version Control vom Team Foundation Server nutzt. Git basierte Projekte (welche man ganz einfach im Cloud TFS anlegen kann) haben eine andere API – dazu aber in einem späteren Blogpost. Diese APIs sind unter dem Namespace Microsoft.TeamFoundation.Git.* zu finden. Die Dokumentation ist allerdings aktuell noch in Preview.

Benötigte Assemblies

Die Assemblies die benötigt werden sind fast dieselben wie bei der Build API, wobei ich hier noch eine Assemblie zusätzlich benötige. Die Assemblies befinden sich im Visual Studio Installationsverzeichnis (C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\ReferenceAssemblies\v2.0 – für VS 2012).

Hier die Liste der Assemblies:

- Microsoft.TeamFoundation.Client.dll
- Microsoft.TeamFoundation.Common.dll
- Microsoft.TeamFoundation.VersionControl.Common.dll
- Microsoft.TeamFoundation.VersionControl.Client.dll
- Microsoft.TeamFoundation.Build.Common.dll
- Microsoft.TeamFoundation.Build.Client.dll

Achtung: Im IIS AppPool (falls man dies via einer WebApp nutzen möchte) muss “Enable 32bit Applications” aktiv sein! Die Assemblies scheinen mindestens zum Teil 32bit Assemblies zu sein bzw. ging es ohne diese Einstellung einfach nicht.

Demo Code:

In diesem Fall verwende ich die QueryHistory Methode des VersionControlServer Objekts. Vermutlich gibt es noch “effektiviere” Varianten. Der Query gibt als Resultat alle Changesets unter dem Pfad “$/Grocerylist” zurück (wobei Grocerylist ein Demo-Projekt war). Ein Parameter gibt die Zeitspanne an. Im Beispiel hole ich mir alle Changesets die im letzten Jahr gemacht wurden. Was jeder einzelne Parameter kann, weiss ich leider nicht – aber die Dokumentation vielleicht schon eher ;)

class Program
    {
        static void Main(string[] args)
        {
            TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri("https://code-inside.visualstudio.com/DefaultCollection"));

            VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer));

            //Following will get all changesets since 365 days. Note : "DateVersionSpec(DateTime.Now - TimeSpan.FromDays(20))"
            System.Collections.IEnumerable history = vcs.QueryHistory("$/Grocerylist", 
                                                                      LatestVersionSpec.Instance,
                                                                      0,
                                                                      RecursionType.Full,
                                                                      null,
                                                                      new DateVersionSpec(DateTime.Now - TimeSpan.FromDays(365)),
                                                                      LatestVersionSpec.Instance,
                                                                      Int32.MaxValue,
                                                                      false,
                                                                      false);

            foreach (Changeset changeset in history)
            {
                Console.WriteLine("Changeset Id: " + changeset.ChangesetId);
                Console.WriteLine("Owner: " + changeset.Owner);
                Console.WriteLine("Date: " + changeset.CreationDate.ToString());
                Console.WriteLine("Comment: " + changeset.Comment);
                Console.WriteLine("-------------------------------------");
            }

            Console.ReadLine();
        }
    }

Resultat:

Jedes Objekt enthält auf dem ersten Blick alle Daten die man auch über Visual Studio & co. beziehen kann – dazu WorkItems, CheckinNotes usw.

image

Über “QueryHistory” kann man als vorletzten Parameter noch angeben ob man die Changes haben möchte – so kann man auch direkt nachvollziehen was wirklich geändert wurde.

Authentifizierung

Wie bei der Build-API: Es wird der angemeldete Windows bzw. Microsoft Account genommen – ansonsten wird ein Authentifizierungsfenster angezeigt. Man kann auch die Credentials über die API mitgeben. Alles weitere in dem TFS Build Blogpost.

Fazit:

Auf den ersten Blick: Schnell, einfach und alle Daten die man benötigt.


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!