I need to programmatically find out information about branches in TFS. For instance the main thing i am interested is given root folder $/MyProject/Project1
The code in the primary answer does not always return all target branches. In my testing, it returned one fewer branch than did the Visual Studio merge dialog box.
There is a simpler and safer way to get the list of target branches. This is the same way that Visual Studio obtains the list for the Merge dialog box:
using System;
using System.Collections.Generic;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
class Program
{
static void Main(string[] args)
{
string tfsUri = "http://tfs:8080/tfs/MyCollection";
string tfsItemSpec = "$/MyTeamProject/Folder";
List<string> branches = GetPathsEligibleForMerge(tfsUri, tfsItemSpec);
foreach (string branch in branches)
{
Console.WriteLine(branch);
}
}
public static List<string> GetPathsEligibleForMerge(
string tfsUri, string tfsBranchPath)
{
List<string> tfsEligibleMergePaths = new List<string>();
using (TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(new Uri(tfsUri)))
{
VersionControlServer vcs =
(VersionControlServer)tfs.GetService(typeof(VersionControlServer));
foreach (ItemIdentifier mergeItem in vcs.QueryMergeRelationships(tfsBranchPath))
{
if (!mergeItem.IsDeleted && !string.IsNullOrWhiteSpace(mergeItem.Item))
{
tfsEligibleMergePaths.Add(mergeItem.Item);
}
}
}
tfsEligibleMergePaths.Sort(StringComparer.OrdinalIgnoreCase);
return tfsEligibleMergePaths;
}
}
This code always returns the same list as the Merge dialog box.
Ok, this was both easier and more difficult than I thought it would be. I was able to pull this together from a few different sources, but this seems to work. I will warn you, there's no error handling here, and if the itemSpec doesn't exist, it bombs with an exception.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
static void Main(string[] args)
{
TfsTeamProjectCollection tfs = new TfsTeamProjectCollection(
new Uri("http://tfs:8080"));
string srcFolder = "$/ProjectName";
var versionControl = tfs.GetService<VersionControlServer>();
ItemSpec[] specs = new ItemSpec[]{new ItemSpec(srcFolder, RecursionType.None)};
System.Console.WriteLine(string.Format("Source folder {0} was branched to:",
srcFolder));
BranchHistoryTreeItem[][] branchHistory =
versionControl.GetBranchHistory(specs, VersionSpec.Latest);
foreach (BranchHistoryTreeItem item in branchHistory[0][0].Children)
{
ShowChildren(item);
}
System.Console.WriteLine();
System.Console.WriteLine("Hit Enter to continue");
System.Console.ReadLine();
}
static void ShowChildren(BranchHistoryTreeItem parent)
{
foreach (BranchHistoryTreeItem item in parent.Children)
{
System.Console.WriteLine(
string.Format("Branched to {0}",
item.Relative.BranchToItem.ServerItem));
if (item.Children.Count > 0)
{
foreach(BranchHistoryTreeItem child in item.Children)
{
ShowChildren(child);
}
}
}
}