Как программно получить информацию о филиалах в TFS? - PullRequest
17 голосов
/ 14 января 2011

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

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

Ответы [ 2 ]

22 голосов
/ 14 января 2011

Хорошо, это было и проще, и сложнее, чем я думал.Я смог собрать это из нескольких разных источников, но, похоже, это работает.Я предупрежу вас, здесь нет обработки ошибок, и если 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 голосов
/ 01 апреля 2014

Код в основном ответе не всегда возвращает все целевые ветви .В моем тестировании он вернул на одну ветвь меньше, чем диалоговое окно слияния 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;
    }
}

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

...