Today I’ve got a question on how to get files that are associated with specific work item. The requirement behind that was to grab configuration, data and similar files that were associated to a specific change request, which was entered as a work item.
After quick binging and browsing of the Team Foundation Server SDK, I’ve got the sample below.
static void Main(string[] args) { using (TeamFoundationServer tfs = TeamFoundationServerFactory.GetServer(args[0], new UICredentialsProvider())) { tfs.EnsureAuthenticated(); WorkItemStore wiStore = (WorkItemStore)tfs.GetService(typeof(WorkItemStore)); VersionControlServer vcs = (VersionControlServer)tfs.GetService(typeof(VersionControlServer)); int workItemId; if (int.TryParse(args[1], out workItemId)) { WorkItem workItem = wiStore.GetWorkItem(workItemId); Console.WriteLine("Work item: {0}", workItem.Title); //We look for links associated with work item foreach (Link link in workItem.Links) { ExternalLink extLink = link as ExternalLink; if (extLink != null) { ArtifactId artifact = LinkingUtilities.DecodeUri(extLink.LinkedArtifactUri); //For this example I grab Changeset directly //however in the real scenario you could grab other related workitems //and this way parse entire tree up to the changeset if (String.Equals(artifact.ArtifactType, "Changeset", StringComparison.Ordinal)) { // Convert the artifact URI to Changeset object. Changeset cs = vcs.ArtifactProvider.GetChangeset(new Uri(extLink.LinkedArtifactUri)); foreach (Change change in cs.Changes) { //We want to download files only if (change.Item.ItemType == ItemType.File) { RetrieveFile(change); } } } } } Console.ReadLine(); } } } private static void RetrieveFile(Change change) { //Technically we should process the information //i.e. you should create separate folders according to the server location //to avoid the file overwriting //if folders are not present - those should be created string fileName = change.Item.ServerItem.Split('/').Last(); Console.WriteLine("Item name: {0}. Last operation {1}", fileName, change.ChangeType); change.Item.DownloadFile(@"C:MyProjectsVS10SolutionGetWIFilesttt" + fileName); }
Here go the credits: http://blogs.msdn.com/buckh/archive/2006/08/12/artifact_uri_to_changeset.aspx
A quick reminder to myself (and the others): TFS is VERY extensible. You can extend the processes, work items, reports, functionality, … just need the right tools