0

私がやりたいことは、マージできる利用可能なブランチを取得することです。TFS2008 でマージと言って宛先ブランチを選択するときのドロップダウンとほとんど同じです。

しかし、その方法を見つけるのは非常に困難でした。

以下のコードは、Web で見つけたいくつかのリソースをマージしたものですが、どれも機能していないようです。私の推測では、VS2008 でそれができるのであれば、SDK を介してそれを行うことができますよね?.

以下のコードでは、常に同じ結果が得られます。

私のリポジトリは次のようなものです:

Development
  Version1
    Code
  Version2
    Code
  Version3
    Code
Main
  Code

通常、メイン > バージョン X に分岐します。そのため、メイン > バージョン X とバージョン X をメインにマージできます。

以下のコードは、Version3 フォルダーで (tfsParentBranchPath) を照会している場合でも、常に Main の子を提供します。

これはおそらく、TFS2010 Web サービスを使用していたのに TFS2008 を指していたからでしょうか (そのため、コードで機能しないメソッドをいくつかマークしました)。

誰かが答えを知っているなら、私に知らせてください。

ありがとう!

 public string[] GetChildBranchesToMerge(string tfsParentBranchPath)
    {
    var versionControl = teamFoundationServer.GetService<VersionControlServer>();

    //not supported by tfs2008
    //ItemIdentifier[] identifiers = versionControl.QueryMergeRelationships(tfsParentBranchPath);
    //var allBranches = versionControl.QueryBranchObjects(new ItemIdentifier(tfsParentBranchPath), RecursionType.OneLevel);

    List<string> childs = new List<string>();
    ItemSpec[] specs = new ItemSpec[] { new ItemSpec(tfsParentBranchPath, RecursionType.OneLevel) };
    BranchHistoryTreeItem[][] branchHistoryTree = versionControl.GetBranchHistory(specs, VersionSpec.Latest);

    if (branchHistoryTree.Length > 0 && branchHistoryTree[0].Length > 0)
    {
        var treeItem = branchHistoryTree[0][0];

        if (treeItem.Children.Count > 0)
        {
            foreach (BranchHistoryTreeItem tia in treeItem.Children)
            {
                childs.Add(tia.Relative.BranchToItem.ServerItem);
            }
        }
    }

    return childs.OrderBy((s) =>
    {
        return s;
    }).ToArray();
}
4

1 に答える 1

0

最後に、これが機能する最後のバージョンです。

まず、VS2010 アセンブリの使用をやめたところ、はるかに高速になりました。

次に、大きな違いは次の行です。

var treeItem = branchHistoryTree[0][0].GetRequestedItem();

違いの理由は本当にわかりませんが、その方法がないと、返されるアイテムは一般的なものになるようです。

public string[] GetChildBranchesToMerge(string tfsParentBranchPath)
{
    DoLog("Getting child branches for {0} ...", tfsParentBranchPath);
    VersionControlServer vcs = (VersionControlServer)teamFoundationServer.GetService(typeof(VersionControlServer));

    List<string> childs = new List<string>();
    ItemSpec[] specs = new ItemSpec[] { new ItemSpec(tfsParentBranchPath, RecursionType.OneLevel) };
    BranchHistoryTreeItem[][] branchHistoryTree = vcs.GetBranchHistory(specs, VersionSpec.Latest);

    if (branchHistoryTree.Length > 0 && branchHistoryTree[0].Length > 0)
    {
        var treeItem = branchHistoryTree[0][0].GetRequestedItem();
        AddChildBranch(childs, treeItem, tfsParentBranchPath);

        if (treeItem.Children != null && treeItem.Children.Count > 0)
        {
            foreach (BranchHistoryTreeItem tia in treeItem.Children)
            {
                AddChildBranch(childs, tia, tfsParentBranchPath);
            }
        }
    }

    DoLog("{0} child branches found", childs.Count);

    return childs.OrderBy((s) =>
    {
        return s;
    }).ToArray();
}

private void AddChildBranch(List<string> list, BranchHistoryTreeItem itemToCheck, string tfsParentBranchPath)
{
    if (itemToCheck.Relative.BranchFromItem != null && itemToCheck.Relative.BranchFromItem.DeletionId == 0 && itemToCheck.Relative.BranchFromItem.ServerItem != tfsParentBranchPath)
        list.Add(itemToCheck.Relative.BranchFromItem.ServerItem);

    if (itemToCheck.Relative.BranchToItem != null && itemToCheck.Relative.BranchToItem.DeletionId == 0 && itemToCheck.Relative.BranchToItem.ServerItem != tfsParentBranchPath)
        list.Add(itemToCheck.Relative.BranchToItem.ServerItem);
}
于 2012-11-16T18:25:51.740 に答える