integrating external systems with TFS
Recently, we need to integrate external systems with TFS. TFS is a feature-rich system and has a large API. The TFS sample on MSDN only scratch the top surface. Fortunately, a couple of good blog posts get me on the write direction:
- Team Foundation Version Control client API example for TFS 2010 and newer
- Team Foundation Server API: Programmatically Downloading Files From Source Control
The key is to use the VersionControlService. We need to reference the following assemblies:
Microsoft.TeamFoundation.Client.dll
Microsoft.TeamFoundation.Common.dll
Microsoft.TeamFoundation.VersionControl.Client.dll
Microsoft.TeamFoundation.VersionControl.Common.dll
The code would be something like:
using Microsoft.TeamFoundation.Client; using Microsoft.TeamFoundation.Framework.Common; using Microsoft.TeamFoundation.Framework.Client; using Microsoft.TeamFoundation.VersionControl.Client; ... TfsTeamProjectCollection pc = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(tfsUri); VersionControlServer vcs = pc.GetService();
Then to check whether a file exists, we can use:
vcs.ServerItemExists(myPath, ItemType.File)
Or check if a directory exists:
vcs.ServerItemExists(myPath, ItemType.Folder)
To get a list of directories or files, we can use the GetItems method. TFS is far more complicated than a file system. We can get a file, get the history of a file, get a changeset, etc. Therefore, the GetItems method has many overloads. To get a list files, we can use:
var fileSet = vcs.GetItems(myPath, VersionSpec.Latest, RecursionType.OneLevel, DeletedState.NonDeleted, ItemType.File); foreach (Item f in fileSet.Items) { Console.WriteLine(f.ServerItem); }
Or get a list of directories:
var dirSet = vcs.GetItems(myPath, VersionSpec.Latest, RecursionType.OneLevel, DeletedState.NonDeleted, ItemType.Folder); foreach (Item d in dirSet.Items) { Console.WriteLine(d.ServerItem); }