How to use the TFS API to retrieve a historical version of your project
I recently had the need to retrieve several old versions of a project from TFS. Fortunately, the TFS API allows you to automate this process.
First you need to connect to the TFS Server:
TfsTeamProjectCollection tpc = new TfsTeamProjectCollection(new Uri("http://tfsserver:8080/"));
tpc.EnsureAuthenticated();
Next we will set up a workspace to use. I check first that the workspace doesn’t exist.
VersionControlServer vcs = tpc.GetService<VersionControlServer>(); //.GetAllTeamProjects(false);
string workspaceName = "temp";
string workspaceOwner = "mheath"; // your user name
// protect ourselves from using a workspace in use for something else\
Assert.Throws<WorkspaceNotFoundException>(() => vcs.GetWorkspace(workspaceName, workspaceOwner), "The workspace already exists");
var workspace = vcs.CreateWorkspace(workspaceName, workspaceOwner);
// use the workspace...
// when we are done with it...
vcs.DeleteWorkspace(workspaceName, workspaceOwner);
Now we need to map our workspace to a local temporary folder. We can use the server path to select only a subset of the code in the project (for example a single branch):
string localPath = @"D:\TFS\Temp";
string requestPath = "$/MyProject/Dev/Source";
// protect ourselves from accidentally overwriting something important
Assert.IsFalse(Directory.Exists(localPath), "directory should not exist before this test is run");
Directory.CreateDirectory(localPath);
workspace.Map(requestPath, localPath);
Finally we are ready to make a request. We use a VersionSpec
to specify which version we want. I am using a DateVersionSpec
here, but you can use a ChangeVersionSet
or a LabelVersionSet
if you prefer. The ItemSpec
specifies what to get. We want everything in our request path including subfolders, so recursion is turned on:
var version = new DateVersionSpec(new DateTime(2009, 11, 24));
var item = new ItemSpec(requestPath, RecursionType.Full);
GetRequest getRequest = new GetRequest(item, version);
GetStatus status = workspace.Get(getRequest, GetOptions.GetAll);
Assert.AreEqual(0, status.NumWarnings);
Assert.AreEqual(0, status.NumFailures);
And that is it – it is usually quite quick to retrieve as well (certainly much faster than SourceSafe was!).