Как программно получить информацию о ветках в TFS?

Мне нужно программно узнать информацию о ветках в TFS. Например, главное, что меня интересует, это корневая папка $/MyProject/Project1. Мне нужно узнать, какие другие папки были ответвлениями от нее. Мне нужны только правильные методы API.

Скажем, у меня есть подключение к серверу TFS и доступ к экземплярам классов VersionControlServer и Workspace.


person Captain Comic    schedule 14.01.2011    source источник


Ответы (2)


Хорошо, это было и проще, и сложнее, чем я думал. Я смог собрать это вместе из нескольких разных источников, но, похоже, это работает. Предупреждаю, здесь нет обработки ошибок, и если 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);
            }                       
        }
    }
}
person Robaticus    schedule 14.01.2011
comment
Обратите внимание, что в ShowChildren вам также необходимо показать относительные элементы родителя. Так что добавьте это выше цикла Foreach. System.Console.WriteLine(string.Format(Разветвлено до {0}, parent.Relative.BranchToItem.ServerItem)); - person Craig B; 23.04.2020

Код в основном ответе не всегда возвращает все целевые ветки. В моем тестировании он вернул на одну ветвь меньше, чем диалоговое окно слияния Visual Studio.

Есть более простой и безопасный способ получить список целевых ветвей. Таким же образом 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;
    }
}

Этот код всегда возвращает тот же список, что и диалоговое окно слияния.

person Thomas F. Abraham    schedule 01.04.2014
comment
Я мог бы что-то упустить здесь, но кажется, что QueryMergeRelationships возвращает список элементов, в которых вообще есть какие-либо отношения, включая родительские отношения, в отличие от вашего именования переменных; ваш код предполагает, что вы используете корневую ветвь, а затем предоставит список всех дочерних элементов, потому что это корень. Но если вы пройдете в дочернюю ветку, она также вернет родительскую ветку, которая не будет соответствовать требованиям вопроса капитана Комика, мне нужно выяснить, какие другие папки были ответвлены от нее, что неявно означает, что только дочерние ветки требуется. - person paulyphonic; 20.04.2014
comment
Истинный. Я изменил переменные и имя метода. В API может быть способ определить, какой путь является родительским, и исключить его. - person Thomas F. Abraham; 28.04.2014