2011-01-14 15 views
17

TFS'de şubelerle ilgili bilgileri program aracılığıyla öğrenmem gerekiyor. Mesela ilgilendiğim en önemli şey, root klasörüne $/MyProject/Project1 verilmiş ve diğer klasörlerin hangi bölümden ayrıldığını öğrenmem gerekiyor. Doğru API yöntemlerinden hemen sonra.TFS'de şubeler hakkında program aracılığıyla bilgi nasıl alınır?

TFS sunucusuyla bağlantı kurduğumu ve VersionControlServer ve Workspace sınıf örneklerine erişebileceğimi varsayalım.

cevap

22

Tamam, bu düşündüğümden daha kolay ve daha zordu. Bunu birkaç farklı kaynaktan bir araya getirebildim, ama bu işe yarıyor. Seni uyarıyorum, burada bir hata yok, ve itemSpec yoksa, bir istisna ile bombalar.

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

birincil cevap kod her zaman tüm hedef dalları döndürmez. Benim testimde, Visual Studio birleştirme iletişim kutusundan daha az bir şube verdi.

Hedef dalların listesini almak için daha basit ve güvenli bir yol var.

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; 
    } 
} 

Bu kod her zaman birleştirme iletişim kutusu olarak aynı listeyi verir: Bu, Visual Studio Birleştirme iletişim kutusu için listesini aldığı aynı yoldur.

+0

Burada bir şey eksik olabilir, ancak QueryMergeRelationships, değişken adlandırma uygulamanızın aksine bir ana ilişki de dahil olmak üzere, herhangi bir ilişkinin bulunduğu öğelerin listesini döndürür; kodunuz kök dalını kullandığınızı varsayar ve daha sonra tüm çocukların listesini sağlar, çünkü bu köktür. Ama eğer bir çocuk dalını geçerseniz, aynı zamanda, Kaptan Comic'in sorusunun gerekliliklerini yerine getirmeyecek olan ebeveyn dalını da geri getirecektir, “Başka hangi klasörlerin dallanmış olduğunu bulmalıyım”, ki bu sadece dolaylı olarak çocuk anlamına gelir. dallar gereklidir. – paulyphonic

+0

Doğru. Değişkenleri ve yöntem adını değiştirdim. Bir ebeveynin hangi yol olduğunu tanımlamak ve bunu hariç tutmak için API'da bir yol olabilir. –

İlgili konular