从变更集对象中获取 "Team project" 的名称?

Get name of "Team project" from changeset object?

我已经编写了一个服务来获取我的 TFS 上所有集合中的所有变更集。

我可以从 changeset object 中动态获取任何变更集的集合名称,但我在尝试查找变更集所在的 团队项目名称 时遇到了问题.

我能以某种方式找到变更集所属的团队项目名称吗?

    foreach (Changeset cs in allChangeSets)
    {
           if (cs.Comment != null && ChangeSetFinderMVC.Utils.TFSUtil.Contains(cs.Comment, id))
           {
                  var cso = new ChangeSetObj();
                  cso.ChangesetId = cs.ChangesetId;
                  cso.CheckinNote = cs.CheckinNote;
                  cso.Comment = cs.Comment;
                  cso.Committer = cs.Committer;
                  cso.CommitterDisplayName = cs.CommitterDisplayName;
                  cso.Collection = cs.VersionControlServer.TeamProjectCollection.Name;
                  cso.TeamProject = "????";

                  changeSetList.Add(cso);

           }
    }

由于一个变更集可能会同时应用于多个项目,因此您需要查看变更集中更改的每个项目并查看它与哪个项目相关联。

Changeset 中,您可以访问每个更改项目的 TFS 路径并查看其服务器路径。

foreach (Changeset changeSet in changeSets)
{
    foreach (Change change in changeSet.Changes)
    {
        string tfsDir = change.Item.ServerItem;
        // Example: "$/ProjectName/SomeFolders/SomeFile.cs"
        // More logic to handle this string goes here.
    }
}

如果您需要一些正则表达式来查找项目名称,请尝试以下操作:^$\/(?<Project>.+?)\/

确保您在正则表达式匹配中访问 'Project' 组。

正如@Toomaja 所说,我们可以有多个与单个变更集相关的团队项目。他的解决方案表明你总是知道你在寻找什么 TeamProjects。即使您事先知道 TeamProjects,使用正则表达式来做一些已经通过可用方法完成的事情也会缩短您的代码生命周期,并将您的解决方案保留在特定的 TeamProjects 中。我建议您使用以下更改的服务器路径获取唯一的 TeamProjects:

private IEnumerable<string> _GetUniqueTeamProjects(Changeset changeset)
    {
        //We can have many changes in files in differentes TeamProjects within the same changeset
        HashSet<string> teamProjects = new HashSet<string>();

        foreach (var ch in changeset.Changes)
        {
            //Get TeamProject using available repository access and change paths on server side.
            var tp = ch.Item.VersionControlServer.GetTeamProjectForServerPath(ch.Item.ServerItem);
            //Let the HashTable handle the unique value
            teamProjects.Add(tp.Name);
        }

        return teamProjects;
    }