TFS のブランチに関する情報をプログラムで見つける必要があります。たとえば、私が興味を持っている主なことは、ルート フォルダー$/MyProject/Project1を指定することです。そこから分岐している他のフォルダーを見つける必要があります。私は正しいAPIメソッドの直後です。
TFS サーバーに接続していてVersionControlServer
、Workspace
クラス インスタンスにアクセスできるとします。
わかりました、これは私が思っていたよりも簡単で難しかったです。いくつかの異なるソースからこれをまとめることができましたが、これはうまくいくようです。警告しますが、ここにはエラー処理はありません。itemSpec が存在しない場合は、例外が発生します。
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);
}
}
}
}
主な回答のコードは、常にすべてのターゲット ブランチを返すわけではありません。私のテストでは、Visual Studio のマージ ダイアログ ボックスよりも 1 つ少ないブランチが返されました。
ターゲット ブランチのリストを取得するための、より簡単で安全な方法があります。これは、Visual Studio が [マージ] ダイアログ ボックスのリストを取得するのと同じ方法です。
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;
}
}
このコードは、[結合] ダイアログ ボックスと常に同じリストを返します。