2011-01-14 21 views
17

TFSの分岐に関する情報をプログラムで調べる必要があります。たとえば、私が興味を持っている主なものはルートフォルダ$/MyProject/Project1私は他のどのフォルダがそれから分岐しているか調べる必要があります。私は正しいAPIメソッドの直後です。TFSの分岐に関する情報をプログラムで取得する方法は?

私はTFSサーバーに接続し、VersionControlServerWorkspaceクラスインスタンスにアクセスできるとします。

答えて

22

わかりました。これは私が思ったよりも簡単で困難でした。私はこれをいくつかの異なるソースから集めることができましたが、これはうまくいくようです。私はあなたに警告します。ここではエラー処理はありません。もし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); 
      }      
     } 
    } 
} 
2

主要答えのコードでは、常にすべてのターゲット支店を返しません。私のテストでは、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; 
    } 
} 

このコードは常にマージダイアログボックスと同じリストを返します。これは、Visual Studioがマージダイアログボックスのリストを取得するのと同じ方法です。

+0

ここで何かが見つからないかもしれませんが、QueryMergeRelationshipsは変数の命名規則に反して、親関係を含む何らかの関係がある項目のリストを返します。あなたのコードはあなたがルートブランチを使用していると仮定し、それがルートであるためすべての子のリストを提供します。しかし、子ブランチを渡すと、親ブランチが返されます。これはCaptain Comicの質問の要件を満たしません。「他のフォルダが分岐しているかどうかを調べる必要があります。暗黙的には子のみ支店が必要です。 – paulyphonic

+0

真。私は変数とメソッド名を変更しました。 APIには、どのパスが親であるかを識別し、それを除外する方法があります。 –

関連する問題