2011-01-14 11 views
17

Necesito encontrar información programáticamente sobre sucursales en TFS. Por ejemplo, lo principal que me interesa es la carpeta raíz $/MyProject/Project1 Necesito saber qué otras carpetas se han ramificado de ella. Estoy justo después de los métodos API correctos.¿Cómo obtener información programáticamente sobre sucursales en TFS?

Supongo que tengo conexión al servidor TFS y tengo acceso a las instancias de clase VersionControlServer y Workspace.

Respuesta

22

Ok, esto fue tanto más fácil y más difícil de lo que pensé que sería. Pude juntar esto de algunas fuentes diferentes, pero parece que funciona. Te advertiré, aquí no se maneja ningún error, y si el itemSpec no existe, explota con una excepción.

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

El código en la respuesta primaria no siempre devuelve todas las ramas de destino. En mi prueba, devolvió una ramificación menos que el cuadro de diálogo de combinación de Visual Studio.

Hay una forma más simple y segura de obtener la lista de ramas de destino. Se trata de la misma manera que Visual Studio obtiene la lista para el cuadro de diálogo Combinar:

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

Este código devuelve siempre la misma lista que el cuadro de diálogo Combinar.

+0

Me puede estar faltando algo aquí, pero parece que QueryMergeRelationships devuelve una lista de elementos donde existe alguna relación, incluyendo una relación principal, contrariamente a su nomenclatura variable; su código asume que está utilizando la rama raíz, y luego proporcionará una lista de todos los hijos porque es la raíz. Pero si pasa en una sucursal secundaria, también devolverá la sucursal principal, que no cumpliría con los requisitos de la pregunta del Capitán Comic: "Necesito averiguar qué otras carpetas se han ramificado a partir de ella", lo que implícitamente significa solo el hijo se requieren ramas – paulyphonic

+0

Es cierto. Modifiqué las variables y el nombre del método. Puede haber una forma en la API para identificar qué ruta es primaria y excluirla. –

Cuestiones relacionadas